我在 Raspberry PI 上使用 iptables 时遇到了问题。
我刚刚在 PI 上下载了新版本的 Raspbian Lite,我试图检查 iptables 规则,但它不起作用,并且出现了此错误:>> iptables -L
iptables/1.8.2 Failed to initialize nft: Protocol not supported
我不知道该怎么办?我可以回到旧版本的 iptables 吗?
请记住,我是 IT 界的一名真正的初学者。
答案1
解决方案是这里:内核升级后需要重启。最简单的方法当然是:
# as root
reboot
答案2
Raspbian 肯定遵循了 Debian 的上游:默认情况下,较新的iptables
用户空间工具使用nftables内核 API,而不是“传统” iptables 内核 API,如所述这里:
当前状态
注意:Debian Buster 默认使用 nftables 框架。
从 Debian Buster 开始,nf_tables 是使用 iptables 时的默认后端,通过 iptables-nft 层(即使用 nf_tables 内核子系统的 iptables 语法)。这也会影响 ip6tables、arptables 和 ebtables。
nftables
旨在iptables
用扩展功能完全替代,但实现方式却大不相同。无论如何都会保留一个兼容层,主要在用户空间工具中,但部分在内核中。这是对通常的iptables
“遗留”层的补充,该层仍将在内核中保留很长时间。
的较新版本iptables
正在使用此兼容层。可以通过运行(以 root 身份)轻松验证这一点iptables -V
。结果肯定是:
# iptables -V
iptables v1.8.2 (nf_tables)
虽然旧版本仍在发布:
# iptables-legacy -V
iptables v1.8.2 (legacy)
同时,我猜测您的内核由于某种原因不支持 nftables。
所以你可以:
在内核中获得对 nftables 的支持(可能至少
NFT_COMPAT
)。如果您保留了较旧的版本,则可能需要重新编译或升级它。如果此任务需要太多精力,您可以使用另一种选择,或者使用旧版本,
iptables
该版本将使用通常的 iptables 内核 API。上一个链接解释如何操作。以 root 用户身份执行(至少对于iptables
和ip6tables
,如果安装了 和 ,可能对于ebtables
和arptables
):切换到旧版本:
# update-alternatives --set iptables /usr/sbin/iptables-legacy # update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy # update-alternatives --set arptables /usr/sbin/arptables-legacy # update-alternatives --set ebtables /usr/sbin/ebtables-legacy
答案3
我的错误如下:
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
如果你仔细观察,sudo cat /var/log/docker.log
你会发现
Running iptables --wait -t nat -L -n failed with message: `iptables/1.8.7 Failed to initialize nft: Protocol not supported`, error: exit status 1
在 WSL2 上安装 docker
我遇到了同样的错误。我找到的修复方法来自这里:
https://dev.to/felipecrs/simply-run-docker-on-wsl2-3o8
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
希望有所帮助。
答案4
我尝试使用他们的便利脚本当 Docker 引擎尝试配置时,iptables
我遇到了同样的错误。这只发生在我的旧 Raspberry Pi B+ Rev 1.2 上,而不是 Raspi 3 B Rev 1.2 上。前者运行5.4.51-v7+
,后者运行5.4.51+
,两者在内核方面都应该是完全最新的。
为了修复该安装问题,我运行了update-alternatives
来自@AB 响应的命令,并修复sudo iptables -V
了显示iptables/1.8.2 Failed to initialize nft: Protocol not supported
问题iptables v1.8.2 (legacy)
。
但是,在此之后尝试运行 Docker 的 iptables 命令时:
$ sudo iptables --wait -t nat -L -n
iptables v1.8.2 (legacy): can't initialize iptables table `nat':
Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.
现在,修复的方法那是为了启用iptable
@AB 所说的“遗留”层就像这样(@conrad 的回答):
sudo su -
modprobe ip_tables
echo 'ip_tables' >> /etc/modules
exit
重新启动以重新加载内核模块后,我检查了 docker systemd 服务是否已开始使用sudo systemctl status docker
并且是否正常运行。