首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  互联网

在用户态 NAT tcp 时,有什么办法可以避免被原网段 TCP reset

  •  
  •   cz5424 · 2017-12-09 12:33:06 +08:00 · 1399 次点击
    这是一个创建于 679 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在 Libpcap 写了个简陋的 nat 程序,从 10.101.116 网段转发到 192.168.1 网段,成功转发 SYN 后,服务器 ACK,之后就被 192.168.1 网段 reset 了,导致连接中断,请问有什么方法可以避免或者解决的吗?

    抓包如图 http://gkrg1b.qiniudn.com/QQ%E6%88%AA%E5%9B%BE20171209122513.png

    7 回复  |  直到 2017-12-09 13:27:23 +08:00
        1
    choury   2017-12-09 13:01:50 +08:00 via Android
    checksum 没算对?
        2
    cz5424   2017-12-09 13:04:23 +08:00
    @choury 算对了,我用 iptables 拦截了 192,168 网段的 rst 就能正常访问了
        3
    choury   2017-12-09 13:11:54 +08:00 via Android
    拦截了正常那这个 rst 的是伪造的吧
        4
    extreme   2017-12-09 13:14:43 +08:00
    看了下抓包。

    是 SNAT 到 192.168.1.100 对吧?

    不知道你的 NAT 程序是如何实现与 125.88.59.149 通讯的?是和 125.88.59.149 之间另外 open 一个 TCP Socket,还是直接用 raw socket 发出去的?
        5
    cz5424   2017-12-09 13:20:49 +08:00 via Android
    @extreme 这是在 192.168 网段抓的包,是正确的,nat 主要手动转发所有的 10.101 的包到 192.168 网段,并且改了 ip 和 mac,也重新计算了 checksum
        6
    extreme   2017-12-09 13:24:23 +08:00
    照你那样说,你的 NAT 程序和 125.88.59.149 之间没有另外建立 TCP Socket,你只是改了 Source IP 和 Source MAC,用 Raw Socket 发出去对吧。
    这样的话,对于你运行 NAT 程序的系统内核来说,并没有对 125.88.59.149 开放一个通讯 TCP 的端口,所以就会给 125.88.59.149 回应 RESET。

    你这样实现 NAT,的确要按需 Block 掉 RESET。
        7
    cz5424   2017-12-09 13:27:23 +08:00
    @extreme 是的,直接 block 掉不知道会不会出现问题。已经测试了 block 之后能正常访问
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2302 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 22ms · UTC 07:19 · PVG 15:19 · LAX 00:19 · JFK 03:19
    ♥ Do have faith in what you're doing.