regras de iptables não funcionam para permitir um IP específico

regras de iptables não funcionam para permitir um IP específico

Eu tenho um host com 2 interfaces de rede: wifi e site-site vpn (zerotier).

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

Quero bloquear todo o tráfego (de entrada e de saída) para este host, exceto um IP atrás da VPN. Então adicionei as seguintes regras do 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

Quando faço ping neste 10.147.18.80, não consigo fazer isso. Aqui estão os resultados do 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

Quando mudo o IP na regra do iptables para algo como 8.8.8.8, tudo funciona conforme o esperado, ou seja, não consigo me comunicar com nada exceto 8.8.8.8.

Editar A seguinte saída de iptables -nvL mostra as cadeias:

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         

A saída acima do iptables mostra que os pacotes vão para o IP, mas nenhuma resposta é recebida quando as regras estão em vigor.

O Tcpdump no meu host mostra o mesmo comportamento:

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

O Tcpdump em 10.147.18.80 não mostra nenhuma solicitação de eco ICMP de entrada de 10.147.18.192. O que poderia ter dado errado?

Responder1

Se você estiver usando um cliente VPN neste host para criar a segunda interface, não se esqueça de tambémpermitir conexões com o servidor VPN, caso contrário, seu IP local 10.147.18.192não estará mais acessível.

Você precisará permitir pelo menos o tráfego de entrada e saída de/para o servidor VPN na interface 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á udpou tcp, e $vpn_server_ip: $vpn_porto endereço IP ou intervalo e porta do(s) servidor(es) VPN

Não posso ajudar muito em adivinhar esses valores, mas sua documentação da VPN ou tcpdump/wireguard com uma conexão estabelecida e funcional ao túnel VPN deve fornecer essas informações.

Responder2

Esses dois comandos que você menciona na sua pergunta:

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

Eles anexam essas regras ao final das cadeias. -Aopção anexa a regra ao final. Se você usar -Ia opção, colocará a regra no topo da cadeia.

A questão aqui é que você provavelmente já possui uma regra DROPou REJECT, antes da ACCEPTregra em uma das cadeias que interrompe o tráfego antes que ele chegue ao final da cadeia. Como, por exemplo, uma regra que descarta o tráfego de ou para uma sub-rede inteira que contém o IP 10.147.18.80.

Se você tiver uma regra em uma cadeia que descarta/rejeita o tráfego para esse IP, ou desse IP, dependendo se for uma cadeia INPUT ou OUTPUT, antes da regra ACCEPT, então se a regra especifica apenas esse IP ou toda a sub-rede, o tráfego é descartado e todas as outras regras da cadeia não são mais processadas.

DROP, REJECT, ACCEPTsão destinos finais, uma vez que o iptables corresponde a essa regra, ele para de processar outras regras na cadeia e não prossegue para a próxima regra.

Tentar

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

Isso colocará essas regras no topo das cadeias para que sejam as primeiras regras a serem atingidas, e outras regras não serão processadas para o tráfego nessas cadeias.

Você pode listar todas as regras em uma cadeia com algo como

iptables -nvL

ou se você quiser ver apenas cadeias específicas

iptables -nvL INPUT 
iptables -nvL OUTPUT

EDITAR

Dada a saída que você colou e o fato de você poder executar ping se alterar as ações padrão para ACCEPTisso, não parece ser o problema.

Você pode usar algo como tcpdump para ver se o tráfego está indo e sendo retornado.

Comando como este fornecerá todos os pacotes icmp enviados ou recebidos pela máquina

tcpdump -nnvvi any icmp

Se você obtiver algo assim na saída

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

Então seus pacotes de ping estão sendo enviados e retornados, mas sendo rejeitados por alguma outra regra.

Você pode verificar se possui outras regras em outras tabelas, como nat ou mingle table, se talvez algumas das regras estejam em conflito com o tráfego.

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

Você também pode ver se os pacotes estão passando pela regra ACCEPT na cadeia OUTPUT pelo número abaixo pktsna listagem. Se esse número estiver aumentando depois que você tentar fazer ping, mas o número na cadeia INPUT permanecer 0, o problema está nas regras de tráfego de entrada.

Verifique também suas rotas, com ip rcomando ou algo semelhante, se talvez o tráfego não esteja saindo pela interface na mesma sub-rede, então o IP de origem dos pacotes retornados pode ser alterado devido a algumas regras NAT ao longo do caminho.

informação relacionada