使用端口转换转发 TCP 流量并保留传入的公共 IP

使用端口转换转发 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 视为 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 地址。MASQUERADESNATNAT

我希望每当流量通过端口 80、443 或 300 到达 Ubuntu NIC2 时,用户的公共 IP 地址都会转发到 Windows 端口 300。任何建议都会有帮助!

答案1

要使用 SNAT,您需要将 Linux 服务器设为 Windows 服务器的默认路由器。这不是推荐的解决方案。

解决此问题的一个常见方法是代理 Linux 服务器上的流量。让代理添加带有外部 IP 的标头,或依赖 X-Forwarded-For 标头。这将要求 Windows 上的软件使用外部 IP 处理该标头。许多通常使用代理的应用程序都有一个设置来自动执行此操作,可能使用特定于应用程序的标头。

相关内容