Tenho duas redes NAT conectadas através de um túnel ponto a ponto da seguinte forma:
| Machine A | | Machine B |
| 1.2.3.4 |<-10.101.3.2-------tun------10.101.3.1-> | 4.5.6.7 |
| 10.110.0.1 | | 10.100.1.1 |
-----+-------- --------+-----
| |
[ 10.110.1.0/24 net ] [ 10.100.0.0/16 net]
A máquina A tem um IP público ligado eth0
e um IP privado 10.110.1.1
ligado vmbr0
e está conectada à Internet por meio de uma VPN ptp com a Máquina B, que tem um IP público ligado en0
e um IP privado ligado en1
(e várias outras redes privadas)
Existem clientes em ambas as LANs usando NAT com dois IPs públicos. Isso funciona bem. (É feito usando iptables na máquina A e pfSense na máquina B)
O roteamento é configurado de forma que a Máquina A possa executar ping no IP privado da Máquina B 10.100.1.1
e acessar todos os hosts na rede B 10.100.0.0/16
. Da mesma forma, a Máquina B (e todos os hosts na rede B) podem acessar a Máquina A e todos os hosts na Rede A10.110.1.0/16
No entanto, os hosts na rede A não podem estabelecer conexões com os hosts na rede B (por exemplo 10.110.1.2
, não podem fazer ping nem SSH para 10.100.10.50
)
Eu suspeito que isso tenha algo a ver com a configuração do iptables em A, porque o SSH de 10.100.10.50
para 10.110.1.2
funciona, mas não consigo fazer o SSH na direção reversa. Isso me diz que minha regra iptables FILTER RELATED,ESTABLISHED
funciona, mas de alguma forma eu suspeito que a máquina A está tentando NAT e usar eth0
para novas conexões.
Adicionei regras do iptables em todos os lugares que pensei ACCEPT destination 10.100.0.0/16
que eram necessários e, mesmo em lugares que não pensei que fossem necessários quando as coisas não funcionavam e ainda não consigo obter conexões de saída da rede A para a rede B funcionando.
Como posso conectar corretamente duas redes privadas com NAT por meio de um túnel ponto a ponto usando o iptables?
Informação adicional:
iptables na máquina A:
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere 10.100.0.0/16
DNAT tcp -- anywhere anywhere tcp dpt:http to:10.110.1.3:80
DNAT tcp -- anywhere anywhere tcp dpt:https to:10.110.1.3:443
DNAT tcp -- anywhere anywhere tcp dpt:xmpp-client to:10.110.1.4:5222
DNAT tcp -- anywhere anywhere tcp dpt:5281 to:10.110.1.4:5281
DNAT tcp -- anywhere anywhere tcp dpt:64738 to:10.110.1.4:64738
DNAT udp -- anywhere anywhere udp dpt:64738 to:10.110.1.4:64738
DNAT udp -- anywhere anywhere udp multiport dports isakmp,ipsec-nat-t to:10.110.1.10:1194
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere 10.100.0.0/16
ACCEPT all -- anywhere 10.101.0.0/16
MASQUERADE all -- 10.110.1.0/24 anywhere
MASQUERADE all -- 10.110.1.0/24 anywhere
MASQUERADE all -- 10.110.1.0/24 anywhere
Entããão, isso foi um erro estúpido da minha parte! Tudo na Máquina A foi configurado corretamente, na verdade foram as regras de firewall da Máquina B bloqueando isso. A máquina B tinha uma regra que permitia o tráfego de,
10.101.3.2
mas faltava a regra que permitia o tráfego de10.110.1.0/24
. Adicionar essa regra corrigiu o problema.Eu descobri o problema usando
tcpdump
enc
da seguinte forma:10.100.10.50
, executeinc -kl 60321
para ouvir conexões na porta 60321 (escolhi uma porta aleatória que sabia que não era usada pelos serviços que executamos para minimizar o ruído emtcpdump
)tcpdump -s0 -X -i $dev port 60321
onde defini$dev
as interfaces das redes NAT'ed (vmbr0
ouvmx0
) ou as interfaces ptp (tun0
)10.110.1.2
enviei dados para10.100.10.50
usando:echo -e "test1\ntest2\ntest3" | nc 10.100.10.50 60321
tun0
interface da Máquina A quanto da B, mas não na LAN da Máquina B, então isso significava que o problema era com o roteamento/firewall na Máquina B