NAT 后面的应用如何获取到源 IP

2014-12-06 12:12:35 +08:00
 zeyexe
我有一台用iptables做nat的服务器,然后应用服务器(非http)放在nat服务器之后,iptables有没有办法把源IP传递给应用服务器?

iptables规则如下,12.23.56.78 是服务器的公网IP
iptables -t nat -A PREROUTING -p tcp -d 12.23.56.78 --dport 80 -j DNAT --to-destination 192.168.1.100
iptables -t nat -A POSTROUTING -j MASQUERADE

http可以通过x-forword-for传递源IP,ip层面是否有相应的解决方案?
7405 次点击
所在节点    问与答
11 条回复
tanyuxiang
2014-12-06 12:16:58 +08:00
不熟悉iptables
经过nat服务器的时候外面发过来包的源ip没修改啊,应用服务器本来就知道源ip
extreme
2014-12-06 13:20:49 +08:00
你看一下TCP三次握手。
我的思路是不POSTROUTING,在目标服务器OUTPUT时把数据包DNAT到NAT服务器。
不过我做了实验,失败了,两个原因:
1. 如果不SNAT,NAT服务器就会以客户的IP发出数据包,但很多数据中心对出网数据包的来源IP有限制……
2. 目标服务器OUTPUT处DNAT不生效,这个我百思不得其解,TCPDUMP处查看到TCP三次握手的数据包仍直接发送回给访客,无法DNAT到NAT服务器。

事实上有一个更好的解决方案——IPv4隧道,因为你目标服务器知道数据包要通过那个隧道发回去到NAT服务器,NAT服务器自然也不需要使用SNAT告诉目标服务器该把数据包发到哪个IP。
具体建立IPv4隧道的方法可以Google搜索IP GRE(推荐点击属于BuyVM的WiKi的搜索结果),我目前部分服务器正采用了此解决方案。
事实上你用PPTP,L2TP也行,因为都是建立一个隧道,关闭VPN协议的加密功能,就能把传输速度都损失降到最低。
zeyexe
2014-12-06 13:21:10 +08:00
@tanyuxiang 做nat的时候就需要把源IP换成NAT自己的IP,否则没法和应用建立连接。
extreme
2014-12-06 13:22:29 +08:00
@extreme 发现自己打错字了,最后那个语句应该是:
就能把传输速度的损失降到最低。
HowardMei
2014-12-06 13:39:39 +08:00
不可能,NAT本来就是在IP层干地址/端口转译这个活的,为了Checksum正确,还要顺便把每个TCP/UDP头信息都更新,要想ip不被转译,只能在应用层想办法,或者打洞。
zeyexe
2014-12-06 14:25:30 +08:00
@extreme 非常感谢,ip_gre 果然可以解决这个问题。
zeyexe
2014-12-06 14:26:11 +08:00
iptux
2014-12-06 14:30:52 +08:00
typcn
2014-12-06 15:52:41 +08:00
在传输的数据里面附上地址啊
invite
2014-12-06 16:53:24 +08:00
这明显不是IPTables的功能,必然得应用自己支持。
zeyexe
2014-12-06 18:51:17 +08:00
@invite 是的,iptables没法满足要求。通过ip_gre解决了这个问题。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/151917

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX