说明

firewall-cmd 是 firewalld的字符界面管理工具,firewalld是centos7的一大特性,最大的好处有两个:支持动态更新,不用重启服务;第二个就是加入了防火墙的“zone”概念。
firewalld跟iptables比起来至少有两大好处:

  • firewalld可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以生效。
  • firewalld在使用上要比iptables人性化很多,即使不明白“五张表五条链”而且对TCP/IP协议也不理解也可以实现大部分功能。

firewalld自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现,也就是说firewalld和iptables一样,他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过firewalld和iptables的结构以及使用方法不一样罢了。

常用参数

  • 通用选项
命令 说明
-h, --help 显示帮助信息;
-V, --version 显示版本信息;
-q, --quiet 不打印状态消息;
  • 状态选项
命令 说明
--state 查看防火墙运行状态
--reload 重新加载防火墙并保留状态信息
--complete-reload 重新加载防火墙并丢失状态信息
--runtime-to-permanent 将当前防火墙的规则永久保存;
--check-config 检查配置正确性
--permanent 将策略永久保存

区域选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 创建新区域为test
firewall-cmd --new-zone=test --permanent
# 删除test区域
firewall-cmd --delete-zone=test --permanent
# 查看指定区域所有策略
firewall-cmd --info-zone=public
# 查看所有区域名称
firewall-cmd --get-zones
# 查看所有区域策略
firewall-cmd --list-all-zones
# 设置默认区域
firewall-cmd --set-default-zone=public
# 查看默认区域,默认为public
firewall-cmd --get-default-zone
# 将eth0接口添加到public区域
firewall-cmd --add-interface=eth0 --zone=public
# 查看指定接口所属区域
firewall-cmd --get-zone-of-interface=eth0
# 查看当前活动区域
firewall-cmd --get-active-zones
# 查看区域配置文件保存路径
firewall-cmd --path-zone=public --permanent
# 导入区域配置并重命名为test
firewall-cmd --new-zone-from-file=/usr/lib/firewalld/zones/public.xml --name=test --permanent
# 加载public区域默认设置,reload后生效
firewall-cmd --load-zone-defaults=public --permanent

target选项

1
2
3
4
5
# 查看public区域默认对于数据包的处理方式,ACCEPT为接受, DROP为丢弃, REJECT为拒绝,default类似于REJECT
# 默认情况下不加zone参数都会到默认区域,默认情况下,默认区域为public
firewall-cmd --get-target --zone=public --permanent
# 设置docker区域默认对数据包的处理方式为ACCEPT模式
firewall-cmd --set-target=ACCEPT --zone=docker --permanent

设定永久区域的目标。目标是其中之一:ACCEPT(接受),DROP(丢弃),REJECT(拒绝),default(默认)
默认类似于REJECT(拒绝),但在以下场景中具有特殊含义:

  1. ICMP明确允许
    在区域规则集的末尾,明确允许ICMP数据包。
  2. 转发的数据包遵循出口区域的目标
    在转发数据包的情况下,如果入口区域使用默认值,则由出口区域确定是否允许该数据包。
    对于进入zoneA和离开zoneB的转发数据包:
  • 如果zoneA的目标是接受、丢弃或拒绝,则数据包将分别被接受、丢弃或拒绝。
  • 如果zoneA的目标是默认的,则根据zoneB的目标接受、丢弃或拒绝数据包。如果zoneB的目标也是默认的,那么数据包将被firewalld的catchall reject拒绝。
  1. 信源区向界面区漂移
    这仅适用于启用AllowZoneDrift的情况。请参见firewalld.conf(5)。
    如果数据包以默认目标进入基于源的区域,它仍可能进入基于接口的区域(包括默认区域)。
关于default

源管理

sources
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 绑定源IP
firewall-cmd --add-source=192.168.1.1
# 绑定源网段
firewall-cmd --add-source=192.168.1.0/24
# 删除源IP
firewall-cmd --remove-source=192.168.1.1
# 将源网段加入白名单,trusted区域默认为放行数据包(ACCEPT)
firewall-cmd --add-source=192.168.1.0/24 --zone=trusted
# 将源IP加入黑名单,drop区域默认为丢弃数据包(DROP)
firewall-cmd --add-source=192.168.1.1 --zone=drop
# 查询源网段是否绑定到trusted区域
firewall-cmd --query-source=192.168.1.0/24 --zone=trusted
# 查看源IP所在区域
firewall-cmd --get-zone-of-source=192.168.1.1
# 添加一个源MAC地址到trusted
firewall-cmd --add-source=00:68:EB:A6:4A:BC --zone=trusted

服务管理

  • 添加/移除服务
1
2
3
4
5
6
7
8
9
10
11
12
# 查看预设服务,如http、https、ssh
firewall-cmd --get-services
# 绑定SSH服务
firewall-cmd --add-service=ssh
# 批量添加服务
firewall-cmd --add-service={http,https}
# 移除SSH服务
firewall-cmd --remove-service=ssh
# 显示当前服务
firewall-cmd --list-services
# 永久添加HTTP服务到public区域
firewall-cmd --permanent --zone=public --add-service=http
  • 新建/修改/删除服务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 查看服务相关信息
