V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zeyexe
V2EX  ›  问与答

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

  •  
  •   zeyexe · 2014-12-06 12:12:35 +08:00 · 7391 次点击
    这是一个创建于 3648 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我有一台用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层面是否有相应的解决方案?
    11 条回复    2014-12-06 18:51:17 +08:00
    tanyuxiang
        1
    tanyuxiang  
       2014-12-06 12:16:58 +08:00   ❤️ 1
    不熟悉iptables
    经过nat服务器的时候外面发过来包的源ip没修改啊,应用服务器本来就知道源ip
    extreme
        2
    extreme  
       2014-12-06 13:20:49 +08:00   ❤️ 1
    你看一下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
        3
    zeyexe  
    OP
       2014-12-06 13:21:10 +08:00
    @tanyuxiang 做nat的时候就需要把源IP换成NAT自己的IP,否则没法和应用建立连接。
    extreme
        4
    extreme  
       2014-12-06 13:22:29 +08:00   ❤️ 1
    @extreme 发现自己打错字了,最后那个语句应该是:
    就能把传输速度的损失降到最低。
    HowardMei
        5
    HowardMei  
       2014-12-06 13:39:39 +08:00   ❤️ 1
    不可能,NAT本来就是在IP层干地址/端口转译这个活的,为了Checksum正确,还要顺便把每个TCP/UDP头信息都更新,要想ip不被转译,只能在应用层想办法,或者打洞。
    zeyexe
        6
    zeyexe  
    OP
       2014-12-06 14:25:30 +08:00
    @extreme 非常感谢,ip_gre 果然可以解决这个问题。
    zeyexe
        7
    zeyexe  
    OP
       2014-12-06 14:26:11 +08:00
    iptux
        8
    iptux  
       2014-12-06 14:30:52 +08:00
    typcn
        9
    typcn  
       2014-12-06 15:52:41 +08:00 via iPad   ❤️ 1
    在传输的数据里面附上地址啊
    invite
        10
    invite  
       2014-12-06 16:53:24 +08:00   ❤️ 1
    这明显不是IPTables的功能,必然得应用自己支持。
    zeyexe
        11
    zeyexe  
    OP
       2014-12-06 18:51:17 +08:00
    @invite 是的,iptables没法满足要求。通过ip_gre解决了这个问题。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2598 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 06:31 · PVG 14:31 · LAX 22:31 · JFK 01:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.