Назад | Перейти на главную страницу

Как я могу разрешить iptables правильно использовать туннель вместо NAT?

У меня две сети 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 следующим образом:

  1. На 10.100.10.50 Я казнил nc -kl 60321 для прослушивания подключений через порт 60321 (я выбрал случайный порт, который, как я знал, не используется службами, которые мы запускаем, чтобы минимизировать шум в tcpdump)
  2. На машинах A и B я выполнил tcpdump -s0 -X -i $dev port 60321 где я установил $dev к интерфейсам сетей с NAT (vmbr0 или vmx0) или к интерфейсам p-t-p (tun0)
  3. На 10.110.1.2 Я отправил данные на 10.100.10.50 с помощью: echo -e "test1\ntest2\ntest3" | nc 10.100.10.50 60321
  4. Я видел трафик в локальной сети машины A, машины A и машины B. tun0 интерфейс, но не в локальной сети машины B, так что проблема была в маршрутизации / брандмауэре на машине B
  5. Я фейспалм и добавил недостающее правило брандмауэра