У меня два сервера. 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 на порт 300 Windows. Теперь все пользователи жестяная банка подключиться через любой межсетевой экран компании.
Проблема: 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
Перенаправление портов выполняется с помощью bash-скрипта 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.112
, то есть Ubuntu NIC1, хотя DNS указывает пользователям на Ubuntu NIC2. Если я добавлю #
к MASQUERADE
линия и удалить #
из следующей строки, то трафик, поступающий на сервер Windows, имеет IP-адрес 192.168.20.164
. Итак, разница между MASQUERADE
и SNAT
имеет смысл. Но оба они меняют IP-адрес во время NAT
операция.
Я хочу, чтобы общедоступный IP-адрес пользователя перенаправлялся на порт 300 Windows всякий раз, когда трафик попадает в Ubuntu NIC2 на порты 80, 443 или 300. Любые советы будут полезны!
Чтобы использовать SNAT, вам нужно сделать сервер Linux маршрутизатором по умолчанию для сервера Windows. Это не рекомендуемое решение.
Распространенным решением этой проблемы является проксирование трафика на сервере Linux. Попросите прокси добавить заголовок с внешним IP-адресом или положитесь на заголовок X-Forwarded-For. Для этого потребуется программное обеспечение в Windows для обработки этого заголовка с внешним IP-адресом. Многие приложения, которые обычно проксируются, имеют настройку, позволяющую делать это автоматически, возможно, с определенным заголовком приложения.