我已通过运行update-alternatives --set iptables /usr/sbin/iptables-nft
并重新启动服务器将 Ubuntu Focal 服务器防火墙后端从旧版 iptables 迁移到 netfilter。现在显示的所有表iptables-legacy -S
都是空的,但是当我运行时,iptables -S
最后一行总是显示:
# Warning: iptables-legacy tables present, use iptables-legacy to see them
从那时起,我就iptables-legacy
使用以下命令从替代方案中删除了它:
update-alternatives --remove iptables /usr/sbin/iptables-legacy
现在只显示 netfilter 版本
root@iBug-Server:~# update-alternatives --display iptables
iptables - auto mode
link best version is /usr/sbin/iptables-nft
link currently points to /usr/sbin/iptables-nft
link iptables is /usr/sbin/iptables
slave iptables-restore is /usr/sbin/iptables-restore
slave iptables-save is /usr/sbin/iptables-save
/usr/sbin/iptables-nft - priority 20
slave iptables-restore: /usr/sbin/iptables-nft-restore
slave iptables-save: /usr/sbin/iptables-nft-save
我怎样才能消除这个警告?
答案1
正如错误消息所示,这是因为存在旧版(非 netfilter)iptables 子系统。最常见的原因是iptables-legacy
调用了该命令,从而加载了旧版模块。
有 5 个模块与旧版 iptables 相关,每个表一个。(笔记:模块名称以 开头iptable_
,这里没有 S)
iptable_filter
iptable_nat
iptable_mangle
iptable_raw
iptable_security
当其中任何一个被加载时,iptables-nft
就会判定存在遗留的 iptables,并发出上述警告。
类似地,对于旧版 IPv6 iptables 还有 5 个模块,每个模块都以ip6table_
(这里也没有 S)开头。
迁移到 netfilter 后,可以安全地删除这 10 个模块rmmod
并将其列入黑名单。
再次注意这里使用blacklist iptable_filter
不起作用,因为该指令只能防止自动加载,而不能防止通过modprobe(8)
或其他命令进行手动加载。此解决方案使用install <modulename> /bin/false
应该在任何情况下都能正确阻止模块加载。
答案2
docker
运行 Ubuntu 22.04 安装程序时选择软件包后出现此警告。(当我跳过选择软件包并手动安装 Docker 时,没有收到此警告。)
迁移到 netfilter 后,可以使用 rmmod 安全地删除这 10 个模块并将其列入黑名单。
如果任何规则导致使用 10 个模块之一,当您尝试删除该模块时,您将收到以下错误
# modprobe -r iptable_nat
modprobe: FATAL: Module iptable_nat is in use.
为了彻底摆脱,# Warning: iptables-legacy tables present
我需要彻底消灭iptables
、、ip6tables
和iptables-legacy
。ip6tables-legacy
检查所有四个,并检查是否需要将 s 对中的任何内容legacy
合并到相应的非对中legacy
。legacy
下面,在确定我不需要合并来自 s 的任何增量后,我使用已保存的非s 文件legacy
。
iptables-save > iptables-save.txt
ip6tables-save > ip6tables-save.txt
iptables-legacy-save > iptables-legacy-save.txt
ip6tables-legacy-save > ip6tables-legacy-save.txt
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -F
iptables -X
ip6tables -P INPUT ACCEPT
ip6tables -P FORWARD ACCEPT
ip6tables -P OUTPUT ACCEPT
ip6tables -t nat -F
ip6tables -t nat -X
ip6tables -t mangle -F
ip6tables -t mangle -X
ip6tables -F
ip6tables -X
iptables-legacy -P INPUT ACCEPT
iptables-legacy -P FORWARD ACCEPT
iptables-legacy -P OUTPUT ACCEPT
iptables-legacy -t nat -F
iptables-legacy -t nat -X
iptables-legacy -t mangle -F
iptables-legacy -t mangle -X
iptables-legacy -F
iptables-legacy -X
ip6tables-legacy -P INPUT ACCEPT
ip6tables-legacy -P FORWARD ACCEPT
ip6tables-legacy -P OUTPUT ACCEPT
ip6tables-legacy -t nat -F
ip6tables-legacy -t nat -X
ip6tables-legacy -t mangle -F
ip6tables-legacy -t mangle -X
ip6tables-legacy -F
ip6tables-legacy -X
for x in _raw _mangle _security _nat _filter; do
modprobe -r "iptable${x}"
modprobe -r "ip6table${x}"
done
iptables-restore < iptables-save.txt
ip6tables-restore < ip6tables-save.txt
你还需要运行
update-alternatives --remove iptables /usr/sbin/iptables-legacy
请查阅有关 的其他资源update-alternatives
,从 iptables 迁移到 nft,以及在机器连接到网络时完全清除 iptables 的安全影响。如果您安装了 Docker,您将无法这样做,apt-get purge iptables
因为它是 的依赖项docker-ce
。