Ось що відбувається:
- Ваш
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
на його локальній стороні). Механізм виходу з ладу дуже схожий на той, де 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-ed та DNAT-ed, оскільки перший пакет був.
Я думаю, якщо ваш перший рядок
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
, а не на вас.