У меня две сети NAT, подключенные через туннель точка-точка следующим образом:
| 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 есть общедоступный IP-адрес eth0
и частный IP 10.110.1.1
на vmbr0
, и подключен через Интернет через p-t-p VPN к компьютеру B, у которого есть общедоступный IP-адрес на en0
и частный IP на en1
(и ряд других частных сетей)
В обеих локальных сетях есть клиенты, использующие NAT с двумя общедоступными IP-адресами. Это прекрасно работает. (Это делается с помощью iptables на машине A и pfSense на машине B)
Маршрутизация настроена так, что машина A может пинговать частный IP-адрес машины B. 10.100.1.1
и может получить доступ ко всем хостам в сети B 10.100.0.0/16
. Аналогично, машина B (и все хозяева в сети B) может получить доступ к машине A и всем хостам в сети A 10.110.1.0/16
Однако хосты в сети A не могут устанавливать соединения с хостами в сети B (например, 10.110.1.2
не могу пинговать или SSH 10.100.10.50
)
я подозреваемый это как-то связано с настройкой iptables на A, потому что SSH из 10.100.10.50
к 10.110.1.2
работает, но я не могу использовать SSH в обратном направлении. Это говорит мне, что мое правило ФИЛЬТРА iptables для RELATED,ESTABLISHED
работает, но почему-то я подозреваю, что машина A пытается использовать NAT и использовать eth0
для новых подключений.
я добавил ACCEPT destination 10.100.0.0/16
iptables правила везде, где я думал, что они нужны, а потом даже там, где я не сделал думаю, что они были нужны, когда что-то не работало, и все еще не могут заставить работать исходящие соединения из сети A в сеть B.
Как правильно соединить две частные сети с NAT через туннель точка-точка с помощью iptables?
Дополнительная информация:
iptables на машине 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
Тааак, это была глупая ошибка с моей стороны! Все на машине А был настроен правильно, это на самом деле правила брандмауэра машины B. На машине B было правило, разрешающее трафик от 10.101.3.2
но был отсутствует правило, разрешающее трафик от 10.110.1.0/24
. Добавление этого правила устранило проблему.
Я обнаружил проблему, используя tcpdump
и nc
следующим образом:
10.100.10.50
Я казнил nc -kl 60321
для прослушивания подключений через порт 60321 (я выбрал случайный порт, который, как я знал, не используется службами, которые мы запускаем, чтобы минимизировать шум в tcpdump
)tcpdump -s0 -X -i $dev port 60321
где я установил $dev
к интерфейсам сетей с NAT (vmbr0
или vmx0
) или к интерфейсам p-t-p (tun0
)10.110.1.2
Я отправил данные на 10.100.10.50
с помощью: echo -e "test1\ntest2\ntest3" | nc 10.100.10.50 60321
tun0
интерфейс, но не в локальной сети машины B, так что проблема была в маршрутизации / брандмауэре на машине B