Ось що відбувається:
- Ваш
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, а не на вас.