一、操作目的和应用场景
最近做了一些CentOS 7系统的安全加固,涉及到firewalld防火墙的配置。以前对iptables比较熟悉,用firewalld比较少,所以特意学习了firewalld的用法,并在这里分享。
firewalld和iptables都是防火墙的前端配置工具,真正工作的是linux内核的netfilter。firewalld借鉴了其它防火墙系统/设备的理念,例如区域(zone)的概念以及配置信息管理的当前配置和持久配置(runtime和permanent),这使得防火墙规则的管理工作更加方便。
二、平台及工具版本
host系统:linux mint 19.3
虚拟机管理程序:virtualbox 6
虚拟机:CentOS 7
软件:firewalld
计算机硬件:小米笔记本电脑
三、操作步骤
(一)设置zone(区域)
1、zone的作用是什么?
firewalld与iptables相比,一个重要的特性就是使用了zone的概念。不同的zone对应不同类型的网络,不同的网络也对应着不同的包过滤规则集。这与windows 7防火墙的“网络位置”的功能类似。
例如windows 7防火墙有4个网络位置,分别是家庭网络、工作网络、公共网络和域,每个网络位置由于受到的威胁不同而具有不同的包过滤规则集。就以“远程协助”功能为例,不同网络位置允许“远程协助”进行入站连接的规则是不同的:
“域”网络位置关于“远程协助”的入站规则:

“专用”网络位置(工作网络)关于“远程协助”的入站规则:

“公用”网络位置(工作网络)关于“远程协助”的入站规则:

而firewalld有公共、外部、非军事区等9个zone,另外也可以创建自定义的zone。每个zone也都拥有自己的包过滤规则集,用户也可以对zone中的已有规则进行增删改。firewalld根据网络接口当前关联的zone中的规则进行包过滤操作。防火墙规则的创建、修改和删除,实际上就是针对网络接口当前关联的zone中的服务、端口以及富规则等所进行的增删改操作。也可以通过将网络接口关联到新的zone来应用新的包过滤规则。
2、不同zone的含义
firewalld有9个内置的zone:
firewall-cmd –get-zones //查看防火墙全部的zone

drop(丢弃) //任何接收到的连接都被丢弃,没有任何回复。只允许出站的网络连接。
block(阻塞) //任何接收的网络连接都被阻塞,并给出IPv4的icmp-host-prohibited信息和IPv6的icmp6-adm-prohibited信息作为回应。
public(公共) //用于连接公共区域。不能相信来自这个区域的连接不会危害你的计算机,只接受经过选择的连接。
external(外部) //如果linux服务器作为路由器使用,可以将连接外部的接口的zone设置为external。不信任来自external网络的连接,只接受经过选择的连接。
dmz(非军事区) //用于非军事区的计算机。非军事区可以被公开访问,可以有限地进入内部网络,只接受经过选择的连接。
work(工作) //连接工作的区域,可以基本相信来自这个区域的连接不会危害你的计算机。只接受经过选择的连接。
home(家中) //用于家中的网络,可以基本相信来自home区域的计算机不会危害你的电脑。只接受经过选择的连接。
internal(内部) //用于内部网络,可以基本相信来自internal区域的计算机不会危害你的电脑。只接受经过选择的连接。
trusted(信任) //连接被信任的区域,接受所有连接。
3、修改firewalld的默认zone
//查看默认的zone
firewall-cmd –get-default-zone

默认的zone是public
//将默认的zone设置为work
firewall-cmd –set-default-zone=work

默认的zone已改成work
4、查看网卡的zone
//查看enp0s3网卡对应的zone
firewall-cmd –get-zone-of-interface=enp0s3

enp0s3网卡的zone是work。同时也能看到,只有部分网卡被分配了zone。
5、将网卡添加到zone
//将virbr0接口加入到internal zone
firewall-cmd –zone=internal –add-interface=virbr0
添加成功,现在virbr0接口的zone是internal。
6、修改网卡的zone
firewall-cmd –zone=block –change-interface=enp0s3
enp0s3网络接口的zone已改为block
7、删除网卡的zone
firewall-cmd –zone=block –remove-interface=enp0s3
删除zone之后,这个网卡就没有zone了。有人说删除网卡的zone之后会改为默认的zone,在这里不是这样的。
//重新将enp0s3的zone设置为work
firewall-cmd –zone=work –change-interface=enp0s3

