请教个关于 NAT 的问题

2014-06-20 14:41:00 +08:00
 mantianyu
我有一个嵌入式设备, 连在路由器上的, 但是不能连接外网. 我在我想要连接的远程服务器上抓包发现, 远程服务器收到了来自我路由器地址的 TCP SYN 包, 然后远程服务器回了 SYN + ACK 包, 再然后远程服务器就再也没收到我路由器地址的 ACK 包.

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

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

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

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

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

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

拓朴怎么说呢...

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

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


@billlee 我这个路由器没有刷 Openwrt 这样的操作系统, 就是 Netgear 自带的系统, 可以上去抓包吗?
pfitseng
2014-06-20 15:14:59 +08:00
@mantianyu 停掉一台正常工作的台式机(拔掉网线),把 arduino 的网卡 MAC 地址改成停掉的台式机的网卡地址。
不过你可以先看看ARP表有没有问题。
mantianyu
2014-06-20 15:38:02 +08:00
@pfitseng 好的, 不过我的路由器是 Netgear 自带的操作系统, 好像没有 ssh, 没法上去操作...
xdeng
2014-06-20 15:52:38 +08:00
arduino 是怎么获取IP的 还是自己填的静态ip?
clowwindy
2014-06-20 15:56:45 +08:00
在局域网里用一台电脑打开混杂模式抓一下 arduino 的包看看
mantianyu
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
2014-06-20 16:25:09 +08:00
@mantianyu 你确定arduino里设置对了么,上网的参数
mantianyu
2014-06-20 16:27:12 +08:00
@pfitseng 对了, 有一点我觉得可能有必要提, 就是:

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

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

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

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

我再查查别的原因

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/118627

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX