iptables - 转发后如何保留源 IP?

iptables - 转发后如何保留源 IP?
1.1.1.1 - public IP of VPS
10.1.0.1 - internal IP of OpenVPN server running on VPS
192.168.1.0/24 - local subnet on the VPN client's side
192.168.1.101 - local server running on port TCP 1234

VPN/VPS的主要用途:

  1. 作为浏览特定网站的门户
  2. 作为连接到服务器 192.168.1.101 的客户端的代理

当前 iptables 设置:

-A PREROUTING -d 1.1.1.1 -p tcp -m tcp --dport 1234 -j DNAT --to-destination 192.168.1.101:1234
-A POSTROUTING -d 192.168.1.101 -p tcp -m tcp --dport 1234 -j SNAT --to-source 10.1.0.1
-A POSTROUTING -o eth0 -j SNAT --to-source 1.1.1.1

前两行将 TCP 1234 端口转发到所需目的地,并且有效。唯一的问题是,在目标服务器上我看不到已连接客户端的真实 IP。所有客户端都具有相同的 IP:10.1.0.1。我尝试将第二行更改为:

-A POSTROUTING -d 192.168.1.101 -p tcp -m tcp --dport 1234 -j SNAT --to-source 1.1.1.1

但客户端根本就无法连接。最后一行是用来让我上网的。

问题:我应该如何正确设置规则,以便可以看到连接客户端的真实 IP?

答案1

好的,看来您正在尝试通过 VPN 设置端口转发,即 1.1.1.1:1234 -> 192.168.1.101:1234。您的 openvpn 配置似乎也不错。

正如评论中所述,在第二条规则中,您使用 修改了源 IP -j SNAT --to-source 10.1.0.1。要实现端口转发,请将您的 iptables 规则替换为:

-A PREROUTING -t nat -i eth0 -d 1.1.1.1 -p tcp --dport 1234 -j DNAT --to-destination 192.168.1.101:1234
-A FORWARD -p tcp -d 192.168.1.101 --dport 1234 -j ACCEPT
  • 第一条规则告诉 iptable 将所有传入的 tcp 连接发送到接口 eth0 上的端口 1234,并将目标设置为 1.1.1.1,朝向内部机器 192.168.1.101 的端口 1234。
  • 第二条规则允许将数据包转发到192.168.1.101的1234端口

来源

相关内容