8、查看所有网卡所在的zone
firewall-cmd –get-active-zones

(二)设置service(服务)
1、查看所有的服务
firewall-cmd –get-service
可以看到forewall的中已定义的全部服务。
2、查看默认zone的服务
firewall-cmd –list-service

默认的work区域有两个服务:dhcpv6-client和ssh
3、查看指定zone的服务
firewall-cmd –zone=区域名称 –list-service //查看drop区域的服务

可以看到,不同的zone中的服务是不同的。
4、将服务添加到zone
firewall-cmd –zone=public –add-service=http //临时向public区域添加http服务

firewall-cmd –zone=public –add-service=ftp –permanent //持久化(写入配置文件)

从输出中可以看出,使用–permanent选项将服务添加到zone,实际上是将服务写入了zone的配置文件中。这样在重新读取zone的配置后才能生效,当前是不生效的。
可以将firewalld的配置文件理解成思科设备的startup-config。修改startup-config,对于running-configs是没有影响的。firewalld重读配置文件相当于copt running-config startup-config,当前生效的配置会被配置文件中的信息所覆盖从而不再生效。
5、从zone中删除服务
//从public区域删除ssh服务
firewall-cmd –zone=public –remove-service=ssh //删除内存中的策略

public区域的ssh服务被删除。
firewall-cmd –zone=public –remove-service=ssh –permanent //删除配置文件中的策略

public区域的ssh服务从配置文件中被删除。
(三)firewalld应用实例
1、通过向区域添加服务来创建防火墙规则
(1)要求
临时允许任意源地址访问enp0s3网卡监听的ftp、ssh、http服务
(2)实施方法
1)将指定的服务添加到enp0s3网卡对应的zone中
firewall-cmd –get-zone-of-interface=enp0s3 //查看网卡对应的zone

firewall-cmd –zone=work –list-service //查看work区域中的服务

已经包含了ssh服务,那么只要将ftp和http服务添加到work区域即可。
firewall-cmd –zone=work –add-service=http
firewall-cmd –zone=work –add-service=ftp

服务添加成功。
(3)验证防火墙阻断效果
//服务器端运行netcat(两个窗口中运行),模拟ftp服务和http服务监听21和80端口。
nc -l -p 21
nc -l -p 80
//客户端访问
客户端连接成功。
//服务端netcat监听2121端口
nc -l -p 2121
//客户端访问
由于不存在允许访问2121端口的策略,客户端连接失败。
2、通过向区域添加端口范围来创建防火墙规则
(1)要求
永久允许访问enp0s3网卡监听的8080到8089端口
(2)实施方法
//查看网卡对应的zone
firewall-cmd –get-zone-of-interface=enp0s3

//由于是自定义端口,现有的服务无法与之对应。可直接向zone中添加端口范围
firewall-cmd –zone=work –add-port=8080-8089/tcp –permanent
自定义的端口范围已经写入了配置文件。
(3)验证防火墙阻断效果
//服务端使用netcat监听8080端口

//客户端访问
无法访问,显然是被防火墙阻断了。这是因为–permanent只是将规则写入了配置文件,内存中还没有修改。需要将配置文件的内容重新读入内存才能生效。
//重新读取firewall防火墙配置
firewall-cmd –reload

//客户端连接
连接成功。说明新的规则生效了。但还是需要注意,重新装载配置后,前面临时设置的那些规则就都失效了。


3、通过向区域添加富规则(rich-rules)来创建防火墙规则
(1)要求
只允许192.168.1.3访问本地的23端口,拒绝其它IP对访问23端口。
(2)实施方法
//允许192.168.1.3访问23端口
firewall-cmd –zone=work –add-rich-rule=’rule family=”ipv4″ source address=”192.168.1.3″ port port=”23″ protocol=”tcp” accept’
//拒绝任意IP访问23端口
firewall-cmd –zone=work –add-rich-rule=’rule family=”ipv4″ source address=”0.0.0.0″ port port=”23″ protocol=”tcp” reject’
//查看富规则
firewall-cmd –zone=work –list-rich-rules

