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.192
nã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á udp
ou tcp
, e $vpn_server_ip
: $vpn_port
o 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.
-A
opção anexa a regra ao final. Se você usar -I
a opção, colocará a regra no topo da cadeia.
A questão aqui é que você provavelmente já possui uma regra DROP
ou REJECT
, antes da ACCEPT
regra 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
, ACCEPT
sã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 ACCEPT
isso, 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 pkts
na 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 r
comando 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.