Назад | Перейти на главную страницу

NAT Multiples серверов

Мне нужен эксперт, чтобы настроить перенаправление NAT (iptables) для сохранения исходного адреса клиента. В настоящее время мои серверы работают, но все клиенты появляются с частными IP-адресами моей vLAN.

Пример работы перенаправления моего сервера:

VPS 1 (Public IP) redirect traffic to VPS 5 (Private IP)
VPS 2 (Public IP) redirect traffic to VPS 5 (Private IP)
VPS 3 (Public IP) redirect traffic to VPS 5 (Private IP)
VPS 4 (Public IP) redirect traffic to VPS 5 (Private IP)

Но при перенаправлении трафика IP-адрес клиента изменяется на частный IP-адрес общедоступного сервера, к которому обращается клиент.

TCPDUMP:

IP 10.0.1.130.61570> 10.0.1.138.85: UDP, length 35
IP 10.0.1.132.63112> 10.0.1.138.85: UDP, length 35
IP 10.0.1.133.63435> 10.0.1.138.85: UDP, length 35
IP 10.0.1.136.63432> 10.0.1.138.85: UDP, length 35

Проблема заключается в том, что всем клиентам назначается частный IP-адрес при перенаправлении, и мне нужно поддерживать реальный IP-адрес клиента.

Если я удалю правило "iptables -t nat -A POSTROUTING -j MASQUERADE"

Затем IP-адреса клиентов поддерживаются, но сервер отвечает пакетам частным IP-адресом на IP-адреса клиентов.

TCPDUMP:

IP 10.0.1.138.85> client1.isp.net.61570: UDP, length 45
IP 10.0.1.138.85> client2.isp.net.63112: UDP, length 45
IP 10.0.1.138.85> client3.isp.net.63435: UDP, length 45
IP 10.0.1.138.85> client4.isp.net.63432: UDP, length 45

Я хочу сохранить реальный IP-адрес клиентов, но (VPS 5) не маршрутизирует пакеты обратно в Интернет.

Я знаю два способа решить вашу проблему:

Простой способ

Вы можете использовать дополнительные диапазоны портов в DNAT правило на хостах VPS без SNAT правило. И на основе этих номеров портов VPS-5 направляет ответы через правый хост.

Краткий пример:

  • Планируйте дополнительные номера портов на VPS-5 на который другие хосты будут пересылать пакеты от клиентов. Угадаем VPS-1 пересылать пакеты в VPS-5 tcp/10001, то VPS2 - чтобы VPS-5 tcp/10002 и так далее.

  • На каждом VPS хоста вам нужно только одно правило для перенаправления трафика на специальный порт VPS-5. Скоро VPS-1 правило будет выглядеть так:

# vps-1 host
iptables -t nat -A PREROUTING \
         --dst <vps-1-pub-ip> -p udp --dport <srv-port> \
    -j DNAT --to-destination <vps-5-ip>:10001
  • На VPS-5 вам нужна более сложная конфигурация. Прикол в том, какой номер порта на какой VPS5 получает перенаправленный запрос, а также указывает на хост VPS, через который должны маршрутизироваться ответы.

  • На VPS-5 вам нужна отдельная таблица маршрутизации и правило маршрутизации для каждого другого VPS хост. Пример для VPS-1 и VPS-2:

# vps-5 host
ip route add <connected-subnet> dev <iface> table 1
ip route add 0/0 via <VPS-1-INT-IP> dev <iface> table 1
ip rule add fwmark 1 lookup 1 pref 10001

ip route add <connected-subnet> dev <iface> table 2
ip route add 0/0 via <VPS-2-INT-IP> dev <iface> table 2
ip rule add fwmark 2 lookup 2 pref 10002
  • Отметьте входящие соединения от хостов VPS и сохраните их в записи conntrack:
# vps-5 host
iptables -t mangle -A PREROUTING \
         -m conntrack --ctstate NEW \
         -p udp --dport 10001 \
    -j CONNMARK --set-mark 0x1
  • Перенаправить запрос на сервисный порт:
# vps-5 host
iptables -t nat -A PREROUTING \
         --dst <vps-5-ip> -p udp --dport 10001:10004 \
    -j REDIRECT --to-ports 85
  • Установите метку брандмауэра на ответных пакетах, чтобы направить их обратно на хост VPS:
# vps-5 host
iptables -t mangle -A OUTPUT \
         -m conntrack --ctstate DNAT --ctdir REPLY \
    -j CONNMARK --restore-mark

Этот способ применим, только если хосты подключены друг к другу напрямую. В противном случае вам следует использовать следующий способ.

Туннельный режим

В некоторых случаях серверы подключаются не друг к другу, а через некоторые маршрутизаторы. В этих случаях способ, описанный выше, не поможет, поскольку каждый промежуточный маршрутизатор самостоятельно принимает решение о маршрутизации.

Единственный способ, насколько я знаю, сохранить исходный адрес клиента и перенаправить пакеты с переднего хоста (VPS-1 - VPS-4) на целевой хост (VPS-5), это использование туннелирования.

Упрощенное решение: * Запланируйте дополнительную IP-адресацию для использования внутри туннелей. * На каждом переднем хосте (VPS-1 - VPS-4) вы создаете туннель для VPS-5. Вы можете использовать любой тип туннелирования, какой захотите. В самом простом случае вы можете использовать статические туннели GRE, но у него есть некоторые ограничения, например, обход NAT. * На каждом переднем хосте вам нужно только одно правило для перенаправления трафика на VPS-5. Пример для VPS-:

# vps-1 host
iptables -t nat -A PREROUTING \
         --dst <vps-1-pub-ip> -p udp --dport <srv-port> \
    -j DNAT --to-destination <vps-5-tun-ip>
  • На VPS-5 вам также следует настроить дополнительные таблицы маршрутизации и правила маршрутизации для ответа через правый передний хост:
# vps-5 host
ip route add 0/0 dev <vps-1-tun-iface> table 1
ip rule add fwmark 1 lookup 1 pref 10001
  • Отметьте входящие соединения на основе интерфейса ввода и сохраните их в записи conntrack:
iptables -t mangle -A PREROUTING \
         -m conntrack --ctstate NEW \
         -i <vps-1-tun-iface> \
    -j CONNMARK --set-mark 0x1
  • Если ваше приложение не прослушивает IP-адреса туннеля, вам следует перенаправить входящие пакеты с передних хостов на прослушиваемый адрес:
iptables -t nat -A PREROUTING \
         -i <vps-1-tun-iface> \
         -p udp --dport <srv-port> \
    -j DNAT --to-destination <srv-listen-ip>
  • Установите отметку брандмауэра на ответных пакетах:
iptables -t mangle -A OUTPUT \
    -j CONNMARK --restore-mark
  • Не забудьте разрешить эти пакеты в таблице фильтров:
iptables -t filter -A INPUT \
         -m conntrack --ctstate ESTABLISHED,RELATED
    -j ACCEPT
...
iptables -t filter -A INPUT \
         -p udp --dport <srv-port>
    -j ACCEPT