Вот что происходит:
- Ваш сервер
192.168.33.35
видит пакет Syn от 192.168.33.Z
(он не знает о сети 192.168.31.0/24
и видит адрес "WAN" шлюза 192.168.31.1
, я не знаю, что такое Z
) и отвечает на этот адрес.
- В его таблице маршрутизации указано, что этот адрес принадлежит локальной сети, поэтому ответ предназначен для MAC-адреса
192.168.33.Z
- Даже если ответ физически проходит через компьютер
192.168.33.1
, шлюз с ним не работает, поскольку он предназначен для MAC-адреса другого компьютера.
192.168.33.Z
видит ответ от 192.168.33.35
. Он ожидает от 66.66.66.66
и не знает, что делать.
Обратите внимание, что это не имеет значения 192.168.33.Z
выполняет NAT (будучи 192.168.31.1
на его стороне LAN). Механизм сбоя очень похож на тот, где петля NAT (шпилька NAT) настроена только частично.
Вы должны сделать так, чтобы ваш сервер 192.168.33.35
отправлял ответы на MAC-адрес вашего шлюза 192.168.33.1
.
Либо установите правило маршрутизации для 192.168.33.Z
(помните, я не знаю Z
, вы понимаете; подставьте действительное число) или даже для всей сети 192.168.33.0/24
:
# do this on the 192.168.33.35 machine
route add -host 192.168.33.Z gw 192.168.33.1
Обратите внимание, что это повлияет на все коммуникации с 192.168.33.35
до 192.168.33.Z
В случаях, когда 192.168.33.35
должен действовать как 192.168.33.35
пакеты будут излишне маршрутизироваться; это не должно ломать вещи все же.
Или пусть шлюз 192.168.33.1
выполняет не только DNAT, но и SNAT. Это решение в основном совпадает с решением для обратной петли NAT в уже связанном ответе:
# do this on the 192.168.33.1 gateway
# you already have this line
iptables -t nat -I PREROUTING -d 66.66.66.66 -j DNAT --to-destination 192.168.33.35
# this line is new
iptables -t nat -I POSTROUTING -d 192.168.33.35 -j SNAT --to-source 192.168.33.1
Этот фрагмент относится к вашей ситуации:
Обратите внимание, что таблица NAT в iptables
используется только для первого пакета соединения. Более поздние пакеты, связанные с соединением, обрабатываются с использованием внутренних таблиц сопоставления, установленных при преобразовании первого пакета.
Это означает, что вторая из ваших строк (iptables … -j SNAT --to-source 66.66.66.66
) не имеет значения, когда вы инициируете соединение от клиента. Более поздние пакеты будут обрабатываться SNAT и DNAT правильно, потому что первый пакет был.
Я думаю, если ваша первая строка
iptables -t nat -I PREROUTING -d 66.66.66.66 -j DNAT --to-destination 192.168.33.35
действовал на шлюзе 192.168.31.1
, он будет делать то, что вы хотите для других клиентов с 192.168.31.0/24
без каких-либо дополнительных уловок.
Это ваша вторая строка
iptables -t nat -I POSTROUTING -s 192.168.33.35 -j SNAT --to-source 66.66.66.66
будет применяться, если вы инициируете соединение с 192.168.33.35
. Интернет-серверы редко делают это, поэтому вам может не понадобиться это правило вообще. Если вам это нужно, помните, что:
- правило будет работать только в том случае, если пакеты маршрутизируются через шлюз
192.168.33.1
котором действует это правило, поэтому для доступа к локальным компьютерам и представления их как 66.66.66.66
необходимо настроить таблицу маршрутизации на компьютере 192.168.33.35
же, как выше;
- вы не можете общаться как
66.66.66.66
с внешними хостами (за пределами вашей сети), потому что даже если вам удастся связаться с ними, действующими как 66.66.66.66
, их ответ получит реальный 66.66.66.66
, а не вам.