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

如何主动修改所有的出站 ACK 包的源 ip?

  •  
  •   eastpiger · 2017-01-27 10:09:27 +08:00 · 3630 次点击
    这是一个创建于 2890 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求目标:服务器已经配置了一个内网 ip ,假设是 1.1.1.1 ,同时还分配了一个公网 ip2.2.2.2,我想实现的效果是:无论什么样的请求到服务器,其 ACK 包的源 ip 全部修改为公网 ip2.2.2.2 。

    尝试过在 iptables 的 POSTROUTING 中 SNAT 出站包并修改 ip ,但是实测这样只能修改本机主动发出的包,而对收到的请求的回复( ACK)包没有效果。

    不知道有没有哪位有可行方向的建议?

    第 1 条附言  ·  2017-01-27 11:37:45 +08:00
    解释一下:

    这是我现在服务器所在的网络状态:(其中路由实际上是做了一个不完整的端口转发)




    而这是我希望实现的效果:(红框就是我想做的)

    22 条回复    2017-01-28 09:47:48 +08:00
    lhbc
        1
    lhbc  
       2017-01-27 10:19:20 +08:00 via iPhone
    删掉内网 IP
    eastpiger
        2
    eastpiger  
    OP
       2017-01-27 10:26:21 +08:00
    @lhbc #1 ACK 包的请求来源来自于内网 ip ,就这么删了肯定是要出问题的。。。
    lcdtyph
        3
    lcdtyph  
       2017-01-27 10:43:30 +08:00
    你的意思是修改 tcp 的第二个包的源 ip 么?
    可是这么做没有任何意义啊,如果第二个包回应用的是内网 ip ,说明第一个 SYN 包的目的地址就是内网 ip ,你强行改成公网 ip 回应让客户端怎么应答啊= =
    treo
        4
    treo  
       2017-01-27 10:49:18 +08:00
    @lcdtyph 对方不会应答,直接 drop
    lcdtyph
        5
    lcdtyph  
       2017-01-27 10:52:05 +08:00
    @treo 所以我觉得 lz 的目的没啥意义嘛,如果他不想让别人用内网 ip 连接服务器就直接把目的地址是内网 ip 的包 reject 掉好了= =||
    eastpiger
        6
    eastpiger  
    OP
       2017-01-27 11:04:46 +08:00
    @lcdtyph #5 是这样的,我们的上级路由指向我的公网 ip 映射的时候没有做回源,于是产生了这样的情况:

    内网 1.1.1.2 访问公网 2.2.2.2 ,发到路由器,路由器执行 DNAT 改为 1.1.1.2 发往 1.1.1.1 ,

    服务器收到消息,发送第二次握手,从 1.1.1.1 发往 1.1.1.2 ,客户端 DROP

    而我这样修改了源 ip 之后就变成了:

    服务器收到消息,发送第二次握手,从 1.1.1.1 发往 1.1.1.2 ,被我强制修改为 2.2.2.2 发往 1.1.1.2 ,客户端发回 ACK ,建立连接。
    msg7086
        7
    msg7086  
       2017-01-27 11:08:54 +08:00
    为啥不是被路由器 DROP ?
    eastpiger
        8
    eastpiger  
    OP
       2017-01-27 11:09:05 +08:00
    @lcdtyph #3 严格来说,我不仅想修改 SYN/ACK 包,我还想修改掉所有的 ACK 包,也就是这个服务器以后对外的联络全部都用公网 ip 的身份实现(以解决路由那边不做 SNAT 只做 DNAT 的问题),但是收到消息却都是从内网 ip 收到的(这一部分我改不了,上游路由也改不了)

    这样服务器的网站以后再内网用内网 ip 就访问不了了,原因正如您所说的那样。但是好处在于我们的公网 ip 无论在公网还是在内网都能访问了。这样我 DNS 好歹能正常 work 。算是至少能用的一种方案吧
    jasontse
        9
    jasontse  
       2017-01-27 11:10:15 +08:00 via iPad
    1.1.1.1: mdzz 2.2.2.2 我没找你啊

    连接建立失败
    eastpiger
        10
    eastpiger  
    OP
       2017-01-27 11:12:54 +08:00
    @jasontse #9 1.1.1.1 就是 2.2.2.2 、你确定没理解错么?

    是 1.1.1.2 连接 2.2.2.2 ,被路由修改为 1.1.1.2 连接 1.1.1.2 ,然后服务器收到回复 1.1.1.1 到 1.1.1.2 ,被我改成 2.2.2.2 回复 1.1.1.2 ,建立连接成功。
    lcdtyph
        11
    lcdtyph  
       2017-01-27 11:16:14 +08:00
    @eastpiger 抱歉没有网络拓扑图我好像没太看懂您的描述……
    eastpiger
        12
    eastpiger  
    OP
       2017-01-27 11:19:24 +08:00
    @lcdtyph #11
    eastpiger
        13
    eastpiger  
    OP
       2017-01-27 11:21:26 +08:00
    @lcdtyph #11 我希望强行修改后实现这样的效果:(红框这里)

    gulucn
        14
    gulucn  
       2017-01-27 11:29:28 +08:00 via Android
    感觉你想的东西跟 http://m.chinabyte.com/soft/25/13169025_m.shtml 里面的第三种负载均衡方法相似
    lcdtyph
        15
    lcdtyph  
       2017-01-27 11:42:26 +08:00
    @eastpiger 抱歉……才疏学浅,没想到什么办法
    realityone
        16
    realityone  
       2017-01-27 13:28:13 +08:00
    在 PREROUTING 里再加一条 DNAT 到 2.2.2.2 呢?
    eastpiger
        17
    eastpiger  
    OP
       2017-01-27 13:50:14 +08:00 via Android
    @realityone 这个倒是没试过。。可是这个有什么关系么?出站的时候是 MAS 改成网卡 ip 了吧
    zhjits
        18
    zhjits  
       2017-01-28 00:46:38 +08:00
    你这样改了以后包首先会被你的出口路由器干掉
    yankebupt
        19
    yankebupt  
       2017-01-28 01:43:25 +08:00 via Android
    在服务器本机上拦截所有入站到 1.1.1.1 包并真的把他们发到 2.2.2.2 不知道可行不(相当于 cancel 掉了路由对于之前目标地址的修改)(前提你的服务程序能绑定 2.2.2.2 )因为看别人好像这么干过……如果做不到,估计你需要更新一下拓扑图说明一下或者说明一下为什么不能绑定 2.2.2.2 的原因了…(或者说明一下我的做法的错误之处…毕竟不是专业的)
    yankebupt
        20
    yankebupt  
       2017-01-28 01:46:01 +08:00 via Android
    @realityone 忘了看,上面好像有人说过了
    ryd994
        21
    ryd994  
       2017-01-28 08:08:11 +08:00 via Android
    懂不懂什么叫 TCP 四元组?
    mengskysama
        22
    mengskysama  
       2017-01-28 09:47:48 +08:00 via iPhone
    这个拓扑不全吧,服务器回包到上级路由肯定回 drop 掉伪造源地址的包。除非经过特殊配置。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2620 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 15:37 · PVG 23:37 · LAX 07:37 · JFK 10:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.