1) "iptables" es la aplicación de usuario que se ocupa del módulo del kernel ip_tables. Parece que ya tiene /bin/iptables pero su kernel no ha incluido/cargado ip_tables.ko
2) si su kernel no es compatible con ip_tables, es posible que su distribución lo tenga incluido como un módulo de kernel cargable en:
/lib/modules/`uname -r`/kernel/net/ipv4/netfilter/ip_tables.ko
donde uname -r es la versión del kernel, es decir, 3.5.0-18-generic
si encuentra ip_tables.ko puede probar
#depmod
#modprobe ip_tables
o
#insmod /lib/modules/`uname -r`/kernel/net/ipv4/netfilter/ip_tables.ko
dependiendo de si su distribución incluye aplicaciones depmod/modprobe/insmod reales o las implementadas por busybox, es posible que se encuentre con algunos problemas adicionales, como problemas de ruta relativa o módulos de kernel comprimidos que no se manejen correctamente según la versión de busybox.
3) si ip_tables.ko no está disponible, debe reconstruir el kernel con soporte para ip_table o como un módulo externo que se pueda cargar. En el último caso, después de crear ip_tables.ko, vuelva a 2).
TL;DR
-
Actualice su núcleo:
sudo pacman -S linux -
Actualice su gestor de arranque:
bootctl --path=/boot install -
Reiniciar
Esta mañana me encontré con este mismo problema al intentar configurar iptables:
[example@unixlinux.online /]# 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.
Estoy usando la versión de iptables:
[example@unixlinux.online /]# pacman -Q iptables
iptables 1.6.0-1
¿Qué ha pasado?
¿Existe realmente el módulo kernel ip_tables?
[example@unixlinux.online /]# /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
[example@unixlinux.online /]# modprobe ip_tables
modprobe: FATAL: Module ip_tables not found in directory /lib/modules/4.8.13-1-ARCH
hmmm.... ¡Parece que ha desaparecido! Averigüemos:1. ¿Qué kernel está usando mi computadora?2. ¿Es compatible con iptables?
[example@unixlinux.online /]# uname -r
4.8.13-1-ARCH
[example@unixlinux.online /]# cat /proc/sys/kernel/osrelease
4.8.13-1-ARCH
[example@unixlinux.online /]# zgrep IPTABLES /proc/config.gz
CONFIG_IP_NF_IPTABLES=m
CONFIG_IP6_NF_IPTABLES=m
Ok.... Esto es extraño porque es un kernel estándar de Arch Linux y es compatible con iptables.
Echemos un vistazo para ver si hay módulos de netfilter disponibles (me sorprendería mucho si no los hubiera porque es muy poco probable que algo los elimine):
[example@unixlinux.online /]# 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
Así que hay una pista aquí; parece que no coincide el kernel (hay módulos del kernel para la versión del kernel:/lib/modules/4.9.11-1 que no coincide con el kernel que se ejecuta en mi computadora - 4.9.13-1). Entonces, verifiquemos si hay módulos disponibles para el kernel que se ejecuta en mi máquina:
[example@unixlinux.online /]# ls /lib/modules/4.8.13-1-ARCH
ls: cannot access '/lib/modules/4.8.13-1-ARCH': No such file or directory
¡No! Por lo tanto, es muy probable que esta sea la causa raíz del problema; el núcleo que se ejecuta en mi máquina no tiene ningún módulo cargable (no es bueno). Intentemos solucionarlo actualizando (en mi caso, degradando) el kernel, porque estoy usando el kernel estándar de Arch Linux que está bajo el control de versión de pacman. Simplemente puedo ejecutar pacman para actualizarlo (si está usando un kernel personalizado que es un problema que podrás resolver):
[example@unixlinux.online /]# sudo pacman -S linux
...
Packages (1) linux-4.9.11-1
...
¡Excelente! pacman instalará el kernel 4.9.11-1, que es el que quiero (tengo módulos para este kernel; no tengo idea de cómo terminé obteniendo el Kernel 4.9.13). Deje que pacman complete la instalación.
Finalmente, necesito asegurarme de que este kernel se usará al arrancar la máquina. Entonces, necesito actualizar el administrador de arranque (estoy usando systemd-boot). Tengo una partición de arranque que está montada en /boot. Elimine el archivo loader.conf:/boot/loader/loader.conf (se actualizará cuando ejecute bootctl a continuación y bootctl no lo actualizará si ya existe) - Ejecute bootctl para actualizar el administrador de arranque:
[example@unixlinux.online /]$ bootctl --path=/boot install
Ahora reinicie la computadora... ¡Cuando se reinicie debería usar el kernel nuevo (rebajado)!
Una vez que haya arrancado y haya iniciado sesión, compruebe la versión del kernel para asegurarse de que se está ejecutando el kernel correcto:
[example@unixlinux.online /]$ uname -r
4.9.11-1-ARCH
Ahora intente ejecutar el comando original (para configurar el uso compartido de Internet de iptables)
[example@unixlinux.online /]$ sudo iptables -t nat -A POSTROUTING -o enp0s31f6 -j MASQUERADE
[example@unixlinux.online /]$ sudo iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
[example@unixlinux.online /]$ sudo iptables -A FORWARD -i enp0s20f0u4u3 -o enp0s31f6 -j ACCEPT
Woo-hoo ¡Problema solucionado! (Tenga en cuenta que inicié sesión como usuario raíz para solucionar este problema. ¡No recomendaría hacer esto a menos que esté seguro de que sabe lo que está haciendo!)