如果我有两个虚拟专用服务器并且它们位于不同的国家/地区。然后我想使用一台服务器(139.162.131.242)作为代理服务器来代理tcp和udp流量,代理进程侦听本地端口8300。另一台服务器(172.104.98.95)将用于将流量中继到代理服务器。
有人教我如何使用 IPTABLES 来实现这一点:
步骤1:在代理服务器(139.162.131.242)上设置代理程序并运行
第2步:在中继服务器(172.104.98.95)上编写一些 iptables 规则,如下所示:
iptables -t nat -A PREROUTING -p tcp --dport 8300 -j DNAT --to-destination 139.162.131.242:8300
iptables -t nat -A PREROUTING -p udp --dport 8300 -j DNAT --to-destination 139.162.131.242:8300
iptables -t nat -A POSTROUTING -d 139.162.131.242 -p tcp --dport 8300 -j SNAT --to-source 172.104.98.95
iptables -t nat -A POSTROUTING -d 139.162.131.242 -p udp --dport 8300 -j SNAT --to-source 172.104.98.95
步骤 3:设置代理客户端程序,使所有tcp和udp流量都去中继服务器
但我对这个方法感到困惑。例如,我正在玩一个网络游戏,使用udp或tcp与游戏服务器通信。当这些流量到达中继服务器时,会进行 DNA 解析,最终到达代理服务器,但是代理服务器能知道这些流量被发送到哪里吗?我的意思是代理服务器会将这些流量发送到游戏服务器吗?如果可以的话,在中继服务器上已经更改了流量的目标地址后,代理服务器如何知道真实的游戏服务器地址?
答案1
IP数据包的相关信息有源地址,目的地址,源端口和目的端口。源和目标端口对由客户端和服务器使用:发起方将数据包发送到目标端口并选择源端口,在回复中将源端口用作目标端口,将目标端口用作源端口。
每次更改数据包时,都会保存更改之间的映射。通过这种映射,设备知道如何处理数据包。 NAT 使用此信息来映射主机之间的连接。静态 NAT 使用基于预配置规则的映射,而动态 NAT 在新连接启动时扩展映射,并在连接关闭时删除映射条目。
我将分步骤解释数据包如何在客户端和服务器之间传输。由于我不知道您正在使用的代理的详细信息,我假设所有到代理的流量都会中继到服务器并且透明地发生。
客户端和服务器之间的步骤:
client <---> VPN <---> NAT <---> proxy <---> server
从客户端到服务器:
- 客户端发送数据包到目的地址(代理人)。路由用于通过 VPN 发送流量。
- NAT 转发数据包。 NAT 改变了源地址通过源 NAT 规则自行使用。目标地址(代理)不变。
- 代理从 NAT 获取数据包,照常中继它。
- 目标服务器从代理接收数据包。
从服务器到客户端:
- 目标服务器将数据包发送到代理。
- 代理将数据包中继到 NAT。
- NAT 转发数据包。目的地地址通过目标 NAT 规则更改为您的客户端地址。源地址(代理)不变。
- 您的客户端收到数据包。