使用 iptables 作为反向代理时,是否可以在后端服务器上保留发送者的 IP 信息?

使用 iptables 作为反向代理时,是否可以在后端服务器上保留发送者的 IP 信息?

假设我有 2 个服务器:1.1.1.1 和 2.2.2.2

我已使用 iptables 将所有流量转发到 1.1.1.1 至 2.2.2.2 上的所有端口

iptables -A FORWARD -d 2.2.2.2 -i eth0 -p tcp -m tcp --dport 1:65500 -j ACCEPT #forward tcp port range
iptables -A FORWARD -d 2.2.2.2 -i eth0 -p udp -m udp --dport 1:65500 -j ACCEPT #forward udp port range
iptables -t nat -A PREROUTING -d 1.1.1.1 -p tcp -m tcp --dport 1:65500 -j DNAT --to-destination 2.2.2.2  #tcp port range
iptables -t nat -A PREROUTING -d 1.1.1.1 -p udp -m udp --dport 1:65500 -j DNAT --to-destination 2.2.2.2  #udp port range
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

我现在可以访问托管在 2.2.2.2 上并受 1.1.1.1 屏蔽的所有内容。

我现在的问题是,2.2.2.2 IP 日志显示所有传入流量来自 1.1.1.1。

有什么方法可以保留此设置,同时告诉盒子 2.2.2.2 原始 IP 地址是什么?

答案1

您正在用 eth0 的 IP 伪装源 IP,这就是目标机器只看到 1.1.1.1 IP 的原因。您不应该使用伪装,而应该将流量从 2.2.2.2 框路由到路由器。

答案2

这里的挑战是正确转发来自/到美国 VPS 服务器的流量。

需要此-j MASQUERADE规则,以便美国 VPS 的返回数据包能够通过欧洲 VPS 正确路由回来。但是,这需要更改数据包中的 IP 地址。

另一种没有MASQUERADE规则的方法是在美国 VPS 服务器上设置自定义路由表。使用这种方法,根本无法从互联网连接到美国服务器 IP 地址。

这些操作都要在美国VPS控制台上进行,而不是通过SSH。

1:找出美国VPS的默认路由器:

ip route | grep default

2:添加自定义路由到欧洲 VPS 服务器。<IP>是步骤 1 中的 IP 地址。

ip route add 1.1.1.1 via <IP>

3:添加通过欧洲VPS的默认路线:

ip route add default via 1.1.1.1

4:删除以前的默认路由:

ip route del default via <IP>

下一步是删除MASQUERADE欧洲 VPS 的规则:

iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

要启用来自美国 VPS 的出站流量,您需要在同一个欧盟 VPS 服务器上添加不同的 MASQUERADE 规则:

iptables -t nat -A POSTROUTING -i tun0 -j MASQUERADE

此规则启用从美国 VPS 到一般互联网的出站通信。tun0是您的 VPN 隧道的接口名称。

这样设置之后,美国 VPS 的 IP 地址就无法从互联网访问了,所有流量都通过欧洲 VPS 进行路由。

在将此设置部署到生产用途之前,您应该了解设置中涉及的所有原理,以确保您能够正确维护设置。

相关内容