1) „iptables“ je uživatelská aplikace, která se zabývá modulem jádra ip_tables. Zdá se, že již máte /bin/iptables, ale vaše jádro nezahrnuje/nenačte ip_tables.ko
2) pokud vaše jádro nepodporuje ip_tables, vaše distro jej může mít zahrnuto jako zaváděcí modul jádra na:
/lib/modules/`uname -r`/kernel/net/ipv4/netfilter/ip_tables.ko
kde uname -r
je verze jádra, tj. 3.5.0-18-generic
pokud najdete ip_tables.ko, můžete to zkusit
#depmod
#modprobe ip_tables
nebo
#insmod /lib/modules/`uname -r`/kernel/net/ipv4/netfilter/ip_tables.ko
v závislosti na tom, zda vaše distribuce obsahuje skutečné aplikace depmod/modprobe/insmod nebo ty implementované busyboxem, můžete narazit na další problémy, jako jsou relativní problémy s cestou nebo komprimované moduly jádra, které nejsou správně zpracovány v závislosti na verzi busybox.
3) pokud ip_tables.ko není k dispozici, musíte buď přestavět jádro s podporou ip_table, nebo jako externí zaváděcí modul. V posledním případě se po vytvoření ip_tables.ko vraťte na 2).
TL;DR
-
Aktualizujte své jádro:
sudo pacman -S linux
-
Aktualizujte svůj bootloader:
bootctl --path=/boot install
-
Restartovat
Dnes ráno jsem narazil na stejný problém, když jsem se snažil nakonfigurovat iptables:
[[email protected] /]# 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.
Používám verzi iptables:
[[email protected] /]# pacman -Q iptables
iptables 1.6.0-1
Co se stalo?
Existuje skutečně modul jádra ip_tables?
[[email protected] /]# /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
[[email protected] /]# modprobe ip_tables
modprobe: FATAL: Module ip_tables not found in directory /lib/modules/4.8.13-1-ARCH
hmmm.... Zdá se, že zmizel! Pojďme zjistit:1. Jaké jádro používá můj počítač?2. Podporuje iptables?
[[email protected] /]# uname -r
4.8.13-1-ARCH
[[email protected] /]# cat /proc/sys/kernel/osrelease
4.8.13-1-ARCH
[[email protected] /]# zgrep IPTABLES /proc/config.gz
CONFIG_IP_NF_IPTABLES=m
CONFIG_IP6_NF_IPTABLES=m
Ok.... To je zvláštní, protože je to standardní jádro Arch Linuxu a podporuje iptables.
Podívejme se, zda jsou k dispozici nějaké moduly netfilter (byl bych velmi překvapen, kdyby nebyly, protože je velmi nepravděpodobné, že by je něco smazalo):
[[email protected] /]# 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
Takže tady je vodítko; zdá se, že mám chybnou shodu jádra (existují moduly jádra pro verzi jádra:/lib/modules/4.9.11-1, která neodpovídá jádru běžícímu na mém počítači - 4.9.13-1). Pojďme se tedy podívat, zda jsou k dispozici nějaké moduly pro jádro běžící na mém počítači:
[[email protected] /]# ls /lib/modules/4.8.13-1-ARCH
ls: cannot access '/lib/modules/4.8.13-1-ARCH': No such file or directory
Ani náhodou! Takže toto je s největší pravděpodobností hlavní příčina problému; jádro běžící na mém počítači nemá žádné zaváděcí moduly (není dobré). Zkusme to opravit aktualizací (v mém případě downgradem) jádra, protože používám standardní jádro Arch Linux, které je pod kontrolou verzí pacmana, mohu jednoduše spustit pacman a aktualizovat jej (pokud používáte vlastní jádro, které je problém, který budete schopni vyřešit):
[[email protected] /]# sudo pacman -S linux
...
Packages (1) linux-4.9.11-1
...
Skvělý! pacman nainstaluje jádro 4.9.11-1, což je to, které chci (mám moduly pro toto jádro - netuším, jak jsem nakonec získal jádro 4.9.13). Nechte pacmana dokončit instalaci.
Nakonec se musím ujistit, že toto jádro bude použito při zavádění počítače. Potřebuji tedy aktualizovat boot manager (používám systemd-boot).- Mám bootovací oddíl, který je připojen k /boot- Smažte soubor loader.conf:/boot/loader/loader.conf (bude aktualizován při spuštění bootctl níže a bootctl jej neaktualizuje, pokud již existuje)- Spusťte bootctl a aktualizujte správce spouštění:
[[email protected] /]$ bootctl --path=/boot install
Nyní restartujte počítač.... Když se restartuje, měl by používat nové (downgradované) jádro!
Jakmile je spuštěno a vy jste přihlášeni, zkontrolujte verzi jádra, abyste se ujistili, že běží správné jádro:
[[email protected] /]$ uname -r
4.9.11-1-ARCH
Nyní zkuste spustit původní příkaz (pro nastavení sdílení internetu iptables)
[[email protected] /]$ sudo iptables -t nat -A POSTROUTING -o enp0s31f6 -j MASQUERADE
[[email protected] /]$ sudo iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
[[email protected] /]$ sudo iptables -A FORWARD -i enp0s20f0u4u3 -o enp0s31f6 -j ACCEPT
Woo-hoo Problém vyřešen! (Všimněte si, že jsem se přihlásil jako uživatel root, abych tento problém vyřešil – nedoporučoval bych to dělat, pokud si nejste jisti, že víte, co děláte!)