今天我的 iptables nat 在主机系统停止工作了,我不知道发生了什么!(我知道这很糟糕)
所有命令均以 root 用户身份执行。
如果我运行,$ iptables -t nat -L
我会收到以下错误消息:
$ iptables -t nat -L
iptables v1.4.7: can't initialize iptables table `nat': Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.
没有进一步的更新可用。我也用几个较旧的内核重新启动了服务器,但总是收到相同的错误消息。
我的服务器运行在 CentOS 上,带有最新版本的官方 OpenVZ 内核。
$ uname -r
2.6.32-042stab088.4
还测试了内核版本:2.6.32-042stab85.20 和 2.6.32-042stab084.26
grub.conf 中的第一个内核:
title OpenVZ (2.6.32-042stab088.4)
root (hd0,1)
kernel /vmlinuz-2.6.32-042stab088.4 ro root=/dev/md2 rd_NO_LUKS rd_NO_DM nomodeset crashkernel=auto SYSFONT=latarcyrheb-sun16 LANG=en_US.UTF-8 KEYTABLE=de
initrd /initramfs-2.6.32-042stab088.4.img
安装了以下更新:
$ rpm -qa --last
vzctl-4.7.2-1.x86_64 Mon 05 May 2014 03:25:16 AM CEST
vzctl-core-4.7.2-1.x86_64 Mon 05 May 2014 03:25:14 AM CEST
util-linux-ng-2.17.2-12.14.el6_5.x86_64 Wed 30 Apr 2014 11:37:19 PM CEST
libuuid-2.17.2-12.14.el6_5.x86_64 Wed 30 Apr 2014 11:37:18 PM CEST
libblkid-2.17.2-12.14.el6_5.x86_64 Wed 30 Apr 2014 11:37:18 PM CEST
vzkernel-2.6.32-042stab088.4.x86_64 Mon 26 Apr 2014 09:01:00 AM CEST
nss-softokn-freebl-3.14.3-10.el6_5.x86_64 Sat 26 Apr 2014 09:01:00 AM CEST
nss-softokn-3.14.3-10.el6_5.x86_64 Sat 26 Apr 2014 09:01:00 AM CEST
bridge-utils-1.2-10.el6.x86_64 Tue 15 Apr 2014 02:22:41 PM CEST
openssl-1.0.1e-16.el6_5.7.x86_64 Wed 09 Apr 2014 10:14:03 AM CEST
...
lsmod
给出以下内容:
$ lsmod | grep ip
iptable_nat 6302 0
nf_nat 23213 2 iptable_nat,vzrst
nf_conntrack_ipv4 9946 3 iptable_nat,nf_nat
nf_defrag_ipv4 1531 1 nf_conntrack_ipv4
nf_conntrack 80281 5 iptable_nat,vzrst,nf_nat,nf_conntrack_ipv4,vzcpt
ip6t_REJECT 4711 0
ip6table_mangle 3669 0
ip6table_filter 3033 0
ip6_tables 18988 2 ip6table_mangle,ip6table_filter
iptable_mangle 3493 0
iptable_filter 2937 0
xt_multiport 2716 0
ipt_REJECT 2399 0
ip_tables 18119 3 iptable_nat,iptable_mangle,iptable_filter
ipv6 322519 35 vzrst,ip6t_REJECT,ip6table_mangle
运行 modprobe 出现以下错误:
$ modprobe /lib/modules/2.6.32-042stab088.4/kernel/net/ipv4/netfilter/iptable_nat.ko
FATAL: Module /lib/modules/2.6.32_042stab088.4/kernel/net/ipv4/netfilter/iptable_nat.ko not found.
但该文件确实存在:
$ ll /lib/modules/2.6.32-042stab088.4/kernel/net/ipv4/netfilter/iptable_nat.ko
-rwxr--r-- 1 root root 16K Apr 3 16:20 /lib/modules/2.6.32-042stab088.4/kernel/net/ipv4/netfilter/iptable_nat.ko*
有任何想法吗?
答案1
由于 vzctl 从 4.6 更新到 4.7,他们将 nf_conntrack 的设置更改为默认禁用。(https://openvz.org/Download/vzctl/4.7/changes)
对应的提交信息:
...
默认禁用 VE0 的 conntrack
IP conntrack 功能对 venet 性能有一定负面影响(约 10%),因此最好默认禁用它们。
...
(来源:http://git.openvz.org/?p=vzctl;a=commit;h=a191a462579ee)
解决方案:
根据发行版的不同,它位于 /etc 目录中的某个位置。找到它:
$ sudo grep -R “选项 nf_conntrack ip_conntrack_disable_ve0=1” /etc/modprobe.d/
并将“1”替换为“0”:
选项 nf_conntrack ip_conntrack_disable_ve0=0
重启系统
重新启动的替代方案:
rmmod iptable_nat
rmmod nf_nat
rmmod nf_conntrack_ipv4
rmmod nf_conntrack
现在 nat 正在工作
所有来源:
vzctl 4.7 的变更日志:https://openvz.org/Download/vzctl/4.7/changes
在评论中报告错误并附上解决方案:https://bugzilla.openvz.org/show_bug.cgi?id=2943
带有简短解决方案描述的错误报告:https://bugzilla.openvz.org/show_bug.cgi?id=2755#c4
对应的 GIT 提交:http://git.openvz.org/?p=vzctl;a=commit;h=a191a462579ee
答案2
您必须以超级用户身份才能运行iptables
。因此,请以 身份运行它root
。
$ iptables -t nat -L
iptables v1.4.19.1: can't initialize iptables table `nat': Permission denied (you must be root)
Perhaps iptables or your kernel needs to be upgraded.
# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
[...]
答案3
似乎文件确实有问题?如果您尝试 strace modprobe /lib/modules/2.6.32-042stab088.4/kernel/net/ipv4/netfilter/iptable_nat.ko 会怎样?系统真的会返回 ENOENT(没有这样的文件或目录)吗?我无法想象会是这样,但也许 SELinux 正在弄乱文件?最后,也许文件/文件系统已损坏。使用已知良好的版本对其进行 md5sum。或者直接删除它并完全复制一个新版本。希望不是文件系统的问题。
尝试这个:https://stackoverflow.com/questions/3140478/fatal-module-not-found-error-using-modprobe
答案4
我找到了另一个解决方案!在无法删除的节点上
rmmod iptable_nat
rmmod nf_nat
rmmod nf_conntrack_ipv4
rmmod nf_conntrack
在官方指南中,我发现:
vzctl 设置 VZID --netfilter full --save --setmode 重启