firewalld是centos7的一大特性,最大的好处有两个:支持动态更新,不用重启服务;第二个就是加入了防火墙的“zone”概念
firewalld有图形界面和工具界面,由于我在服务器上使用,图形界面请参照官方文档,本文以字符界面做介绍
firewalld的字符界面管理工具是 firewall-cmd
firewalld默认配置文件有两个:/usr/lib/firewalld/ (系统配置,尽量不要修改)和 /etc/firewalld/ (用户配置地址)
zone概念:硬件防火墙默认一般有三个区,firewalld引入这一概念系统默认存在以下区域(根据文档自己理解,如果有误请指正):
-
drop(丢弃):任何接收的网络数据包都被丢弃,没有任何回复。仅能有发送出去的网络连接。(黑名单)
-
block(限制):任何接收的网络连接都被 IPv4 的 icmp-host-prohibited 信息和 IPv6 的 icmp6-adm-prohibited 信息所拒绝。
-
public(公共):在公共区域内使用,不能相信网络内的其他计算机不会对您的计算机造成危害,只能接收经过选取的连接。(默认区域)
-
external(外部):特别是为路由器启用了伪装功能的外部网。您不能信任来自网络的其他计算,不能相信它们不会对您的计算机造成危害,只能接收经过选择的连接。
-
dmz(非军事区):用于您的非军事区内的电脑,此区域内可公开访问,可以有限地进入您的内部网络,仅仅接收经过选择的连接。
-
work(工作):用于工作区。您可以基本相信网络内的其他电脑不会危害您的电脑。仅仅接收经过选择的连接。
-
home(家庭):用于家庭网络。您可以基本信任网络内的其他计算机不会危害您的计算机。仅仅接收经过选择的连接。
-
internal(内部):用于内部网络。您可以基本上信任网络内的其他计算机不会威胁您的计算机。仅仅接受经过选择的连接。
-
trusted(信任):可接受所有的网络连接。(白名单)
说明:firewalld 的默认区域是 public
显示所有支持的分区:
$ firewall-cmd --get-zones block drop work internal external home dmz public trusted
网络请求如何判断使用哪个 zone 的 firewalld 是如何规定一个网络请求使用的时哪个 zone 上的规则呢?首先会根据 zone 上绑定的 source 进行判断,然后再根据 interface 进行判断。比如:我现在有两台机器,一台我本机(192.168.1.188),另一个是虚拟机(192.168.1.61)。以下操作未说明的情况下都是在虚拟机上:
root执行 # yum install firewalld firewall-config
3、运行、停止、禁用firewalld
查看状态:# systemctl status firewalld 或者 firewall-cmd --state
启动:# systemctl start firewalld
停止:# systemctl stop firewalld
使能:# systemctl enable firewalld
禁用:# systemctl disable firewalld
4、配置firewalld
查看版本:$ firewall-cmd --version
查看帮助:$ firewall-cmd --help
查看设置:
显示状态:$ firewall-cmd --state 查看区域信息: $ firewall-cmd --get-active-zones 查看指定接口所属区域:$ firewall-cmd --get-zone-of-interface=eth0
拒绝所有包:# firewall-cmd --panic-on
取消拒绝状态:# firewall-cmd --panic-off
查看是否拒绝:# firewall-cmd --query-panic
更新防火墙规则:# firewall-cmd --reload
# firewall-cmd --complete-reload
两者的区别就是第一个无需断开连接,就是firewalld特性之一动态添加规则,第二个需要断开连接,类似重启服务
将接口添加到区域,默认接口都在public
firewall-cmd --zone=public --add-interface=eth0 永久生效再加上 --permanent 然后reload防火墙
设置默认接口区域
firewall-cmd --set-default-zone=public
立即生效无需重启
打开端口(貌似这个才最常用)
查看所有打开的端口:
firewall-cmd - -zone=dmz --list-ports
加入一个端口到区域:
firewall-cmd --zone=dmz --add-port=8080/tcp
打开一个服务,类似于将端口可视化,服务需要在配置文件中添加,/etc/firewalld 目录下有services文件夹
firewall-cmd --zone=work --add-service=smtp
移除服务
firewall-cmd --zone=work --remove-service=smtp
启动firewalld服务并设置开机自动启动,下面的命令必须在防火墙开启的状态下才可用 ,由于firewalld默认不是放行所有端口,所以启动firewalld会造成该机器的某些端口无法访问。
systemctl enable firewalld
systemctl start firewalld
2、更改防火墙默认区域为trusted,默认放行所有连接请求
firewall-cmd --set-default-zone=trusted
3.新建一个zone,将想要访问本机80端口的ip,如:192.168.1.123 ,添加的这个zone中,同时在这个zone中放行80端口。
firewall-cmd --permanent --new-zone=newzone
firewall-cmd --permanent --zone=newzone --add-source=192.168.1.123
firewall-cmd --permanent --zone=newzone --add-port=80/tcp
4.除192.168.1.123这个ip以外的地址访问本机时会使用当前默认的trusted这个zone里的规则,即禁止访问本机的80端口。
firewall-cmd --permanent --zone=trusted --add-rich-rule="rule family="ipv4" port protocol="tcp" port="80" drop"
systemctl restart firewalld
查看配置是否生效:
firewall-cmd --list-all-zone
firewall-cmd --list-all
对于一个请求具体优先使用哪个zone,优先级如下:
我们知道每个zone就是一套规则集,但是有那么多zone,对于一个具体的请求来说应该使用哪个zone(哪套规则)来处理呢?这个问题至关重要,如果这点不弄明白其他的都是空中楼阁,即使规则设置的再好,不知道怎样用、在哪里用也不行。
对于一个接受到的请求具体使用哪个zone,firewalld是通过三种方法来判断的:
1、source,也就是源地址 优先级最高
2、interface,接收请求的网卡 优先级第二
3、firewalld.conf中配置的默认zone 优先级最低
这三个的优先级按顺序依次降低,也就是说如果按照source可以找到就不会再按interface去查找,如果前两个都找不到才会使用第三个,也就是在firewalld.conf中配置的默认zone
#限制某个ip访问 firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address="10.6.1.2" drop'
#查看当前zones
firewall-cmd --get-active-zones
#显示当前开放端口
firewall-cmd --zone=public --list-ports
#添加端口到永久区
firewall-cmd --permanent --zone=public --add-port=61080/tcp --add-port=61446/tcp
#添加服务到永久区
firewall-cmd --permanent --zone=public --add-service=samba
firewall-cmd --add-service=nfs
#刷新配置,添加到永久区后必须刷新配置才能生效
firewall-cmd --reload
#显示当前开放端口
firewall-cmd --zone=public --list-ports
#显示当前开放的服务
firewall-cmd --zone=public --list-service
firewall-cmd --state 获取firewalld状态 firewall-cmd --complete-reload 完全重启,状态信息将会丢失 firewall-cmd --get-zones
firewall-cmd --permanent --add-rich-rule='rule protocol value=icmp drop'`** 获取所有支持的服务,支持的服务存放在/usr/lib/firewalld/services目录下。 服务是firewalld所使用的有关端口和选项的规则集合。 被启动的服务会在firewalld服务开启或运行是自动加载。 我们还可以创建自己的服务,即添加端口和服务的对应关系,将在下面讲解。 firewall-cmd --get-icmptypes 获取所有支持的ICMP类型
firewall-cmd --list-all-zones 列出全部启用的区域的特性(即查询当前防火墙策略),特性是定义的防火墙策略。 策略如:服务、端口和协议的组合、端口/数据报转发、伪装、ICMP拦截或自定义规则等。 该命令会列出所有区域的所有特性,包括详细规则(rich-rules)。
firewall-cmd [--zone=区域] --list-all 输出指定区域启用的全部特性,如果区域被省略,将显示默认区域的信息。
firewall-cmd --get-default-zone 查默认区域,默认的默认区域为public
firewall-cmd --set-default-zone=区域 设置默认区域,也可通过/etc/firewalld/firewalldconf中的DefaultZone配置项定义默认区域。 流入默认区域中配置的接口的新访问请求将被置入新的默认区域。当前活动的连接将不受影响。
firewall-cmd --get-active-zones 获取活动的区域,同时会输出活动区域所包含的接口。
firewall-cmd --get-zone-of-interface=网卡名 查指定接口属于哪个区域
firewall-cmd [--zone=区域] --add-interface=接口名 将指定接口增加到指定区域,如果区域被省略了,将会被添加到默认区域。 一个接口同时只能属于一个区域,接口会在防火墙重新加载后重新应用。
firewall-cmd [--zone=区域] --change-interface=接口名 修改接口所属区域,这个选项与--add-interface选项相似。 但不同的是,当接口已经存在于另一个区域的时候,该接口将被重置到新的区域。
firewall-cmd [--zone=区域] --remove-interface=接口名 从指定区域中删除指定接口,删除后,这个接口的所有数据包将使用默认区域的规则。
firewall-cmd [--zone=区域] --query-interface=接口名 查指定区域中是否包含指定接口,如果区域被省略了,将被指定为默认区域。
firewall-cmd [--zone=区域] --list-services 列举区域中启用的服务,如果区域被省略了,将使用默认区域。
firewall-cmd --query-masquerade 检查是否允许NAT转发 firewall-cmd --zone=public --add-masquerade --permanent 永久开启路由转发 firewall-cmd --remove-masquerade 禁止防火墙NAT转发
firewall-cmd --panic-on 启用应急模式,将阻断所有网络连接,以防出现紧急状况。 firewall-cmd --panic-off 禁用应急模式 firewall-cmd --query-panic 查应急模式状态
firewalld中的富语言规则表示更细致,更详细的防火墙策略配置,他可以针对系统服务、端口号、原地址和目标地址等诸多信息进行更有针对性的策略配置,优先级在所有的防火墙策略中也是最高的,下面为firewalld富语言规则帮助手册Copy to clipboardErrorCopied
#富规则语法 [root@web02 ~]# man firewalld.richlanguage rule [source] [destination] service|port|protocol|icmp-block|icmp-type|masquerade|forward-port|source-port [log] [audit] [accept|reject|drop|mark] rule [family="ipv4|ipv6"] source address="address[/mask]" [invert="True"] service name="service name" port port="port value" protocol="tcp|udp" protocol value="protocol value" forward-port port="port value" protocol="tcp|udp" to-port="port value" to-addr="address" accept | reject [type="reject type"] | drop #富语言规则相关命令 --add-rich-rule='<RULE>' #在指定的区域添加一条富语言规则 --remove-rich-rule='<RULE>' #在指定的区删除一条富语言规则 --query-rich-rule='<RULE>' #找到规则返回0,找不到返回1 --list-rich-rules #列出指定区里的所有富语言规则Copy to clipboardErrorCopied
1、实列一 例题:允许10.0.0.1主机能够访问http服务,允许172.16.1.0/24能访问10050端口**
#允许10.0.0.1主机能够访问http服务 [root@web02 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.0.0.1 service name=http accept' #允许172.16.1.0/24能访问10050端口 [root@web02 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.16.1.0/24 port port=111 protocol=tcp accept'Copy to clipboardErrorCopied
2、实列二例题:默认public区域对外开放所有人能通过ssh服务连接,但拒绝172.16.1.0/24网段通过ssh连接服务器
1)#允许public区域所有访问ssh,拒绝172.16.1.0/24网段连接 [root@web02 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.16.1.0/24 service name=ssh reject' 2)#允许public区域所有访问ssh,拒绝172.16.1.0/24网段连接 [root@web02 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.16.1.0/24 service name=ssh drop' #drop和reject区别: drop 直接丢弃,不返回任何内容 reject拒绝,返回拒绝的内容Copy to clipboardErrorCopied
3、实列三例题:当用户来源IP地址是10.0.0.1主机,则将用户请求的5555端口转发至后端172.16.1.7的22端口
#端口转发 [root@web02 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.0.0.1 forward-port port=5555 protocol=tcp to-port=22 to-addr=172.16.1.7' success [root@web02 ~]# firewall-cmd --add-masquerade successCopy to clipboardErrorCopied
4、firewalld(禁ping)
[root@web02 ~]# firewall-cmd --permanent --add-rich-rule='rule protocol value=icmp drop'
5、查看富规则
[root@web02 ~]# firewall-cmd --list-rich-rules rule family="ipv4" source address="10.0.0.1" forward-port port="5555" protocol="tcp" to-port="22" to-addr="172.16.1.7"Copy to clipboardErrorCopied
注:一般所有的拒绝或接受都配置在默认区域,当指定IP访问指定端口或者服务的时候使用富规则