![我能否进行 IP 转发并保留从服务器 A 到 B 的原始客户端 IP?](https://linux22.com/image/781927/%E6%88%91%E8%83%BD%E5%90%A6%E8%BF%9B%E8%A1%8C%20IP%20%E8%BD%AC%E5%8F%91%E5%B9%B6%E4%BF%9D%E7%95%99%E4%BB%8E%E6%9C%8D%E5%8A%A1%E5%99%A8%20A%20%E5%88%B0%20B%20%E7%9A%84%E5%8E%9F%E5%A7%8B%E5%AE%A2%E6%88%B7%E7%AB%AF%20IP%EF%BC%9F.png)
我是一名 Web 开发人员,对 devOps 和服务器配置不太了解,我使用此代码将数据从客户端从服务器 a 转发到服务器 b,我的意思是:
客户端---------->服务器A--------->服务器B
现在,当我使用 IP 转发到服务器 B 时,如何保留原始客户端 IP?有什么办法吗?我以前使用过以下命令,但我不知道它是否适用于我的新概念?
sysctl net.ipv4.ip_forward=1
iptables -t nat -A PREROUTING -p tcp --dport 22 -j DNAT --to-destination serverA_IP
iptables -t nat -A PREROUTING -j DNAT --to-destination serverB_IP
iptables -t nat -A POSTROUTING -j MASQUERADE
答案1
当您执行 DNAT / SNAT (如示例中所示) 时,您无法保留客户端 IP 地址,因为该地址在 ServerA 上的 NAT 中已更改。
根据应用程序协议,您可以将客户端 IP 附加到请求中,例如在 HTTP 请求标头中。这需要在 ServerA 上设置反向代理。
然而,对于 SSH 来说,没有这样的机制。
答案2
如果“客户端”直接连接到“服务器 A”,则您不需要为 SSH 设置任何 NAT 规则,因为您是直接连接到它。但是,如果您希望客户端通过 SSH 连接到服务器 A 的 IP 地址,但最终使用端口 22 连接到服务器 B,那么您需要的是:
-A PREROUTING -s x.x.x.x/32 -d x.x.x.x/32 -p tcp -m tcp --dport 22 -j DNAT --to-destination x.x.x.x:22
将第一个“xxxx/32”替换为客户端预期连接的 IP 地址(如果不知道或不需要,可以完全删除该地址)将第二个“xxxx/32”替换为您预期客户端访问的 IP 地址(服务器 A 的 IP 地址)。最后将 --to-destination xxxx:22 更改为服务器 B 的 IP 地址。
现在,如果您想对不同的服务器使用相同的过程,也可以通过将 --dport 更改为 2201(例如)并将该端口提供给客户端 1,将 --dport 2202 提供给客户端 2,但转到不同的服务器。
希望有所帮助。
问候,斯科特