TL; DR
Heute Morgen bin ich bei der Konfiguration von iptables auf das gleiche Problem gestoßen:
[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.
Ich verwende die iptables Version:
[root@office-pc /]# pacman -Q iptables iptables 1.6.0-1
Was ist passiert?
Gibt es das Kernel-Modul ip_tables tatsächlich?
[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
hmmm .... scheint es verschwunden zu haben! Finden wir heraus: 1. Welchen Kernel verwendet mein Computer? 2. Unterstützt es 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
Ok .... Dies ist merkwürdig, da es sich um einen Standard-Arch-Linux-Kernel handelt und iptables unterstützt.
Werfen wir einen Blick darauf, ob Netzfiltermodule verfügbar sind (ich wäre sehr überrascht, wenn dies nicht der Fall wäre, da es sehr unwahrscheinlich ist, dass etwas sie löscht):
[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
Also gibt es hier einen Hinweis; Anscheinend habe ich einen Kernel-Miss-Match (es gibt Kernel-Module für die Kernel-Version: /lib/modules/4.9.11-1, die nicht zum Kernel passen, der auf meinem Computer ausgeführt wird - 4.9.13-1). Schauen wir uns also an, ob Module für den Kernel auf meinem Rechner verfügbar sind:
[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
Nee! Daher ist dies höchstwahrscheinlich die Hauptursache des Problems. Der Kernel, der auf meiner Maschine läuft, hat keine ladbaren Module (nicht gut). Versuchen wir, das Problem zu beheben, indem Sie den Kernel aktualisieren (in meinem Fall ein Downgrade durchführen), da ich den Standard-Arch-Linux-Kernel unter pacman-Versionskontrolle verwende. Ich kann einfach pacman ausführen, um ihn zu aktualisieren (wenn Sie einen benutzerdefinierten Kernel verwenden.) ein Problem, das Sie lösen können):
[root@office-pc /]# sudo pacman -S linux ... Packages (1) linux-4.9.11-1 ...
Großartig! pacman installiert den Kernel 4.9.11-1, den ich will (ich habe Module für diesen Kernel - ich habe keine Ahnung, wie ich den Kernel 4.9.13 bekommen habe). Lassen Sie Pacman die Installation abschließen.
Schließlich muss ich sicherstellen, dass dieser Kernel beim Booten des Computers verwendet wird. Also muss ich den Bootmanager aktualisieren (ich benutze systemd-boot). - Ich habe eine Bootpartition, die an / boot angehängt ist. - Löschen Sie die Datei loader.conf: /boot/loader/loader.conf (diese wird aktualisiert, wenn bootctl unten ausgeführt wird, und bootctl aktualisiert sie nicht, wenn sie bereits vorhanden ist.) - Run bootctl, um den Bootmanager zu aktualisieren:
[root@office-pc /]$ bootctl --path=/boot install
Starten Sie jetzt den Computer neu ... Wenn er neu startet, sollte er den neuen (heruntergestuften) Kernel verwenden!
Nachdem Sie gebootet haben und sich angemeldet haben, überprüfen Sie die Kernel-Version, um sicherzustellen, dass der richtige Kernel ausgeführt wird:
[matt@office-pc /]$ uname -r 4.9.11-1-ARCH
Versuchen Sie nun, den Originalbefehl auszuführen (um die Internetfreigabe von iptables einzurichten)
[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
Woo-hoo Problem behoben! (Hinweis: Ich habe mich als Root-Benutzer angemeldet, um dieses Problem zu beheben. Ich würde das nicht empfehlen, wenn Sie nicht sicher sind, dass Sie wissen, was Sie tun!)