Переадресация трафика TCP с трансляцией портов и сохранение входящего публичного IP

У меня есть два сервера. Windows имеет 1 NIC, Ubuntu имеет 2 NIC:

Server   NIC  Service  Listening Ports
-------  ---  -------  ---------------
Windows   1   IIS      80, 443
              mySvc    300            <--------------------------------\
Ubuntu    1   nginx    80,443                                          |
          2            80,443,300     forward w/ port translation to --/

Мои пользователи должны подключиться к порту Windows 300, чтобы запустить мое приложение. Многие компании разрешают только исходящий трафик через порты 80 и 443, поэтому некоторые пользователи не могут подключаться с использованием любого другого порта. Я не могу настроить mySvc прослушивать порт 80 или 443, если я не раскручиваю другой сервер Windows, чего я не хочу делать.

В добавив NIC2 на сервер Ubuntu, настройте DNS, чтобы он указывал на NIC2, и перенаправьте порты 80, 443 и 300 на порт Windows 300. Теперь все пользователи могут подключаться через брандмауэр любой компании.

Проблема: Windows видит входящий IP-адрес перенаправленного трафика как IP-адрес Ubuntu NIC1, а не IP-адрес пользователя.

Вопрос: Как я могу изменить свои файлы конфигурации для передачи IP-адреса пользователя через переадресацию портов / преобразование портов, чтобы Windows видела общедоступный IP-адрес пользователя?

Моя конфигурация: (IP-адреса изменены для конфиденциальности)

Server   NIC  Public IP  Private IP      Interface               Listening Ports
-------  ---  ---------  --------------  ----------------------  ---------------
Windows   1   1.2.3.4    192.168.23.112   Local Area Connection  80,443,300
Ubuntu    1   1.2.4.5    192.168.24.112   eth0                   80,443
Ubuntu    2   1.2.5.6    192.168.20.164   eth0:0                 80,443,300

На сервере Ubuntu:

$less /etc/network/interfaces.d/eth0.cfg

auto eth0 eth0:0
allow-hotplug eth0 eth0:0
iface eth0 inet dhcp
netmask 255.255.240.0
gateway 192.168.16.1

Когда мы назначаем IP-адрес eth0:0 в выше eth0.cfgзагрузка сервера занимает несколько минут, а переадресация портов не работает. Итак, только eth0 показывает как настроено в ifconfig:

$ifconfig

eth0      Link encap:Ethernet  HWaddr **:**:**:**:**:**
          inet addr:192.168.24.112  Bcast:192.168.31.255  Mask:255.255.240.0

Переадресация портов выполняется с помощью скрипта boot-cron:

$less /etc/init.d/ipforwarding

#!/bin/bash
iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.20.164 --dport 300 -j DNAT --to-destination 192.168.23.112:300
iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.20.164 --dport 443 -j DNAT --to-destination 192.168.23.112:300
iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.20.164 --dport 80 -j DNAT --to-destination 192.168.23.112:300
iptables -t nat -A POSTROUTING -j MASQUERADE
#iptables -t nat -A POSTROUTING -p tcp --dport 300 -j SNAT --to-source 192.168.20.164

Когда перенаправленный трафик поступает на порт 300 блока Windows, входящий IP-адрес 192.168.24.112Ubuntu NIC1, хотя DNS указывает пользователям на Ubuntu NIC2. Если я добавлю # к MASQUERADE линия и удалить # из следующей строки, то трафик, который поступает на сервер Windows, имеет IP-адрес 192.168.20.164, Так что разница между MASQUERADE а также SNAT имеет смысл. Но оба они меняют IP-адрес во время NAT операция.

Я хочу, чтобы публичный IP-адрес пользователя переадресовывался на порт Windows 300, когда трафик попадает на Ubuntu NIC2 через порты 80, 443 или 300. Любой совет будет полезен!

1 ответ

Чтобы использовать SNAT, вам нужно сделать сервер Linux маршрутизатором по умолчанию для сервера Windows. Это не рекомендуемое решение.

Распространенным решением этой проблемы является прокси трафика на сервере Linux. Попросите прокси добавить заголовок с внешним IP-адресом или положитесь на заголовок X-Forwarded-For. Для этого потребуется программное обеспечение в Windows для обработки этого заголовка с внешним IP-адресом. Многие приложения, которые обычно проксируются, имеют настройку, позволяющую делать это автоматически, возможно, с заголовком, специфичным для приложения.

Другие вопросы по тегам