Як зробити переадресацію порту з одного ip на інший ip в одній мережі?


77

Мені хотілося б трохи NATзайти iptables. Таким чином, всі пакети, що надходять до 192.168.12.87порту, 80і будуть посилатися до 192.168.12.77порту 80.

Як це зробити за допомогою iptables?

Або

Будь-які інші способи досягти цього?


@Matthewlfe, мені чомусь потрібно переслати весь запит apache з (192.168.12.87) на (192.168.12.77).
сб

1
@Matthewlfe, у мене є два виробничі сервери. Один пов'язаний із загальнодоступною статичною ip-адресою. Через деякі проблеми з підключенням я не в змозі підключитися до БД та інших систем від 192.168.12.87. Отже, мені потрібно переслати усі запити 192.168.12.77.
сб

@lain, я не знайомий iptables. І я бачив кілька прикладів. Але, здається, потрібні два Ethernet. Посилання: revsys.com/writings/quicktips/nat.html
сб

Ви також можете використовувати проксі-режим у налаштуваннях свого веб-сервера для надсилання запитів на 192.168.12.77 з 192.168.12.87 (якщо ваш веб-сервер підтримує це)
krisFR

Відповіді:


74

Ці правила повинні працювати, якщо припустити, що iptablesце працює на сервері 192.168.12.87:

#!/bin/sh

echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -F
iptables -t nat -F
iptables -X

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77:80
iptables -t nat -A POSTROUTING -p tcp -d 192.168.12.77 --dport 80 -j SNAT --to-source 192.168.12.87

Вам потрібно DNAT вхідного трафіку на порт 80, але вам також потрібно буде SNAT трафік назад.


Альтернатива (і найкращий підхід до ІМХО):

Залежно від вашого веб-сервера (Apache, NGinx), ви повинні розглянути HTTP-проксі на своєму передньому сервері (192.168.12.87):


Працює до тих пір, поки ufw вимкнено, навіть якщо порт дозволений у ufw, але якщо увімкнено ufw, цей елемент переадресації не працює, будь-яка ідея?
Sudhir N

1
Чудове запитання з великою відповіддю. Інший випадок, для якого це корисно, це якщо вам потрібно тимчасово перенаправити весь трафік, що надходить на одну службу, скажімо, кальмар, на інший ip / порт, щоб виконати деяке обслуговування на оригінальному сервісі без необхідності перенастроювати всіх клієнтів! Дуже зручно!
PF4Public

3
"але вам також потрібно буде SNAT рух назад." -> Ти врятував мені день. Дякую
obayhan

Це рішення не працює для мене. Мені потрібно перейти від eth0 до віртуальної мережі (virb0), яку використовує KVM-гість. Я спробував додати параметри -i та -o, але -o не дозволено для попередньої підготовки. Будь-які пропозиції?
Lostiniceland

Будьте обережні з цим рішенням. Я повністю втратив доступ до своєї віддаленої машини зараз.
Сьорен

28

Причина, яка, здавалося б, очевидно 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, отже, пакети в одному напрямку переводяться, але пакети в іншому напрямку - ні.

Існує три підходи до вирішення цієї проблеми.

  1. На першому хості не просто роблять DNAT, але також роблять SNAT таким, що зворотний трафік буде відправлений назад через перший хост. Правило могло виглядати приблизно такiptables -t NAT -A POSTROUTING -d 192.168.12.77 -p tcp --dport 80 -j SNAT --to-source 192.168.12.87
  2. Візьміть натхнення від балансування навантаження DSR та DNAT пакетів на рівні Ethernet, а не на рівні IP. Замінивши MAC призначення пакетів на MAC 192.168.12.77 та відправивши його по Ethernet, не торкаючись IP-шару, тоді 192.168.12.77 міг би мати 192.168.12.87, налаштований на фіктивний інтерфейс і таким чином мати можливість припинити TCP-з'єднання. з відомим клієнтом IP-сервером.
  3. Використовуйте наївне (але не працююче) рішення на першому хості. Потім обробіть зворотні пакети на другому хості, зробивши SNAT на зворотному трафіку. Правило могло виглядати такiptables -t nat -A OUTPUT -p tcp --sport 80 -j SNAT --to-source 192.168.12.87

Кожне з цих трьох рішень має недоліки, тому вам потрібно ретельно продумати, чи дійсно вам потрібно зробити саме цю переадресацію.

  1. Використання SNAT втратить IP-адресу клієнта, тому хост номер 2 подумає, що всі з'єднання відбулися з 192.168.12.87. Крім того, ви будете використовувати пропускну здатність через хост номер 1 для всіх пакетів відповідей, який би проходив більш прямим шляхом з іншими підходами.
  2. Підхід DSR порушить всю іншу комунікацію між двома вузлами. Підхід DSR дійсно підходить лише тоді, коли адреса сервера не є основним IP-адресою жодного з хостів. Кожен хост повинен мати первинний IP, який не є DSR IP.
  3. Використання відстеження з'єднання на одному хості для перекладу в одному напрямку, а відстеження з'єднання на іншому хості для переведення в інший бік - це просто некрасиво, і існують різні способи його розриву. Наприклад, якщо номери портів модифікуються 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.


Я здивований, що -j MASQUERADEтут не згадується; чи не звичайний підхід із DNAT?
ремрам

3
@remram я згадав SNATзамість MASQUERADE, тому що це те , що сказано в документації. Точна редакція в документації:It should only be used with dynamically assigned IP (dialup) connections: if you have a static IP address, you should use the SNAT target.
kasperd
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.