firewall-cmd --info-service=http
# 新建一个服务
firewall-cmd --new-service=test --permanent
# 删除一个服务
firewall-cmd --delete-service=test --permanent
# 查看http服务配置文件路径
firewall-cmd --path-service=http --permanent
# 加载一个服务并重命名
firewall-cmd --new-service-from-file=http.xml --name=http2 --permanent
# 恢复服务默认设置
firewall-cmd --load-service-defaults=http --permanent
# 查看服务描述
firewall-cmd --service=http --get-description --permanent
# 修改服务描述
firewall-cmd --service=http --set-description=test --permanent
# 查看服务简短描述
firewall-cmd --service=http --get-short --permanent
# 设置服务简短描述
firewall-cmd --service=http --set-short=test --permanent
# 查看服务端口号
firewall-cmd --service=http --get-port --permanent
# 给服务添加端口号
firewall-cmd --service=http --add-port=8080/tcp --permanent
# 查看服务源端口号
firewall-cmd --service=http --get-source-port --permanent
# 移除端口
firewall-cmd --service=http --remove-port=8080/tcp --permanent
# 添加一个源端口号
firewall-cmd --service=http --add-source-port=111/tcp --permanent
# 移除一个源端口号
firewall-cmd --service=http --remove-source-port=111/tcp --permanent
# 查看服务目的地址
firewall-cmd --service=http --get-destinations --permanent
# 设置服务目标地址
firewall-cmd --service=http --set-destination=ipv4:192.168.1.1 --permanent
# 移除服务目标地址
firewall-cmd --service=http --remove-destination=ipv4 --permanent

端口管理

1
2
3
4
5
6
7
8
# 临时打开22端口
firewall-cmd --add-port=22/tcp
# 永久打开22端口
firewall-cmd --add-port=22/tcp --permanent
# 批量添加端口
firewall-cmd --add-port={9000/tcp,8081/tcp,7000/tcp}
# 查看打开的端口
firewall-cmd --list-ports

端口转发

1
2
3
4
5
6
# 检查是否允许伪装IP
firewall-cmd --query-masquerade
# 允许防火墙伪装IP,转发到其他IP需开启此项
firewall-cmd --add-masquerade --permanent
# 禁止防火墙伪装IP
firewall-cmd --remove-masquerade
1
2
3
4
# 将8080端口转发到80
firewall-cmd --add-forward-port=port=8080:proto=tcp:toport=80
# ssh端口转发
firewall-cmd --add-forward-port=port=2222:proto=tcp:toport=22:toaddr=192.168.1.2

富规则

  • 规则
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 选项
rule
[source]
[destination]
service|port|protocol|icmp-block|icmp-type|masquerade|forward-port|source-port
[log|nflog]
[audit]
[accept|reject|drop|mark]

rule
# 策略设置了ip地址则必须设置此项
[family="ipv4|ipv6"]
# 优先级,取值范围-32768to32767,0位默认值,低于0则优先于所有策略
[priority="priority"]

# 源地址,可以是IP地址、IP网段、mac地址或ipset
source [not] address="address[/mask]"|mac="mac-address"|ipset="ipset"
# 目的地址,方法同源地址
destination [not] address="address[/mask]"|ipset="ipset"
# 服务
service name="service name"
# 端口,可以设置为端口范围,如port=0-65535
port port="port value" protocol="tcp|udp"
# 源端口,方法同端口
source-port port="port value" protocol="tcp|udp"
# 网络层协议,具体见/etc/protocols
protocol value="protocol value"
# 对于数据包的处理结果,放行、拒接、丢弃、标记
[accept|reject|drop|mark]

# 转发端口,需要开启ip伪装
forward-port port="port value" protocol="tcp|udp" to-port="port value" to-addr="address"
  • 相关命令
1
2
3
4
5
6
7
8
# 查看规则列表
--list-rich-rules
# 添加规则
--add-rich-rule=<rule>
# 移除规则
--remove-rich-rule=<rule>
# 查询规则
--query-rich-rule=<rule>
  • 实例
1
2
3
4
5
6
7
8
9
10
11
12
# 允许源网段为192.168.1.0/24的地址访问http服务
firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 service name=http accept'
# 丢弃源IP地址为192.168.1.1访问http服务的数据包
firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.1.1 service name=http drop'
# 拒绝源IP地址为192.168.1.1访问http服务的数据包
firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.1.1 service name=http reject'
# 允许源IP地址为192.168.1.1访问tcp80端口
firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.1.1 port port=80 protocol=tcp accept'

# 允许源网段192.168.1.0/24通过2222端口ssh登录192.168.1.1,注意需要开启伪装IP
firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 forward-port port=2222 protocol=tcp to-port=22 to-addr=192.168.1.1'
firewall-cmd --add-masquerade --permanent

其他

1
2
3
4
5
6
# 拒绝所有数据包
firewall-cmd --panic-on
# 关闭拒绝状态
firewall-cmd --panic-off
# 查看是否拒绝
firewall-cmd --query-panic

参考
firewall-cmd
firewalld.richlanguage