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

请教个关于 NAT 的问题

  •  
  •   mantianyu · 2014-06-20 14:41:00 +08:00 · 2514 次点击
    这是一个创建于 3600 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我有一个嵌入式设备, 连在路由器上的, 但是不能连接外网. 我在我想要连接的远程服务器上抓包发现, 远程服务器收到了来自我路由器地址的 TCP SYN 包, 然后远程服务器回了 SYN + ACK 包, 再然后远程服务器就再也没收到我路由器地址的 ACK 包.

    而我路由器看起来也没有收到远程服务器的 SYN + ACK 包, 它连着又发了几个 SYN 包之后告终. 远程服务器也连着发了很多 SYN + ACK 之后告终.

    很明显, TCP 三步握手没完成, 嵌入式设备往外发的包能发出去, 但是外面进来的包嵌入式设备收不到, 所以我怀疑和 NAT 有关系, 但不知道具体什么问题.

    我的电脑也是连在这个路由器上的, 电脑就可以正常的连外网. 为何这个嵌入式设备不行呢?

    请高手帮忙分析下可能的原因...

    难道是嵌入式设备上网卡对 NAT 协议实现的不完善?

    另: 电脑和嵌入式设备都是通过有线连接到路由器的.
    13 条回复    2014-06-20 18:05:24 +08:00
    pfitseng
        1
    pfitseng  
       2014-06-20 14:45:33 +08:00
    设备的型号,IP地址,大致的拓扑
    billlee
        2
    billlee  
       2014-06-20 14:46:11 +08:00   ❤️ 1
    终端设备一般不需要管 NAT, 你在路由器上抓包看看?
    mantianyu
        3
    mantianyu  
    OP
       2014-06-20 14:56:50 +08:00
    @pfitseng 嵌入式设备是块 arduino 开发板, 网络扩展板是 W5100, 路由器的 IP 是静态 IP...

    拓朴怎么说呢...

    路由器是直接接的光纤 modem, 开了 2.4G 和 5G 的无线频段, 有两台台式机通过有线接到路由器上, 其它设备都是通过无线接入的路由器, 所有这些设备都能正常和外网通信.

    这个嵌入式设备也是通过有线接到路由器上的, 但是却不能和外网通信.


    @billlee 我这个路由器没有刷 Openwrt 这样的操作系统, 就是 Netgear 自带的系统, 可以上去抓包吗?
    pfitseng
        4
    pfitseng  
       2014-06-20 15:14:59 +08:00   ❤️ 1
    @mantianyu 停掉一台正常工作的台式机(拔掉网线),把 arduino 的网卡 MAC 地址改成停掉的台式机的网卡地址。
    不过你可以先看看ARP表有没有问题。
    mantianyu
        5
    mantianyu  
    OP
       2014-06-20 15:38:02 +08:00
    @pfitseng 好的, 不过我的路由器是 Netgear 自带的操作系统, 好像没有 ssh, 没法上去操作...
    xdeng
        6
    xdeng  
       2014-06-20 15:52:38 +08:00   ❤️ 1
    arduino 是怎么获取IP的 还是自己填的静态ip?
    clowwindy
        7
    clowwindy  
       2014-06-20 15:56:45 +08:00   ❤️ 1
    在局域网里用一台电脑打开混杂模式抓一下 arduino 的包看看
    mantianyu
        8
    mantianyu  
    OP
       2014-06-20 16:13:44 +08:00
    @pfitseng 刚依照你说的试了下, 还是不行, arduino 的 MAC 地址改成了已经连接了的 PC 的 MAC 地址, 在路由器的 "已连接设备" 界面也看到了 arduino 分配到了和之前的 PC 一样的 IP, 但结果还是连不上外网. 但是把 arduino 拔下来, 把 PC 插上, PC 就能正常的连接外网...

    真冋啊....


    @xdeng arduino 板子的 IP 是动态获取的.


    @clowwindy 嗯, 谢谢, 我也想这么弄, 就是还不太会玩混杂模式, 我 google google 先 :D
    pfitseng
        9
    pfitseng  
       2014-06-20 16:25:09 +08:00
    @mantianyu 你确定arduino里设置对了么,上网的参数
    mantianyu
        10
    mantianyu  
    OP
       2014-06-20 16:27:12 +08:00
    @pfitseng 对了, 有一点我觉得可能有必要提, 就是:

    当 arduino 板子 (不管是用本来自己随便写的 MAC, 还是用我已经有线连到路由器上正常工作的电脑的 MAC ) 往远程服务器发包时, 在远程服务器上抓包发现, 我的路由器是给 arduino 板映射了 1025 这个端口.

    而我在我的有线连接到路由器的电脑上(就是 arduino 借 MAC 用的那个电脑), 用 `nc` 这样的工具建立和远程服务器的连接时, 路由器给我这个电脑映射的端口号是 43458 这样的上万的端口.

    这个现象不是偶然的, 我这两天测了很多次, 每次 arduino 都是 1025 端口, 而我的笔记本, 还是上面的电脑都是 30000-50000 之间的端口号.
    mantianyu
        11
    mantianyu  
    OP
       2014-06-20 16:31:34 +08:00
    @pfitseng 参数应该没什么问题, 除了 MAC 地址, 其它的参数都是自动获取的.

    连接远程服务器时写的直接是 IP 地址, 所以 DNS 就算没获取到也不影响, gateway 肯定是也获取到了, 因为 arduino 发的 TCP SYN 包确实是到达了远程服务器了啊, 但远程服务器的包就是进不来...
    pfitseng
        12
    pfitseng  
       2014-06-20 17:53:56 +08:00   ❤️ 1
    @mantianyu 再去借个anduino吧,或者弄台笔记本再测试下
    mantianyu
        13
    mantianyu  
    OP
       2014-06-20 18:05:24 +08:00
    @pfitseng 我拿三个 arduino 试过...

    我再查查别的原因
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5455 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 09:05 · PVG 17:05 · LAX 02:05 · JFK 05:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.