我有两台服务器。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 视为 Ubuntu NIC1 IP 地址,而不是用户的 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
eth0:0
当我们在上面为 分配 IP 地址时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 bash 脚本完成的:
$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
当转发的流量到达 Windows 机器的端口 300 时,入站 IP 地址是192.168.24.112
,即 Ubuntu NIC1,即使 DNS 将用户指向 Ubuntu NIC2。如果我#
在该MASQUERADE
行中添加并#
从下一行中删除,则到达 Windows 服务器的流量的 IP 地址为。因此和192.168.20.164
之间的差异是有道理的。但这两者都会在操作过程中更改 IP 地址。MASQUERADE
SNAT
NAT
我希望每当流量通过端口 80、443 或 300 到达 Ubuntu NIC2 时,用户的公共 IP 地址都会转发到 Windows 端口 300。任何建议都会有帮助!
答案1
要使用 SNAT,您需要将 Linux 服务器设为 Windows 服务器的默认路由器。这不是推荐的解决方案。
解决此问题的一个常见方法是代理 Linux 服务器上的流量。让代理添加带有外部 IP 的标头,或依赖 X-Forwarded-For 标头。这将要求 Windows 上的软件使用外部 IP 处理该标头。许多通常使用代理的应用程序都有一个设置来自动执行此操作,可能使用特定于应用程序的标头。