我有一台 CentOS7 机器,我使用firewalld作为防火墙。最近我使用以下方法添加了一些规则firewall-cmd
:
# Removing DOCKER-USER CHAIN (it won't exist at first)
firewall-cmd --permanent --direct --remove-chain ipv4 filter DOCKER-USER
# Flush rules from DOCKER-USER chain (again, these won't exist at first; firewalld seems to remember these even if the chain is gone)
firewall-cmd --permanent --direct --remove-rules ipv4 filter DOCKER-USER
# Add the DOCKER-USER chain to firewalld
firewall-cmd --permanent --direct --add-chain ipv4 filter DOCKER-USER
# Add rules (see comments for details)
firewall-cmd --permanent --direct --add-rule ipv4 filter DOCKER-USER 0 -j REJECT -i eth0 -dport 27017
我重新启动并检查了direct.xml
文件;规则在那里。我使用防火墙命令检查并查看了链和规则:
firewall-cmd --permanent --direct --get-rules ipv4 filter DOCKER-USER
0 -j REJECT -i eth0 -dport 27017
但是,如果我执行iptables -nvL
,我在任何地方都看不到该链:
iptables -nvL |grep DOCKER
0 0 DOCKER-ISOLATION all -- * * 0.0.0.0/0 0.0.0.0/0
0 0 DOCKER all -- * docker0 0.0.0.0/0 0.0.0.0/0
Chain DOCKER (1 references)
Chain DOCKER-ISOLATION (1 references)
如果我使用firewall-cmd
,则看不到使用iptables
其中任何一个出现的链。例如,我确实有一个f2b-sshd
由 fail2ban 创建的链,但它没有返回任何内容:
firewall-cmd --permanent --direct --get-rules ipv4 filter f2b-sshd
发生了什么事?我认为 iptables 和 firewalld 都只是操纵了底层内核,它们只是同一事物的不同接口。为什么其中一个看不到另一个创建的规则?哪些规则占上风?
答案1
好的,我查看了错误日志。
firewalld[573]: ERROR: '/usr/sbin/iptables-restore -w -n' failed: iptables-restore v1.4.21: The -t option (seen in line 3) cannot be used in iptables-restore.
所以这就是规则没有出现的原因:它们没有被应用。
现在的问题是:如何使用firewalld向给定的表或链添加规则......
答案2
为了能够将 iptables 与 firewalld 一起使用,您需要确保将 firewalld.conf 文件配置为 FirewallBackend=iptables。它的默认值是 nftables,但如果您将其设置为 iptables 并重新启动 firewalld,您将能够像我们习惯的那样使用 iptables。