2、linux防火墙的使用(firewalld)
2.1、说明:
1、在 RHEL7 里有几种防火墙共存,firewalld、iptables,默认是使用 firewalld 来管理 netfilter 子系统,不过底层调用的命令仍然是 iptables 等。
2、Firewalld 是提供支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具。它具备对 IPv4 和 IPv6 防火墙设置的支持,
支持以太网桥,并有分离运行时间和永久性配置选择。它还具备一个通向服务或者应用程序以直接增加防火墙规则的接口。
系统提供了图像化的配置工具firewall-config、system-config-firewall, 提供命令行客户端 firewall-cmd, 用于配置 firewalld 永久性或非永久性运
行时间的改变。
3、以前的system-config-firewall/lokkit 防火墙模型是静态的,每次修改都要求防火墙完全重启。这个过程包括内核 netfilter 防火墙模块的卸载和新配
置所需模块的装载等,而模块的卸载将会破坏状态防火墙和确立的连接。相反,firewall daemon 动态管理防火墙,不需要重启整个防火墙便可应用
更改,因而也就没有必要重载所有内核防火墙模块了。不过,要使用 firewall daemon 就要求防火墙的所有变更都要通过该守护进程来实现,以确保
守护进程中的状态和内核里的防火墙是一致的。
4、firewall daemon 无法解析由 iptables 和 ebtables 命令行工具添加的防火墙规则。firewalld 和 iptables service 之间最本质的不同是,
iptables service 在 /etc/sysconfig/iptables 中储存,而 firewalld 将配置储存在 /usr/lib/firewalld/(系统配置文件,预定义配置文件)
和 /etc/firewalld/(用户配置文件) 中的各种XML文件里。使用 iptables service 每一个单独更改意味着清除所有旧有的规则和从
/etc/sysconfig/iptables 里读取所有新的规则,然而使用 firewalld 却不会再创建任何新的规则,仅仅运行规则中的不同之处,因此
firewalld 可以在运行时间内改变设置而不丢失现行连接。firewalld 有基于 CLI(命令行界面) 和基于 GUI(图形用户界面) 两种管理方式,即
firewall-cmd(终端管理工具) 和 firewall-config(图形管理工具)。
5、firewalld 跟 iptables 的区别:
(1)firewalld可以动态修改单条规则,动态管理规则集,允许更新规则而不破坏现有会话和连接,而iptables,在修改了规则后必须得全部刷新才可以生效。
(2)firewalld使用区域和服务而不是链式规则。
(3)进站:firewalld默认是拒绝的(ping和ssh不拒绝),需要设置以后才能放行。而iptables默认是允许的,需要拒绝的才去限制。
出站:firewalld、iptables 不限制。
(4)firewalld自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现。也就是说,firewalld和iptables一样,它们的作用都用于维
护规则,而真正使用规则干活的是内核的netfilter。只不过firewalld和iptables的结果以及使用方法不一样!firewalld是iptables的一个封装,可以让你更容易
地管理iptables规则。它并不是iptables的替代品,虽然iptables命令仍可用于firewalld,但建议firewalld时仅使用firewalld命令。
(5)firewalld 默认每个服务是拒绝,每个服务都需要去设置才能放行;iptables 默认是每个服务是允许,需要拒绝的才去限制。
6、firewalld 自身并不具备防火墙的功能,而是和 iptables 一样需要通过内核的 netfilter 来实现,也就是说 firewalld 和 iptables 一样,他们的作
用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过 firewalld 和 iptables 的结构以及使用方法不一样罢了。
7、firewalld 机制:
8、firewalld中常用的区域名称及策略规则:
(1)区域:
firewalld支持动态更新技术并加入了区域(zone)的概念,简单来说,区域就是firewalld预先准备了几套防火墙策略集合(策略模板),
用户可以根据生产场景的不同而选择合适的策略集合,从而实现防火墙策略之间的快速切换。
从上图我们可以看到,firewalld默认出口是全放开的。
(2)确定使用的区域:
public 是默认区域(zone)。
对于一个接收到的请求具体使用哪个 zone,firewalld 是通过下面三种方式来判断的:
source:来源地址。
Interface:接收请求的网卡。
firewalld:配置的默认区域(zone)。
这三个方式的优先级按顺序依次降低,也就是说如果按照 source 可以找到就不会再按 interface 去找,如果前两个都找不到才会使用第三个默认区域。
9、firewalld-cmd 命令(firwall-cmd 是 Linux 提供的操作 firewalld 服务的一个工具):
(1)参数:
(2)参数说明:
1)firewalld 配置的防火墙策略默认为运行时(Runtime)模式,只能临时生效,是立刻生效的,又称为当前生效模式,而且随着系统的重启会失
效。如果想让配置策略一直存在,就需要使用永久(Permanent)模式了,方法就是在 firewall-cmd 命令后面添加 --permanent 参数,这样
配置的防火墙策略就可以永久生效了。但是永久生效模式有一个特点,就是使用它设置的策略只有在系统重启后才会生效,如果想让配置策略永
久并立即生效,需要手动执行 firewall-cmd --reload 重载命令。注意,remove 掉 ssh 服务或者 ssh 端口,当前远程登陆会话不会断开,退出后
就无法远程连接了。
2)添加常用端口,默认会添加到默认的区域(如果没有修改默认区域,默认区域为 public)。
2.2、firewalld 基本操作:
1、安装 firewalld 软件:
[root@centos-test ~]# yum install -y firewalld firewall-config
2、启动 firewalld 服务:
[root@centos-test ~]# systemctl start firewalld
3、关闭 firewalld 服务:
[root@centos-test ~]# systemctl stop firewalld
4、重启 firewalld 服务:
[root@centos-test ~]# systemctl restart firewalld
5、查看 firewalld 服务状态:
[root@centos-test ~]# systemctl status firewalld
6、开启 firewalld 服务开机自启:
[root@centos-test ~]# systemctl enable firewalld
7、关闭 firewalld 服务开机自启:
[root@centos-test ~]# systemctl disable firewalld
8、查看 firewalld 服务开机自启状态:
[root@centos-test ~]# systemctl list-unit-files | grep firewalld
2.3、firewalld-cmd 一般规则:
1、查看 firewalld 服务的状态:
[root@centos-test ~]# firewall-cmd --state
running
2、列出 firewalld 服务指定域的所有设置(默认的规则):
[root@centos-test ~]# firewall-cmd --zone=public --list-all
public (active)
target: default
# 目标
icmp-block-inversion: no
# ICMP协议类型黑白名单开关(yes/no)
interfaces: eth0 eth1
# 关联的网卡接口
sources:
# 来源,可以是IP地址,也可以是mac地址
services: ssh dhcpv6-client
# 允许的服务
ports:
# 允许的目标端口,即本地开放的端口,这里添加的是公开端口,所有的IP地址都能访问。
protocols:
# 允许通过的协议
masquerade: no
# 是否允许伪装(yes/no),可改写来源IP地址及mac地址
forward-ports:
# 允许转发的端口
source-ports:
# 允许的来源端口
icmp-blocks:
# 可添加ICMP类型,当icmp-block-inversion为no时,这些ICMP类型被拒绝;当icmp-block-inversion为yes时,
# 这些ICMP类型被允许。
rich rules:
# 富规则,即更细致、更详细的防火墙规则策略,它的优先级在所有的防火墙策略中也是最高的。
3、查看当前 firewalld 服务活动的区域,并附带一个目前分配给它们的接口列表:
[root@centos-test ~]# firewall-cmd --get-active-zones
public
interfaces: eth0 eth1
4、查看 firewalld 服务默认区域:
[root@centos-test ~]# firewall-cmd --get-default-zone
public
5、查看 firewalld 服务所有可用区域:
[root@centos-test ~]# firewall-cmd --get-zones
block dmz drop external home public public trusted work
6、列出 firewalld 服务所有预设服务:
[root@centos-test ~]# firewall-cmd --get-services
# 这样将列出 /usr/lib/firewalld/services/ 中的服务器名称,注意配置文件是以服务本身命名的service-name.xml。
7、列出 firewalld 服务所有区域的设置:
[root@centos-test ~]# firewall-cmd --list-all-zones
8、设置 firewalld 服务默认区域:
[root@centos-test ~]# firewall-cmd --set-default-zone=public
9、设置 firewalld 服务网络地址到指定的区域:
[root@centos-test ~]# firewall-cmd --permanent --zone=public --add-source=172.16.1.0/24
# 凡是网段为 172.16.1.0/24 发来包将会使用 public 区域设置的规则。
# --permanent参数表示永久生效设置,如果没有指定 --zone 参数,那么会加入默认区域。
10、删除 firewalld 服务指定区域中的网络地址:
[root@centos-test ~]# firewall-cmd --permanent --zone=public --remove-source=172.16.1.0/24
11、查询、列出、添加、改变、删除 firewalld 服务指定域网络接口:
[root@centos-test ~]# firewall-cmd --get-zone-of-interface=eth0
[root@centos-test ~]# firewall-cmd --zone=public --list-interface
[root@centos-test ~]# firewall-cmd --permanent --zone=public --add-interface=eth0
[root@centos-test ~]# firewall-cmd --permanent --zone=public --change-interface=eth0
[root@centos-test ~]# firewall-cmd --permanent --zone=public --remove-interface=eth0
12、查询、列出、添加、删除 firewalld 服务中的服务:
[root@centos-test ~]# firewall-cmd --zone=public --query-service=smtp
[root@centos-test ~]# firewall-cmd --zone=public --list-service
# 查看当前zone下有哪些service
[root@centos-test ~]# firewall-cmd --permanent --zone=public --add-service=smtp
[root@centos-test ~]# firewall-cmd --permanent --zone=public --remove-service=smtp
13、查询、列出、添加、删除 firewalld 服务中的端口:
[root@centos-test ~]# firewall-cmd --zone=public --query-port=8080/tcp
[root@centos-test ~]# firewall-cmd --zone=public --list-ports
[root@centos-test ~]# firewall-cmd --permanent --zone=public --add-port=8080/tcp
[root@centos-test ~]# firewall-cmd --permanent --zone=public --remove-port=8080/tcp
# 端口既可以是一个独立端口数字,又或者端口范围,例如,5060-5062。
# 协议可以指定为 tcp 或 udp。
14、firewalld 服务应急模式:
[root@centos-test ~]# firewall-cmd --query-panic
# 查看是否为应急模式
[root@centos-test ~]# firewall-cmd --panic-on
# 打开应急模式,拒绝所有流量,远程连接会立即断开,只有本地能登陆。
[root@centos-test ~]# firewall-cmd --panic-off
# 取消应急模式,但需要 reload firewalld 后才可以远程ssh。
# 如果是远程的机器执行上面的规则会立刻断开网络连接,必须紧记不能随便执行。如果你只是虚拟机
或者物理机器登陆就可以执行来调试。
15、将同一台服务器上 80 端口的流量转发至 8080:
[root@centos-test ~]# firewall-cmd --permanent --zone=public --add-forward-port=port=80:proto=tcp:toport=8080
success
[root@centos-test ~]# firewall-cmd --reload
[root@centos-test ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports: port=80:proto=tcp:toport=8080:toaddr=
source-ports:
icmp-blocks:
rich rules:
16、防火墙可以实现伪装IP的功能,将端口转发到另外一台服务器上就会用到这个功能:
[root@centos-test ~]# firewall-cmd --zone=public --query-masquerade
# 检查是否允许伪装IP
[root@centos-test ~]# firewall-cmd --permanent --zone=public --add-masquerade
# 允许防火墙伪装IP
[root@centos-test ~]# firewall-cmd --permanent --zone=public --remove-masquerade
# 禁止防火墙伪装IP
17、将本地的 80 端口的流量转发到IP地址为 172.16.1.15 的远程服务器上的 8080 端口(目的地址转换),需要开启masquerade:
[root@centos-test ~]# firewall-cmd --permanent --zone=public --add-masquerade
[root@centos-test ~]# firewall-cmd --permanent --zone=public --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=10.0.10.15
[root@centos-test ~]# firewall-cmd --reload
[root@centos-test ~]# firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: yes
forward-ports: port=80:proto=tcp:toport=8080:toaddr=
port=80:proto=tcp:toport=8080:toaddr=10.0.10.15
source-ports:
icmp-blocks:
rich rules:
18、重载 firewalld 服务:
[root@centos-test ~]# firewall-cmd --reload
# 注意,这并不会中断已经建立的连接,如果打算中断,可以使用 --complete-reload选项。
# 如果没有去reload,list-all 命令是看不到你新设置的东西的。
2.4、firewalld-cmd 富规则设置(rich rules):
0、说明:
(1)rule :规则。
(2)family:'ipv4':指定ipv4的地址。
(3)source address='10.0.10.1':要拒绝或接受的IP,可以是IP或者是IP段。
(4)service name='ssh':指定的是ssh服务。
(5)drop:此条规则的执行方法是丢弃。
(6)reject:此条规则的执行方法是拒绝。
(7)accept:此条规则的执行方法是接受。
1、查询、禁用、删除、自定义 firewalld 服务的 ping 响应:
[root@centos-test ~]# firewall-cmd --zone=public --query-rich-rule="rule protocol value='icmp' drop"
[root@centos-test ~]# firewall-cmd --permanent --zone=public --add-rich-rule="rule protocol value='icmp' drop"
[root@centos-test ~]# firewall-cmd --permanent --zone=public --remove-rich-rule="rule protocol value='icmp' drop"
[root@centos-test ~]# firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='172.16.1.10' protocol value='icmp' accept"
# 允许172.16.1.10主机ping。
2、添加或拒绝某个IP访问ssh端口:
[root@centos-test ~]# firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='172.16.1.10' service name='ssh' accept"
[root@centos-test ~]# firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='172.16.1.0/24' port protocol='tcp' port='22' accept"
# 允许172.16.1.0/24网段的主机访问22端口。
[root@centos-test ~]# firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='172.16.1.10' service name='ssh' reject"
[root@centos-test ~]# firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='172.16.1.10' service name='ssh' drop"
# reject 和 drop 的效果是一样的。
3、列出所有多语言规则:
firewall-cmd --zone=public --list-rich-rules
4、允许172.16.1.10主机所有连接:
firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='172.16.1.10' accept"
5、每分钟允许2个新连接访问ftp服务:
firewall-cmd --permanent --zone=public --add-rich-rule="rule service name='ftp' limit value='2/m' accept"
6、同意新的 IPv4 和 IPv6 连接 FTP,并使用审核每分钟登录一次:
firewall-cmd --permanent --zone=public --add-rich-rule="rule service name='ftp' log limit value='1/m' audit accept"
7、允许172.16.1.0网段中的主机访问ftp服务:
firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='172.16.1.0/24' service name='ftp' accept"
8、将来自172.16.1.0/24网段访问本地8080端口的流量转发到172.16.1.208主机的80端口(源地址转换):
firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='172.16.1.0/24' forward-port port='8080' protocol='tcp' to-port='80' to-addr='172.16.1.208'"
# 伪装(需要开启masquerade),将来自局域网172.16.1.0/24网段访问外网的流量映射为网络出口公网IP,即修改源IP地址。
9、禁止172.16.1.10访问https服务,并返回错误信息:
firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='172.16.1.10' service name='https' reject"
# 如果是drop的话是直接丢弃,会返回timeout(连接超时)。
10、每分钟允许2个新连接访问ftp服务:
firewall-cmd --permanent --zone=public --add-rich-rule="rule service name='ftp' limit value='2/m' accept"
11、允许新的ipv4和ipv6连接ftp,并使用日志和审核,每分钟允许访问一次:
firewall-cmd --permanent --zone=public --add-rich-rule="rule service name='ftp' log limit value='1/m' audit accept"
12、将来自172.16.1.0/24网段访问本机8080端口的流量转发到本机的80端口:
firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='172.16.1.0/24' forward-port port='8080' protocol=tcp to-port=80"
13、允许一个IP(172.16.1.10)仅能通过指定端口(8080-8090)访问到目标(172.16.1.12):
firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='172.16.1.10' destination address='172.16.1.12/32' port port='8080-8090' protocol='tcp' accept"
14、添加、删除 firewalld 服务可以访问的IP地址:
firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='172.16.1.10' port port='80' protocol='tcp' accept"
# 允许172.16.1.10主机访问80端口。
firewall-cmd --permanent --zone=public --remove-rich-rule="rule family='ipv4' source address='172.16.1.10' port port='80' protocol='tcp' accept"
# 移除172.16.1.10主机访问80端口的策略。
2.5、补充:
1、地址转换问题:
(1)源地址转换,就是我们平常说的代理上网,应用场景就是代理内网用户上网。
(2)目的地址转换,就是我们常说的端口映射,应用场景是发布服务到外网。
(3)双向地址转换,就是先将数据包的目的地址转换后再转换源地址,应用场景是内网以公网ip访问内网的业务系统。
2、如何清除 firewalld 服务规则:
(1)如果防火墙配置了规则很多如果清空规则呢,firewalld默认没有命令来清空规则。但是我们可以通过编辑配置文件来清除规则。
/etc/firewalld/zones/ 此处为配置生效后保存的配置文件,当用命令每次将新的配置写入到配置文件之中后,系统会自动的备份以
前的文件。如果是手动修改需要先对配置文件进行备份。
[root@centos-test ~]# ls /etc/firewalld/zones
public.xml public.xml.old
3、使用默认模板的形式添加服务(用于定制服务端口):
(1)所有的默认规则都可以在 /usr/lib/firewalld/ 中找到:
[root@centos-test ~]# ls /usr/lib/firewalld/
helpers icmptypes ipsets services xmlschema zones
(2)复制默认目录下的规则到配置目录下:
[root@centos-test ~]# cp -a /usr/lib/firewalld/services/ftp.xml /etc/firewalld/services/
(3)配置文件中包含了服务名,端口,还有服务的相关说明:
[root@centos-test ~]# cat /etc/firewalld/services/ftp.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>FTP</short>
<description>FTP is a protocol used for remote file transfer. If you plan to make your FTP server publicly available, enable this option. You
need the vsftpd package installed for this option to be useful.</description> <port protocol="tcp" port="21"/>
<module name="nf_conntrack_ftp"/>
</service>
(4)在 /etc/firewalld/zones/public.xml 中增加一行 <service name="ftp"/>:
[root@centos-test ~]# vim /etc/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming conn
ections are accepted.</description>
<service name="ssh"/>
<service name="dhcpv6-client"/>
<service name="ftp"/>
</zone>
(5)重载firewalld:
[root@centos-test ~]# firewall-cmd --reload
(6)查看服务:
[root@centos-test ~]# firewall-cmd --zone=public --list-service
ssh dhcpv6-client ftp