Firewalld
firewalld 是由红帽开发的防火墙守护进程。 默认使用 nftables 。据项目主页:
- Firewalld 提供了一个动态管理的防火墙,支持使用区域来标识网络连接/接口的可信等级。支持 IPv4、IPv6 防火墙设置、以太网桥接和 IP sets。使用分离的运行时配置和永久设置。也提供了一个接口用来直接为服务或应用添加防火墙规则。
安装[编辑 | 编辑源代码]
使用[编辑 | 编辑源代码]
你可以使用控制台工具 firewall-cmd
来控制防火墙规则。
firewall-offline-cmd
可在 firewalld 未运行时进行配置,与 firewall-cmd
类似。
随 firewalld包 带的 firewall-config
命令提供了一个图形界面。
配置[编辑 | 编辑源代码]
使用 firewall-cmd
可用于运行时更改配置
- 使用
--permanent
参数。这 不会 更改运行时配置直至防火墙服务重启,或使用--reload
重载规则。 - 持久化规则可见:#将运行时配置设为永久
区域[编辑 | 编辑源代码]
区域是一系列可用于指定接口的规则。
要查看当前区域及其应用的接口,使用:
# firewall-cmd --get-active-zones
一些命令(例如 add/remove port/service) 需要指定区域/
区域可以通过 --zone=zone_name
参数传递。
若未指定一个确切的区域,则使用默认区域。
区域信息[编辑 | 编辑源代码]
你可以列出所有区域的配置:
# firewall-cmd --list-all-zones
或指定一个区域
# firewall-cmd --info-zone=zone_name
更改接口区域[编辑 | 编辑源代码]
# firewall-cmd --zone=zone --change-interface=interface_name
此处 zone
是你想分配给接口的区域。
使用 NetworkManager 管理区域[编辑 | 编辑源代码]
NetworkManager 能够为不同的连接分配不同的区域。例如:将一个家庭 WiFi 分配到 "home" 区域, 将工作室 WiFi 分配到 "work" 区域,并将剩余 WiFi 分配到 "public" 区域。
列出连接配置:
$ nmcli connection show
将 "myssid" 设置为 "home" 区域:
$ nmcli connection modify myssid connection.zone home
默认区域[编辑 | 编辑源代码]
默认区域将会被自动应用到新的接口上,查询默认区域使用:
# firewall-cmd --get-default-zone
更改默认区域使用:
# firewall-cmd --set-default-zone=zone
服务[编辑 | 编辑源代码]
服务是为特定守护程序预配置的规则。例如匹配 SSH 的 服务 {{ic|ssh} 在被分配到一个区域后会开放 22 端口。
使用下面的命令列出所有可用的服务:
# firewall-cmd --get-services
查询特定服务的信息:
# firewall-cmd --info-service service_name
从区域中添加或移除服务[编辑 | 编辑源代码]
添加一个服务到区域:
# firewall-cmd --zone=zone_name --add-service service_name
移除服务:
# firewall-cmd --zone=zone_name --remove-service service_name
端口[编辑 | 编辑源代码]
可以直接在指定区域上开放端口:
# firewall-cmd --zone=zone_name --add-port port_num/protocol
此处 protocol
应为 tcp
或 udp
之一。
关闭端口使用带有相同的端口号和协议的 --remove-port
选项。
NAT 地址伪装[编辑 | 编辑源代码]
此命令与 iptables -t nat -A POSTROUTING -j MASQUERADE
具有相同的效果:
# firewall-cmd --zone=public --add-masquerade
从版本 1.0.0 开始,如果想要 NAT 地址伪装在不同的防火墙区域之间工作,您必须创建一个新的策略对象,用于过滤它们之间的流量:
# firewall-cmd --new-policy NAT_int_to_ext --permanent # firewall-cmd --permanent --policy NAT_int_to_ext --add-ingress-zone internal # firewall-cmd --permanent --policy NAT_int_to_ext --add-egress-zone public # firewall-cmd --permanent --policy NAT_int_to_ext --set-target ACCEPT
端口转发[编辑 | 编辑源代码]
如果你在路由器上配置了 firewalld,而且还如上开启了 NAT 地址伪装,则通过 firewalld 设置端口转发很简单:
# firewall-cmd --zone=public --add-forward-port=port=12345:proto=tcp:toport=22:toaddr=10.20.30.40
这会将外部端口上的 12345/tcp 端口转发到内部网络 10.20.30.40 的 22 (标准 SSH) 端口。移除此端口转发:
# firewall-cmd --zone=public --remove-forward-port=port=12345:proto=tcp:toport=22:toaddr=10.20.30.40
不幸的是你必须键入完整的转发声明以移除它,只指定端口和协议是不行的。
Rich 规则[编辑 | 编辑源代码]
通过使用 Rich 规则,可以以一种易于理解的方式创建更复杂的防火墙规则。
要添加 Rich 规则:
# firewall-cmd [--zone=zone_name] [--permanent] --add-rich-rule='rich_rule'
其中 rich_rule
是一条丰富语言规则。
如果要允许来所有的连接自网络 192.168.1.0/24
到 NFS service:
# firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="nfs" accept'
要允许来自 192.168.2.3
到端口 1234/tcp
的连接:
# firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.2.3" port port="1234" protocol="tcp" accept'
有关更多 Rich 规则语法,请参阅 firewalld.richlanguage(5)。
要删除 Rich 规则:
# firewall-cmd [--zone=zone_name] [--permanent] --remove-rich-rule='rich_rule'
提示和技巧[编辑 | 编辑源代码]
端口或服务有效时间[编辑 | 编辑源代码]
使用 --timeout=value
可以设置服务或端口的有效时间。时间默认为秒,m
后缀代表分钟, h
后缀代表小时。
例如:为 SSH 开放三小时的使用时间:
# firewall-cmd --add-service ssh --timeout=3h
将运行时配置设为永久[编辑 | 编辑源代码]
你可以将运行时配置持久化(这意味着重启后也会保留配置)
# firewall-cmd --runtime-to-permanent
检查服务配置[编辑 | 编辑源代码]
/usr/lib/firewalld/services/
存储了默认支持的服务的配置文件,/etc/firewalld/services/
存储了用户创建的服务文件。
移除程序/托盘图标[编辑 | 编辑源代码]
托盘图标与 firewalld包 一起打包。其自启动脚本位于 /etc/xdg/autostart/firewall-applet.desktop
可以被隐藏,参见 XDG Autostart#目录。另一种方法是,通过将其添加到 /etc/pacman.conf
中的 NoExtract 来阻止该文件的安装。