V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
cz5424
V2EX  ›  互联网

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

  •  
  •   cz5424 · Dec 9, 2017 · 2699 views
    This topic created in 3061 days ago, the information mentioned may be changed or developed.

    在 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 replies    2017-12-09 13:27:23 +08:00
    choury
        1
    choury  
       Dec 9, 2017 via Android
    checksum 没算对?
    cz5424
        2
    cz5424  
    OP
       Dec 9, 2017
    @choury 算对了,我用 iptables 拦截了 192,168 网段的 rst 就能正常访问了
    choury
        3
    choury  
       Dec 9, 2017 via Android
    拦截了正常那这个 rst 的是伪造的吧
    extreme
        4
    extreme  
       Dec 9, 2017
    看了下抓包。

    是 SNAT 到 192.168.1.100 对吧?

    不知道你的 NAT 程序是如何实现与 125.88.59.149 通讯的?是和 125.88.59.149 之间另外 open 一个 TCP Socket,还是直接用 raw socket 发出去的?
    cz5424
        5
    cz5424  
    OP
       Dec 9, 2017 via Android
    @extreme 这是在 192.168 网段抓的包,是正确的,nat 主要手动转发所有的 10.101 的包到 192.168 网段,并且改了 ip 和 mac,也重新计算了 checksum
    extreme
        6
    extreme  
       Dec 9, 2017
    照你那样说,你的 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
       Dec 9, 2017
    @extreme 是的,直接 block 掉不知道会不会出现问题。已经测试了 block 之后能正常访问
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1131 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 18:10 · PVG 02:10 · LAX 11:10 · JFK 14:10
    ♥ Do have faith in what you're doing.