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

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

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

    在 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
    choury
        1
    choury  
       2017-12-09 13:01:50 +08:00 via Android
    checksum 没算对?
    cz5424
        2
    cz5424  
    OP
       2017-12-09 13:04:23 +08:00
    @choury 算对了,我用 iptables 拦截了 192,168 网段的 rst 就能正常访问了
    choury
        3
    choury  
       2017-12-09 13:11:54 +08:00 via Android
    拦截了正常那这个 rst 的是伪造的吧
    extreme
        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 发出去的?
    cz5424
        5
    cz5424  
    OP
       2017-12-09 13:20:49 +08:00 via Android
    @extreme 这是在 192.168 网段抓的包,是正确的,nat 主要手动转发所有的 10.101 的包到 192.168 网段,并且改了 ip 和 mac,也重新计算了 checksum
    extreme
        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。
    cz5424
        7
    cz5424  
    OP
       2017-12-09 13:27:23 +08:00
    @extreme 是的,直接 block 掉不知道会不会出现问题。已经测试了 block 之后能正常访问
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2931 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 03:32 · PVG 11:32 · LAX 19:32 · JFK 22:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.