Gop*_*opi 8 linux kernel iptables modprobe
我们从供应商那里获得了一个自定义构建的 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.
Run Code Online (Sandbox Code Playgroud)
我也尝试使用 modprobe 但没有找到,而且 find 命令也没有找到。
# modprobe ip_tables
modprobe: FATAL: Module ip_tables not found.
# find / -name "ip_tables*"
#
Run Code Online (Sandbox Code Playgroud)
是否可以编译netfilter和iptables并集成它?我尝试编译整个内核,但由于某些未知因素,某些功能无法正常工作。因此,我需要将它们构建为内核模块并将其与我们现有的自定义发行版集成。
1) "iptables" 是处理 ip_tables 内核模块的用户级应用程序。看来您已经拥有 /bin/iptables 但您的内核尚未包含/加载 ip_tables.ko
2) 如果您的内核不支持 ip_tables,您的发行版可能会将它作为可加载的内核模块包含在:
/lib/modules/`uname -r`/kernel/net/ipv4/netfilter/ip_tables.ko
Run Code Online (Sandbox Code Playgroud)
uname -r
内核版本在哪里,即 3.5.0-18-generic
如果你找到 ip_tables.ko 你可以试试
#depmod
#modprobe ip_tables
Run Code Online (Sandbox Code Playgroud)
或者
#insmod /lib/modules/`uname -r`/kernel/net/ipv4/netfilter/ip_tables.ko
Run Code Online (Sandbox Code Playgroud)
取决于您的发行版是否包含真正的 depmod/modprobe/insmod 应用程序或由 busybox 实现的应用程序,您可能会遇到一些其他问题,例如相对路径问题或压缩内核模块未正确处理,具体取决于 busybox 版本。
3) 如果 ip_tables.ko 不可用,您必须使用 ip_table 支持或作为外部可加载模块重建内核。在创建 ip_tables.ko 后的最后一种情况下返回到 2)。
TL; 博士
更新内核: 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.
Run Code Online (Sandbox Code Playgroud)
我正在使用 iptables 版本:
[root@office-pc /]# pacman -Q iptables
iptables 1.6.0-1
Run Code Online (Sandbox Code Playgroud)
发生了什么事?
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
Run Code Online (Sandbox Code Playgroud)
嗯......似乎它已经消失了!让我们找出: 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
Run Code Online (Sandbox Code Playgroud)
好的.... 这很奇怪,因为它是标准的 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
Run Code Online (Sandbox Code Playgroud)
所以这里有一个线索;看来我的内核不匹配(内核版本的内核模块:/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
Run Code Online (Sandbox Code Playgroud)
不!所以这很可能是问题的根本原因;在我的机器上运行的内核没有任何可加载的模块(不好)。让我们尝试通过更新(在我的情况下,降级)内核来修复它,因为我使用的是 pacman 版本控制下的标准 Arch Linux 内核,我可以简单地运行 pacman 来更新它(如果您使用的是自定义内核您将能够解决的问题):
[root@office-pc /]# sudo pacman -S linux
...
Packages (1) linux-4.9.11-1
...
Run Code Online (Sandbox Code Playgroud)
伟大的!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
Run Code Online (Sandbox Code Playgroud)
现在重新启动计算机......当它重新启动时,它应该使用新的(降级的)内核!
一旦启动并登录,请检查内核版本以确保正确的内核正在运行:
[matt@office-pc /]$ uname -r
4.9.11-1-ARCH
Run Code Online (Sandbox Code Playgroud)
现在尝试运行原始命令(设置 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
Run Code Online (Sandbox Code Playgroud)
呜呼问题已解决!(请注意,我以 root 用户身份登录以解决此问题 - 除非您确信自己知道自己在做什么,否则我不建议这样做!)