(3)验证防火墙阻断效果
//服务器监听23端口
nc -l -p 23
//客户端直接访问
nping -tcp -p 23 -c 1 192.168.1.7
-p //指定目标端口
-c //指定发送数据包的数量
//客户端修改源地址后访问
nping -tcp -p 23 -c 1 -S 192.168.1.100 192.168.1.7
-S //将任意IP指定为源地址
//服务器端针对23端口抓包
可以看到,当使用防火墙允许的源地址访问时,服务器的23端口给出回应。但是当使用其它的IP作为源地址访问时,服务器不给出回应。这说明防火墙规则生效了。
四、其它
(一)图形界面
上面介绍了通过命令行配置firewalld的基本方法,也可以运行图形界面程序进行配置:
firewall-config

理解了原理之后配置方法就比较简单了,这里不再详述。
(二)默认zone
针对默认zone,在使用firewall-cmd命令进行操作时可不指定zone的名称
firewall-cmd –add-service=https //向默认zone中添加服务
firewall-cmd –list-service //查看默认zone中的服务
由于网络接口enp0s3关联到了默认的work区域,那么允许访问本地的https服务这条规则自然就生效了。

湖北省武汉市 1F
之前用iptables配置差点整崩溃
福建省福州市 B1
@ Scarlet Serenade 我之前也踩过坑,iptables真是够折腾的。
韩国 2F
zone的概念有点绕,还得再琢磨琢磨
辽宁省 B1
@ 韵凝霜雪 和windows防火墙的网络位置概念差不多,理解起来还行
日本 3F
小米笔记本装CentOS稳吗?
日本 B1
@ 黄昏散步 驱动没问题,就是触摸板偶尔失灵
四川省成都市 B1
@ 黄昏散步 小米本装CentOS还能用,散热稍热。
广西南宁市 4F
临时规则和持久化配置容易搞混啊
重庆市 B1
@ 阿狸 需要reload才能持久化生效,刚开始也踩了这个坑
日本 5F
为啥删除zone后网卡就没zone了?
江苏省苏州市 6F
虚拟机测试环境跟我一模一样🤣
山东省滨州市 B1
@ 蜜蜜 我用的也是这个组合,挺稳定的
中国 7F
感觉work区默认服务有点少
韩国 B1
@ 雪村 确实,就dhcpv6和ssh俩,够用吗?
广东省广州市 8F
这个富规则写法太复杂了
湖北省咸宁市 9F
reload之后临时规则都没了?
印度 B1
@ 虚拟造梦师 是啊,reload会把临时的给清掉,得重新加。
上海市 B1
@ 虚拟造梦师 对,reload会清掉临时规则,记得加permanent。
上海市长宁区 10F
那个permanent参数总忘加,配置完重启就没了😂
日本 11F
虚拟机环境跟我一样,virtualbox+centos7,太巧了
韩国 12F
zone删掉后网卡没分配区域,这设计有点怪啊
上海市长宁区 13F
富规则写起来确实麻烦,不如直接写iptables规则
浙江省 B1
@ 螭吻凌波 富规则写太麻烦,直接用iptables快。
上海市 14F
小米本装linux发热严重不?
浙江省温州市 B1
@ 炸鸡爱好者 发热还好,就是续航差点
福建省三明市 B1
@ 炸鸡爱好者 这机器散热一般,装CentOS会稍微热点。
日本 15F
要是把zone配置错了,会不会直接断网啊?
福建省莆田市 16F
看晕了,还是用图形界面吧firewall-config
陕西省延安市 17F
感觉work区默认服务太少了
上海市 B1
@ Lullmist 默认服务少是有点反直觉,不过安全角度能理解
黑龙江省佳木斯市 18F
zone概念确实比iptables方便管理
印度 19F
这教程写得很详细,适合新手入门
浙江省杭州市 20F
虚拟机环境跟我一样,virtualbox+centos7
印度 21F
临时规则reload就没了有点坑
安徽省铜陵市 22F
之前配iptables差点把服务器搞崩😅
上海市 23F
图形界面firewall-config好用吗?
湖北省十堰市 24F
那个permanent参数老忘记加
江苏省扬州市 25F
富规则语法太复杂了,有没有简单点的写法?
重庆市 26F
zone概念确实比iptables直观,管理起来方便多了。
北京市 27F
之前配服务器防火墙就是用的firewalld,上手挺快的。
北京市 28F
那个permanent参数老忘,配置重启就没了真头疼。
湖北省武汉市 29F
搞不懂为啥删除zone后网卡就没区域了,不会自动回默认zone吗?
巴基斯坦 30F
看晕了,还是用图形界面firewall-config吧。
北京市 31F
富规则写起来好麻烦,不如直接写iptables规则简单。
浙江省 32F
感觉work区默认服务有点少,是不是得多加几个?
山东省济南市 33F
虚拟机测试环境跟我一模一样,virtualbox+centos7组合。
北京市 34F
这教程比iptables简单多了👍
湖北省黄石市大冶市 35F
firewall-config图形界面卡得动不了,还是命令行香
青海省 36F
之前搞过firewalld模板化,配合ansible部署稳多了
陕西省渭南市 37F
删了zone不回默认,这逻辑确实怪,记不住
湖北省武汉市 38F
临时规则reload就没了,这设计有点坑啊。
湖南省 B1
@ 梦影蝶 临时规则真是短命,reload后全消失,得记得加–permanent 😂
北京市 39F
zone配置错了会不会直接断网?
湖南省岳阳市 B1
@ 幻月祭司 怕怕,改错了会瞬间掉线,最好先在测试机上玩
浙江省湖州市 B1
@ 幻月祭司 配错zone真能断网,之前把enp0s3设成drop直接失联了
河南省洛阳市 40F
图形界面firewall-config好用吗?操作起来复杂不?
山东省淄博市 41F
zone默认是public,记得改成work。👍
上海市 B1
@ 墨麟儿 哎,我也踩过这个坑,改了work后网络恢复了
菲律宾 42F
firewall-cmd –list-all一次看全。
江西省吉安市 43F
加端口要加/tcp,不然不生效。
山东省滨州市 44F
permanent忘了加,重启全失效,坑。
湖南省郴州市 45F
把enp0s3改成block后ssh挂了,花半小时改回work才行。
上海市 46F
想让virbr0只开放80端口,可以在work区加–add-port=80/tcp再permanent。
广东省广州市 47F
我在生产服务器用firewalld写rich规则限制内部IP访问数据库端口,后来把配置抽成模板,配合permanent和reload,做到不重启服务就能动态更新,折腾了几天才搞定。
山东省潍坊市 48F
之前用iptables配到半夜,firewalld真香😂
北京市 49F
zone这个概念讲得还挺清楚
日本 B1
@ 蓬莱仙岛 zone这块儿讲得挺明白的
新疆 50F
小米本跑CentOS发热有点顶,但能忍
湖南省 51F
富规则那串命令写得我手抖,能不能给个模板?
日本 52F
临时加了端口没加–permanent,重启直接失联😭
浙江省 53F
virbr0加到internal后连不上了,谁试过咋回事?
日本 54F
work区默认就俩服务,开个web还得手动加http
浙江省宁波市 B1
@ 夜星独照 work区就留ssh和dhcpv6-client,其他都得自己加,挺坑的
北京市 55F
reload完临时规则全没了,这设计反人类吧?
孟加拉 56F
永久生效非得reload一下,记不住啊!
澳大利亚 57F
zone这块和win防火墙确实有点像
台湾省高雄市 B1
@ 话唠本唠 这么一说还真挺像的
甘肃省 58F
firewalld这玩意看着简单,一上手全是坑😭
广东省湛江市 59F
这比iptables省事多了,直接改zone就行
山东省威海市 B1
@ RentFree 上手是挺快的
四川省 60F
小米本跑CentOS风扇狂转,跟烤炉似的
重庆市 61F
reload完临时规则全没了,谁这么设计的?太坑了
辽宁省大连市 62F
virbr0加internal后网络不通,是不是还得开masquerade?
印度尼西亚 63F
permanent不加就重启,血的教训啊😂
日本 64F
zone概念比iptables清楚,但文档写得太乱了
广东省广州市番禺区 65F
想问下富规则能不能批量导入,每次敲命令太累了
台湾省台北市 66F
work区再加个http就好了,每次都手动添麻烦