假设我有 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 进行路由。
在将此设置部署到生产用途之前,您应该了解设置中涉及的所有原理,以确保您能够正确维护设置。