目前在CentOS中使用firewalld替代iptables,firewalld是iptables的前段控制器,与iptables的区别是:前者使用区域和服务而不是链式规则,它动态管理规则集,允许更新规则而不破坏现有的会话和连接。
firewalld的配置文件主要存放在2个位置:/usr/lib/Firewalld和/etc/firewalld,前者存放的是默认配置,后者存放的是自定义配置。
基本命令
1 | systemctl start/stop/enable/disable/status firewalld # 启动/关闭/开机启动/取消开机启动/状态 |
规则管理命令
1 | firewall-cmd --panic-on # 终止所有数据包 |
端口管理命令
1 | firewall-cmd --zone=public --list-ports # 现实public级别被允许进入的端口 |
端口转发命令
1 | firewall-cmd --zone=public --add-masquerade # 首先打开端口转发 |
网卡管理命令
1 | firewall-cmd --zone=public --list-interfaces # 显示级别为public的所有网卡 |
系统服务管理命令
1 | firewall-cmd --zone=public --add-service=smtp # 添加服务smtp到public级别中 |
zone
firewall能将不同的网络连接归类到不同的信任级别,zong提供以下几个级别
- drop 丢弃所有进入的包
- block 拒绝所有外部发起的连接,允许内部发起的连接
- public 允许指定的连接进入
- external 一般用于路由转发
- dmz 允许受限制的连接进入
- work 允许信任的计算机被限制的进入连接
- home 家庭网络,仅仅接收经过选择的连接
- internal 内部网络,仅仅接收经过选择的连接
- trusted 信任所有连接
过滤规则
过滤规则的优先顺序是source>interface>firewalld.conf,支持的过滤规则有:
- source 源地址
- interface 网卡
- service 服务名
- port 端口
- icmp-block icmp类型
- masquerade ip地址伪装
- forward-port 端口转发
- rule 自定义规则
traget
当区域处理它的源或接口上的一个包时,但是没有处理该包的显式规则时,这时区域目标的target决定了该行为,tariget有以下几种:
- ACCEPT 通过该包
- REJECT 拒绝该包
- DROP 丢弃该包
- default 不做任何事情
富文本规则
使用富文本规则,可以用比较直接接口方式更容易理解的方法建立复杂防火墙规则,还可以永久保留设置。
富文本的命令格式和结构:
1 | rule [family="<rule family>"] |
一个规则是关联某个zone的,一个zone可以有多个分区,如果几个规则相互影响或冲突,则执行和数据包相匹配的第一个规则;
规则系列可以限定ipv4或ipv6,如果没有指定,将同时为ipv4和ipv6增加规则;
- 规则命名
- source
- 指定源地址,可以使用invert=”True”或invert=”Yes”来颠倒源地址;
- denstination
- 指定目的地址,同源地址用法
- service
- 服务名称
- port
- 端口,可以是单个端口,也可以是端口范围n1-n2,协议可以是tcp或udp
port=8022-8033 protocol=tcp
- protocol
- 协议,可以是协议ID数字,也可以是协议名称
protocol value=icmp
- log
- 注册含有内核记录的新的连接请求到规则中,可以定义一个前缀文本,记录等级可以是emerg/alert/crit/error/warning/notice/info/debug
- 等级用正的自然数表示,继续时间的单位s/m/h/d,最大限定值是1/d
- accept/reject/drop
- 执行的动作可以是accept/reject/drop中的1个,选择drop所有数据包会被丢弃,并且不会向来源地发送任何信息
- source
操作示例
将ssh服务添加到internal级别中,仅允许192.168.0.0/24通过22端口访问,但是禁止192.168.0.92禁止登陆ssh
1
2
3
4
5
6firewall-cmd --list-all # 查看
firewall-cmd --zone=public --remove-service=ssh --permanent # 从public中永久移除ssh服务
firewall-cmd --zone=internal --add-service=ssh --permanent # 将ssh服务添加到internal级别中
firewall-cmd --zone=internal --add-source=192.168.0.0/24 --permanent # 添加源地址
firewall-cmd --zone=internal --add-rich-rule='rule family="ipv4" source address="192.168.0.92" service name="ssh" drop' --permanent # 添加富文本规则
firewall-cmd --reload将ssh服务从zone中删除,在public中,仅允许192.168.0.100通过22端口访问
1
2
3firewall-cmd --zone=internal --remove-service=ssh --permanent
firewall-cmd --zone=public --add-rich-rule='rule family=ipv4 source address=192.168.0.100 port port=22 protocol=tcp accept' --permanent
firewall-cmd --reload将samba服务添加到internal,允许192.168.0.0/24中的用户访问,samba会使用tcp/139/445、udp/137/138端口
1
2
3
4
5
6
7
8
9firewall-cmd --zone=internal --set-target=default --permanent
firewall-cmd --zone=internal --add-interface=eth1
firewall-cmd --zone=internal \
--add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" port port=139 protocol=tcp accept' --permanent
firewall-cmd --zone=internal \
--add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" port port=445 protocol=tcp accept' --permanent
firewall-cmd --zone=internal \
--add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" port port=137-138 protocol=udp accept' --permanent
firewall-cmd --reload