Las reglas de iptables no funcionan para permitir una IP específica

Las reglas de iptables no funcionan para permitir una IP específica

Tengo un host con 2 interfaces de red: wifi y vpn sitio-sitio (nivel cero).

root@host:~# ifconfig wlp0s20f3
wlp0s20f3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.38  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::a098:2166:78af:d78d  prefixlen 64  scopeid 0x20<link>
        ether ac:12:03:ab:6e:31  txqueuelen 1000  (Ethernet)
        RX packets 1071869  bytes 1035656551 (1.0 GB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 911450  bytes 134092251 (134.0 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


root@host:~# ifconfig ztklh3tu4b
ztklh3tu4b: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 2800
        inet 10.147.18.192  netmask 255.255.255.0  broadcast 10.147.18.255
        inet6 fe80::f8f6:d1ff:fe3d:4f09  prefixlen 64  scopeid 0x20<link>
        ether fa:f6:d1:3d:4f:09  txqueuelen 1000  (Ethernet)
        RX packets 8836  bytes 1146994 (1.1 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 667  bytes 281732 (281.7 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Quiero bloquear todo el tráfico (tanto entrante como saliente) a este host, excepto una IP detrás de la VPN. Entonces agregué las siguientes reglas de iptable:

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -A INPUT -s 10.147.18.80 -j ACCEPT
iptables -A OUTPUT -d 10.147.18.80 -j ACCEPT

Cuando hago ping a este 10.147.18.80, no puedo hacerlo. Aquí están los resultados del ping:

PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
^C
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3067ms

root@host:~# ping 10.147.18.80
PING 10.147.18.80 (10.147.18.80) 56(84) bytes of data.
^C
--- 10.147.18.80 ping statistics ---
6 packets transmitted, 0 received, 100% packet loss, time 5097ms

Cuando cambio la IP en la regla iptables para que sea algo así como 8.8.8.8, todo funciona como se esperaba, es decir, no puedo comunicarme con nada excepto 8.8.8.8.

Editar El siguiente resultado de iptables -nvL muestra las cadenas:

root@host:~# iptables -nvL
Chain INPUT (policy DROP 23 packets, 4560 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  *      *       10.147.18.80         0.0.0.0/0           

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy DROP 330 packets, 25776 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    8   672 ACCEPT     all  --  *      *       0.0.0.0/0            10.147.18.80         

El resultado anterior de iptables muestra que los paquetes se envían a la IP pero no se recibe respuesta cuando las reglas están vigentes.

Tcpdump en mi host muestra el mismo comportamiento:

tcpdump: data link type LINUX_SLL2
tcpdump: listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes


13:28:32.323064 ztklh3tu4b Out IP (tos 0x0, ttl 64, id 17342, offset 0, flags [DF], proto ICMP (1), length 84)
    10.147.18.192 > 10.147.18.80: ICMP echo request, id 61, seq 1, length 64
13:28:33.330145 ztklh3tu4b Out IP (tos 0x0, ttl 64, id 17567, offset 0, flags [DF], proto ICMP (1), length 84)
    10.147.18.192 > 10.147.18.80: ICMP echo request, id 61, seq 2, length 64
13:28:34.354178 ztklh3tu4b Out IP (tos 0x0, ttl 64, id 17694, offset 0, flags [DF], proto ICMP (1), length 84)
    10.147.18.192 > 10.147.18.80: ICMP echo request, id 61, seq 3, length 64
13:28:35.378135 ztklh3tu4b Out IP (tos 0x0, ttl 64, id 17714, offset 0, flags [DF], proto ICMP (1), length 84)
    10.147.18.192 > 10.147.18.80: ICMP echo request, id 61, seq 4, length 64

Tcpdump en 10.147.18.80 no muestra ninguna solicitud de eco ICMP entrante desde 10.147.18.192. ¿Qué pudo haber salido mal?

Respuesta1

Si está utilizando un cliente VPN en este host para crear la segunda interfaz, no olvide tambiénpermitir conexiones al servidor VPN10.147.18.192; de lo contrario, ya no será posible acceder a su IP local .

Deberá permitir al menos el tráfico entrante y saliente hacia/desde el servidor VPN en la interfaz wlp0s20f3:

iptables -I OUTPUT -d $vpn_server_ip -p $proto --dport $vpn_port -j ACCEPT
iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

$proto será udpo tcp, y $vpn_server_ip: $vpn_portla dirección IP o rango y puerto de los servidores VPN

No puedo ayudar mucho a adivinar estos valores, pero su documentación de VPN o tcpdump/wireguard con una conexión establecida y funcional al túnel VPN deberían brindarle esta información.

Respuesta2

Estos dos comandos que mencionas en tu pregunta:

iptables -A INPUT -s 10.147.18.80 -j ACCEPT
iptables -A OUTPUT -d 10.147.18.80 -j ACCEPT

Añaden esas reglas al final de las cadenas. -ALa opción agrega la regla al final. Si usa -Ila opción, pondrá la regla en la parte superior de la cadena.

El problema aquí es que probablemente ya tenga una regla DROPo REJECT, antes de la ACCEPTregla en una de las cadenas, que elimina el tráfico antes de que llegue al final de la cadena. Como, por ejemplo, una regla que reduce el tráfico hacia o desde una subred completa que contiene la IP 10.147.18.80.

Si tiene una regla en una cadena que descarta/rechaza el tráfico a esa IP, o desde esa IP, dependiendo de si es una cadena de ENTRADA o SALIDA, antes de la regla ACEPTAR, entonces, si la regla especifica solo esa IP o toda la subred, el tráfico se elimina y todas las demás reglas de la cadena ya no se procesan.

DROP, REJECT, ACCEPTson objetivos finales, una vez que iptables coincide con esa regla, deja de procesar otras reglas en la cadena y no pasa a la siguiente regla.

Intentar

iptables -I INPUT -s 10.147.18.80 -j ACCEPT
iptables -I OUTPUT -d 10.147.18.80 -j ACCEPT

Esto colocará esas reglas en la parte superior de las cadenas, de modo que sean las primeras reglas en ser alcanzadas, y luego no se procesarán otras reglas para ese tráfico en esas cadenas.

Puedes enumerar todas las reglas en una cadena con algo como

iptables -nvL

o si quieres ver solo cadenas específicas

iptables -nvL INPUT 
iptables -nvL OUTPUT

EDITAR

Dado el resultado que pegó y el hecho de que puede hacer ping si cambia las acciones predeterminadas a ACCEPTesto, no parece ser el problema.

Puede usar algo como tcpdump para ver si el tráfico va y se devuelve.

Un comando como este le proporcionará todos los paquetes icmp que envía o recibe la máquina

tcpdump -nnvvi any icmp

Si obtienes algo como esto en la salida

10:13:48.866598 IP (tos 0x0, ttl 255, id 30625, offset 0, flags [DF], proto ICMP (1), length 84)
    10.147.18.192 > 10.147.18.80: ICMP echo request, id 26621, seq 4, length 64
10:13:48.867771 IP (tos 0x0, ttl 53, id 0, offset 0, flags [none], proto ICMP (1), length 84)
    10.147.18.80 > 10.147.18.192: ICMP echo reply, id 26621, seq 4, length 64

Luego, sus paquetes de ping se envían y devuelven, pero alguna otra regla los rechaza.

Puede verificar si tal vez tenga otras reglas en otras tablas como nat o mingle table, si tal vez algunas de las reglas allí estén en conflicto con el tráfico.

iptables -t nat -nvL
iptables -t mingle -nvL

También puede ver si los paquetes pasan por la regla ACEPTAR en la cadena de SALIDA mediante el número que aparece a continuación pktsen el listado. Si ese número aumenta después de intentar hacer ping, pero el número en la cadena INPUT permanece en 0, entonces el problema está en las reglas de tráfico entrante.

También verifique sus rutas, con ip run comando o algo similar, si tal vez el tráfico no sale a través de la interfaz en la misma subred, por lo que la IP de origen de los paquetes que devuelven puede cambiar debido a algunas reglas NAT en el camino.

información relacionada