Причина, яка, здавалося б, очевидно iptables -t nat -A PREROUTING -d 192.168.12.87 -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77
, не спрацює, - це те, як будуть спрямовані пакети повернення.
Ви можете встановити правила, які призведуть до того, що пакети, що надсилаються на 192.168.12.87, просто NATT до 192.168.12.77, але 192.168.12.77 буде надсилати відповіді безпосередньо назад клієнту. Ці відповіді не будуть проходити через хост, де ваше правило iptables робить NAT, отже, пакети в одному напрямку переводяться, але пакети в іншому напрямку - ні.
Існує три підходи до вирішення цієї проблеми.
- На першому хості не просто роблять DNAT, але також роблять SNAT таким, що зворотний трафік буде відправлений назад через перший хост. Правило могло виглядати приблизно так
iptables -t NAT -A POSTROUTING -d 192.168.12.77 -p tcp --dport 80 -j SNAT --to-source 192.168.12.87
- Візьміть натхнення від балансування навантаження DSR та DNAT пакетів на рівні Ethernet, а не на рівні IP. Замінивши MAC призначення пакетів на MAC 192.168.12.77 та відправивши його по Ethernet, не торкаючись IP-шару, тоді 192.168.12.77 міг би мати 192.168.12.87, налаштований на фіктивний інтерфейс і таким чином мати можливість припинити TCP-з'єднання. з відомим клієнтом IP-сервером.
- Використовуйте наївне (але не працююче) рішення на першому хості. Потім обробіть зворотні пакети на другому хості, зробивши SNAT на зворотному трафіку. Правило могло виглядати так
iptables -t nat -A OUTPUT -p tcp --sport 80 -j SNAT --to-source 192.168.12.87
Кожне з цих трьох рішень має недоліки, тому вам потрібно ретельно продумати, чи дійсно вам потрібно зробити саме цю переадресацію.
- Використання SNAT втратить IP-адресу клієнта, тому хост номер 2 подумає, що всі з'єднання відбулися з 192.168.12.87. Крім того, ви будете використовувати пропускну здатність через хост номер 1 для всіх пакетів відповідей, який би проходив більш прямим шляхом з іншими підходами.
- Підхід DSR порушить всю іншу комунікацію між двома вузлами. Підхід DSR дійсно підходить лише тоді, коли адреса сервера не є основним IP-адресою жодного з хостів. Кожен хост повинен мати первинний IP, який не є DSR IP.
- Використання відстеження з'єднання на одному хості для перекладу в одному напрямку, а відстеження з'єднання на іншому хості для переведення в інший бік - це просто некрасиво, і існують різні способи його розриву. Наприклад, якщо номери портів модифікуються NAT на будь-якому хості, немає можливості їх відновити. Також не вказано, що відстеження з'єднання буде працювати правильно, якщо перший пакет, який він бачить, - це SYN-ACK, а не ACK.
З трьох підходів, я думаю, перший - той, який, швидше за все, спрацює. Отже, якщо вам не потрібно знати IP-адреси клієнта, я б рекомендував.
Ви також можете взагалі забути про NAT і не намагатися вирішити проблему на рівні MAC або IP. Ви можете пройти весь шлях до рівня HTTP і шукати там рішення. У цьому випадку рішення, яке ви знайдете, - це HTTP-проксі. Якщо ви встановите проксі-сервер HTTP на 192.168.12.87 і правильно налаштуєте його, ви можете переслати його на 192.168.12.77 і переслати відповіді назад. Крім того, він може вставити заголовок X-Forwarded-For із збереженням вихідного IP-адреси клієнта. Сервер на 192.168.12.77 потім потрібно налаштувати на довіру заголовку X-Forwarded-For з 192.168.12.87.