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

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

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

    需求目标:服务器已经配置了一个内网 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
        1
    lhbc   2017-01-27 10:19:20 +08:00 via iPhone
    删掉内网 IP
        2
    eastpiger   2017-01-27 10:26:21 +08:00
    @lhbc #1 ACK 包的请求来源来自于内网 ip ,就这么删了肯定是要出问题的。。。
        3
    lcdtyph   2017-01-27 10:43:30 +08:00
    你的意思是修改 tcp 的第二个包的源 ip 么?
    可是这么做没有任何意义啊,如果第二个包回应用的是内网 ip ,说明第一个 SYN 包的目的地址就是内网 ip ,你强行改成公网 ip 回应让客户端怎么应答啊= =
        4
    treo   2017-01-27 10:49:18 +08:00
    @lcdtyph 对方不会应答,直接 drop
        5
    lcdtyph   2017-01-27 10:52:05 +08:00
    @treo 所以我觉得 lz 的目的没啥意义嘛,如果他不想让别人用内网 ip 连接服务器就直接把目的地址是内网 ip 的包 reject 掉好了= =||
        6
    eastpiger   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 ,建立连接。
        7
    msg7086   2017-01-27 11:08:54 +08:00
    为啥不是被路由器 DROP ?
        8
    eastpiger   2017-01-27 11:09:05 +08:00
    @lcdtyph #3 严格来说,我不仅想修改 SYN/ACK 包,我还想修改掉所有的 ACK 包,也就是这个服务器以后对外的联络全部都用公网 ip 的身份实现(以解决路由那边不做 SNAT 只做 DNAT 的问题),但是收到消息却都是从内网 ip 收到的(这一部分我改不了,上游路由也改不了)

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

    连接建立失败
        10
    eastpiger   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 ,建立连接成功。
        11
    lcdtyph   2017-01-27 11:16:14 +08:00
    @eastpiger 抱歉没有网络拓扑图我好像没太看懂您的描述……
        12
    eastpiger   2017-01-27 11:19:24 +08:00
    @lcdtyph #11
        13
    eastpiger   2017-01-27 11:21:26 +08:00
    @lcdtyph #11 我希望强行修改后实现这样的效果:(红框这里)

        14
    gulucn   2017-01-27 11:29:28 +08:00 via Android
    感觉你想的东西跟 http://m.chinabyte.com/soft/25/13169025_m.shtml 里面的第三种负载均衡方法相似
        15
    lcdtyph   2017-01-27 11:42:26 +08:00
    @eastpiger 抱歉……才疏学浅,没想到什么办法
        16
    realityone   2017-01-27 13:28:13 +08:00
    在 PREROUTING 里再加一条 DNAT 到 2.2.2.2 呢?
        17
    eastpiger   2017-01-27 13:50:14 +08:00 via Android
    @realityone 这个倒是没试过。。可是这个有什么关系么?出站的时候是 MAS 改成网卡 ip 了吧
        18
    zhjits   2017-01-28 00:46:38 +08:00
    你这样改了以后包首先会被你的出口路由器干掉
        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 的原因了…(或者说明一下我的做法的错误之处…毕竟不是专业的)
        20
    yankebupt   2017-01-28 01:46:01 +08:00 via Android
    @realityone 忘了看,上面好像有人说过了
        21
    ryd994   2017-01-28 08:08:11 +08:00 via Android
    懂不懂什么叫 TCP 四元组?
        22
    mengskysama   2017-01-28 09:47:48 +08:00 via iPhone
    这个拓扑不全吧,服务器回包到上级路由肯定回 drop 掉伪造源地址的包。除非经过特殊配置。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   782 人在线   最高记录 5043   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 19ms · UTC 20:50 · PVG 04:50 · LAX 13:50 · JFK 16:50
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1