我们从供应商处获得了定制的 Linux 发行版,但该发行版并未启用 iptables。
root@xxxx:~# iptables -L
modprobe: FATAL: Module ip_tables not found.
iptables v1.4.21: can't initialize iptables table `filter': Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.
我也尝试使用 modprobe,但没有找到,并且 find 命令也没有找到任何东西。
# modprobe ip_tables
modprobe: FATAL: Module ip_tables not found.
# find / -name "ip_tables*"
#
是否可以编译 netfilter 和 iptables 并将其集成?我尝试编译整个内核,但由于某些未知因素,某些功能无法正常工作。因此,我需要将它们构建为内核模块并将其与我们现有的自定义发行版集成。
答案1
iptables
是处理ip_tables
内核模块的用户空间应用程序。似乎你已经有了,
/bin/iptables
但你的内核还没有包含/加载ip_tables.ko
如果您的内核不支持
ip_tables
您的发行版可能会将其作为可加载内核模块包含在以下位置:/lib/modules/$(uname -r)/kernel/net/ipv4/netfilter/ip_tables.ko
$(uname -r)
返回内核版本,即3.5.0-18-generic
。如果你发现
ip_tables.ko
你可以尝试# depmod # modprobe ip_tables
或者
# insmod /lib/modules/`uname -r`/kernel/net/ipv4/netfilter/ip_tables.ko
根据您的发行版是否包含真正的 depmod/modprobe/insmod 应用程序或由 busybox 实现的应用程序,您可能会遇到一些其他问题,例如相对路径问题或压缩内核模块无法正确处理(具体取决于 busybox 版本)。
如果
ip_tables.ko
不可用,则必须重建内核以提供ip_table
支持,或将其作为外部可加载模块。在最后一种情况下,创建后ip_tables.ko
返回步骤 2。
答案2
总结
更新你的内核:
sudo pacman -S linux
更新你的引导加载程序:
bootctl --path=/boot install
重启
今天早上我在尝试配置 iptables 时遇到了同样的问题:
[root@office-pc /]# iptables -t nat -A POSTROUTING -o enp0s31f6 -j MASQUERADE
iptables v1.6.0: can't initialize iptables table `nat': Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.
我正在使用 iptables 版本:
[root@office-pc /]# pacman -Q iptables
iptables 1.6.0-1
发生了什么事?
ip_tables 内核模块是否真的存在?
[root@office-pc /]# /lib/modules/`uname -r`/kernel/net/ipv4/netfilter/ip_tables.ko
bash: /lib/modules/4.8.13-1-ARCH/kernel/net/ipv4/netfilter/ip_tables.ko: No such file or directory
[root@office-pc /]# modprobe ip_tables
modprobe: FATAL: Module ip_tables not found in directory /lib/modules/4.8.13-1-ARCH
嗯……好像它消失了!让我们找出答案:1. 我的电脑使用什么内核?2. 它支持 iptables 吗?
[root@office-pc /]# uname -r
4.8.13-1-ARCH
[root@office-pc /]# cat /proc/sys/kernel/osrelease
4.8.13-1-ARCH
[root@office-pc /]# zgrep IPTABLES /proc/config.gz
CONFIG_IP_NF_IPTABLES=m
CONFIG_IP6_NF_IPTABLES=m
好的......这很奇怪,因为它是一个标准的 Arch Linux 内核,并且它支持 iptables。
让我们看看是否有任何可用的 netfilter 模块(如果没有我会感到非常惊讶因为不太可能有东西会删除它们):
[root@office-pc /]# ls /lib/modules/*/kernel/net/*/netfilter/
/lib/modules/4.9.11-1-ARCH/kernel/net/bridge/netfilter/:
ebt_802_3.ko.gz ebtables.ko.gz ebt_dnat.ko.gz ebt_log.ko.gz ebt_pkttype.ko.gz ebt_vlan.ko.gz nft_reject_bridge.ko.gz
ebtable_broute.ko.gz ebt_among.ko.gz ebt_ip6.ko.gz ebt_mark.ko.gz ebt_redirect.ko.gz nf_log_bridge.ko.gz
ebtable_filter.ko.gz ebt_arp.ko.gz ebt_ip.ko.gz ebt_mark_m.ko.gz ebt_snat.ko.gz nf_tables_bridge.ko.gz
ebtable_nat.ko.gz ebt_arpreply.ko.gz ebt_limit.ko.gz ebt_nflog.ko.gz ebt_stp.ko.gz nft_meta_bridge.ko.gz
/lib/modules/4.9.11-1-ARCH/kernel/net/ipv4/netfilter/:
arptable_filter.ko.gz ip_tables.ko.gz nf_conntrack_ipv4.ko.gz nf_nat_pptp.ko.gz nft_dup_ipv4.ko.gz
arp_tables.ko.gz ipt_ah.ko.gz nf_defrag_ipv4.ko.gz nf_nat_proto_gre.ko.gz nft_masq_ipv4.ko.gz
arpt_mangle.ko.gz ipt_CLUSTERIP.ko.gz nf_dup_ipv4.ko.gz nf_nat_snmp_basic.ko.gz nft_redir_ipv4.ko.gz
iptable_filter.ko.gz ipt_ECN.ko.gz nf_log_arp.ko.gz nf_reject_ipv4.ko.gz nft_reject_ipv4.ko.gz
iptable_mangle.ko.gz ipt_MASQUERADE.ko.gz nf_log_ipv4.ko.gz nf_tables_arp.ko.gz
iptable_nat.ko.gz ipt_REJECT.ko.gz nf_nat_h323.ko.gz nf_tables_ipv4.ko.gz
iptable_raw.ko.gz ipt_rpfilter.ko.gz nf_nat_ipv4.ko.gz nft_chain_nat_ipv4.ko.gz
iptable_security.ko.gz ipt_SYNPROXY.ko.gz nf_nat_masquerade_ipv4.ko.gz nft_chain_route_ipv4.ko.gz
/lib/modules/4.9.11-1-ARCH/kernel/net/ipv6/netfilter/:
ip6table_filter.ko.gz ip6t_ah.ko.gz ip6t_mh.ko.gz nf_conntrack_ipv6.ko.gz nf_reject_ipv6.ko.gz nft_redir_ipv6.ko.gz
ip6table_mangle.ko.gz ip6t_eui64.ko.gz ip6t_NPT.ko.gz nf_defrag_ipv6.ko.gz nf_tables_ipv6.ko.gz nft_reject_ipv6.ko.gz
ip6table_nat.ko.gz ip6t_frag.ko.gz ip6t_REJECT.ko.gz nf_dup_ipv6.ko.gz nft_chain_nat_ipv6.ko.gz
ip6table_raw.ko.gz ip6t_hbh.ko.gz ip6t_rpfilter.ko.gz nf_log_ipv6.ko.gz nft_chain_route_ipv6.ko.gz
ip6table_security.ko.gz ip6t_ipv6header.ko.gz ip6t_rt.ko.gz nf_nat_ipv6.ko.gz nft_dup_ipv6.ko.gz
ip6_tables.ko.gz ip6t_MASQUERADE.ko.gz ip6t_SYNPROXY.ko.gz nf_nat_masquerade_ipv6.ko.gz nft_masq_ipv6.ko.gz
所以这里有一个线索;看来我的内核不匹配(内核模块的内核版本:/lib/modules/4.9.11-1 与我的计算机上运行的内核 4.9.13-1 不匹配)。因此,让我们检查一下我的机器上运行的内核是否有可用的模块:
[root@office-pc /]# ls /lib/modules/4.8.13-1-ARCH
ls: cannot access '/lib/modules/4.8.13-1-ARCH': No such file or directory
不!所以这很可能是问题的根本原因;我的机器上运行的内核没有任何可加载模块(不好)。让我们尝试通过更新(在我的情况下是降级)内核来修复它,因为我使用的是受 pacman 版本控制的标准 Arch Linux 内核,我只需运行 pacman 即可更新它(如果您使用的是自定义内核,这是一个您可以解决的问题):
[root@office-pc /]# sudo pacman -S linux
...
Packages (1) linux-4.9.11-1
...
太棒了!pacman 将安装内核 4.9.11-1,这是我想要的(我有这个内核的模块 - 我不知道我最终是如何获得内核 4.9.13 的)。让 pacman 完成安装。
最后,我需要确保在启动机器时将使用此内核。因此我需要更新启动管理器(我使用的是 systemd-boot)。 - 我有一个启动分区,它挂载到 /boot - 删除 loader.conf 文件:/boot/loader/loader.conf(在下面运行 bootctl 时它将被更新,如果它已经存在,bootctl 将不会更新它) - 运行 bootctl 来更新启动管理器:
[root@office-pc /]$ bootctl --path=/boot install
现在重新启动计算机....重新启动时它应该使用新的(降级的)内核!
一旦启动并登录,请检查内核版本以确保正确的内核正在运行:
[matt@office-pc /]$ uname -r
4.9.11-1-ARCH
现在尝试运行原始命令(设置 iptables 互联网共享)
[matt@office-pc /]$ sudo iptables -t nat -A POSTROUTING -o enp0s31f6 -j MASQUERADE
[matt@office-pc /]$ sudo iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
[matt@office-pc /]$ sudo iptables -A FORWARD -i enp0s20f0u4u3 -o enp0s31f6 -j ACCEPT
哇哦,问题解决了!(请注意,我以 root 用户身份登录来修复此问题 - 除非您确信自己知道自己在做什么,否则我不建议这样做!)