不可以用路由器?

小李是一个刚上大学的大学生,来到学生宿舍,小李和他的舍友一起办了宽带。接好路由器,准备在宿舍进行上网冲浪的时候,他们发现无法正常上网。怎么回事?明明办宽带的时候,他们用自己的电脑接上网线验收了的呀!于是他们打电话给宽带公司,宽带公司说,只能一个设备上网,不能用多个设备一起上网,要想上网呀,宿舍里面的每一个人都要去办一个宽带才行。

真是奸商!但是小李认为,运营商是不可能知道我们是否使用了路由器的。理由这这样:运营商拉了一根线到我们的宿舍,这条线的一头是运营商的设备,另一头运营商也不知道是什么。

运营商和设备之间通过一条线连接

有这么一个谚语:在互联网上,没有人知道你是一条狗。

假设我的狗是电子狗,它能发出来遵守以太网协议的数据,我的狗就可以直接跟 ISP 之间进行交流,它就能上网了。这就是网络协议的本质,它规定了不同的设备(或者生物?)之间交流的方式,只要能遵守这种「交流方式」,就可以进行交流。

在互联网上,没有人知道你是一条狗。

无论是什么黑科技,最终网络都是遵循不同的协议来传输数据的,这背后藏不住秘密!我们一定能找到答案!

小李首先想到:既然同一条网线用在一个网络设备上可以,另一个网络设备上却不行,那会不会是 MAC 地址的问题?网线另一端的 ISP 只允许电脑的 MAC 地址,如果是路由器的 MAC 地址,就拒绝掉。有一种叫做 Sticky MAC 的端口安全技术,指的是,当交换机的端口第一次发生流量的时候,交换机就记住这个端口的 MAC 地址,从此之后,这个端口就只能允许这个 MAC 来访问。

验证这个想法很简单,小李让宿舍的另一个同学,把他的电脑接在了网线上。结果发现,即使是另一台电脑,也是可以上网的。这说明网线另一端的 ISP 并没有拿 MAC 来做限制。

那会不会是通过 MAC 来识别了设备类型呢?MAC 地址的前 24 bit 叫做 OUI,是由 IEEE 分配给不同组织的唯一标志符。我们可以在这个网站查询一个 MAC 地址属于哪一个制造商。

https://www.macvendorlookup.com

会不会是 ISP 检测到制造商是 TP-Link 这种路由器公司,就阻止访问,反而如果是终端设备,就允许访问呢?

听起来不太现实,因为有很多组织即生产路由设备又生产终端设备,无法精准识别。但还是验证一下吧,于是小李把自己的电脑 MAC 地址手动设置为 TP-Link OUI 的 MAC 地址,发现依然可以正常上网的。

这下小李实在没有思路了。他打电话给二舅,二舅是在一个互联网公司上班的网络专家(就是你!)。二舅听了之后,总结当前有的信息如下(在沟通解决问题的时候,总结自己当前有的事实信息,是一个很好的习惯):

  • 网线插在电脑上可以上网;
  • 网线插在路由器上,设备连接路由器,无法通过路由器上网;
  • 路由器连接 ISP 的账户密码等配置都是正确的;

二舅说,你用网线直接插在电脑上,然后上网并「抓包」,把抓包文件发给我,我来分析一下。

于是小李在终端运行 tcpdump -i eth0 -w 0-only-computer-no-router.pcap 命令,之后把 0-only-computer-no-router.pcap 这个文件通过电子邮箱发了过来。

请根据用 Wireshark 分析此文件,解释本文中小李遇到的问题。

(欢迎在评论区留下你的答案和想法。在思考之前,可以先不要往下滑,继续往下滑动可能会看到其他人留下的答案。)

==计算机网络实用技术 目录==

这篇文章是计算机网络实用技术系列文章中的一篇,这个系列正在连载中,我计划用这个系列的文章来分享一些网络抓包分析的实用技术。这些文章都是总结了我的工作经历中遇到的问题,经过精心构造和编写,每个文件附带抓包文件,通过实战来学习网路分析。

如果本文对您有帮助,欢迎扫博客右侧二维码打赏支持,正是订阅者的支持,让我公开写这个系列成为可能,感谢!

没有链接的目录还没有写完,敬请期待……

  1. 序章
  2. 抓包技术以及技巧
  3. 理解网络的分层模型
  4. 数据是如何路由的
  5. 网络问题排查的思路和技巧
  6. 不可以用路由器?
  7. 网工闯了什么祸?
  8. 网络中的环路和防环技术
  9. 延迟增加了多少?
  10. TCP 延迟分析
  11. 压测的时候 QPS 为什么上不去?
  12. 压测的时候 QPS 为什么上不去?答案和解析
  13. 重新认识 TCP 的握手和挥手
  14. 重新认识 TCP 的握手和挥手:答案和解析
  15. TCP 下载速度为什么这么慢?
  16. TCP 长肥管道性能分析
  17. 请求为什么超时了?
  18. 请求为什么超时了?答案和解析
  19. 后记:学习网络的一点经验分享
与本博客的其他页面不同,本页面使用 署名-非商业性使用-禁止演绎 4.0 国际 协议。


不可以用路由器?”已经有25条评论

  1. Internet Protocol Version 4, Src: 8.8.8.8, Dst: 10.0.0.1
    Time to Live: 1
    [Expert Info (Note/Sequence): “Time To Live” only 1]

    看了下cap文件,确实是 TTL 被设置成了1,那么经过一个路由器,包就会被丢弃
    破解方法搜了一下,配置路由器即可
    https://www.right.com.cn/forum/thread-73661-1-1.html

    学到了,可惜我上大学的时候宿舍可以用路由器,没研究过这个问题

  2. 如果能在路由器上用 pwru,那么能看到以下的日志:

    “`
    0xffff9c090b5970e8 1 :79609 1.1.1.1:80->10.10.0.1:40530(tcp) kfree_skb_reason(SKB_DROP_REASON_IP_INHDR) ip_forward
    “`

    然后在内核函数 ip_forward() 里找找哪里有 IP_INHDR:

    “`
    // net/ipv4/ip_forward.c
    int ip_forward(struct sk_buff *skb)
    {
    […]
    too_many_hops:
    /* Tell the sender its packet died… */
    __IP_INC_STATS(net, IPSTATS_MIB_INHDRERRORS);
    icmp_send(skb, ICMP_TIME_EXCEEDED, ICMP_EXC_TTL, 0);
    SKB_DR_SET(reason, IP_INHDR);
    […]
    }
    “`

    唯一一处 goto too_many_hops 是

    “`
    if (ip_hdr(skb)->ttl <= 1)
    goto too_many_hops;
    “`

    就知道是 ttl 的问题了,逃(

      • 如果能在路由器上抓包,其实能看到一个 ICMP 类型是 TTL exceeded (11),这是内核在丢弃 TTL=1 的 ip 包时产生的,貌似也可以用来判断丢包原因。

  3. 用 Wireshark 看抓包文件,发现直接标明了红色,发现接收到的 IP 数据包的 TTL 都被设置了 1,所以应该是 ISP 限制了 TTL 值。

    感谢分享,又涨知识了!

  4. Wireshark太智能了,打开就提示 ”Time To Live” only 1,我大学的时候运营商是通过用专用拨号软件来限制使用路由器的。

    • 集线器应该是不行的。这里您是想到不让 TTL 减1?思路是对的,但是集线器却失去了路由器的基本功能:在不同的网段转发包。集线器的话,你的终端必须得跟 ISP 那边的 IP 在同一个网段才行。

  5. 但是我这边有个疑问,因为ttl=1了,那从互联网回复的报文经过路由器之后,应该被丢弃了,为什么终端的网卡eth0还能收到报文呢?不太理解

    • 这个包 TTL=1,路由器和电脑插上线都可以收到。只不过路由器无法转发,电脑插在路由器上,就无法收到了。

      • 电脑的线不是先接到路由器上吗?然后路由器去对接的ISP提供的线,那路由器无法转发,我还是不太懂,电脑为什么会在网卡抓到ISP回复的报文的,按道理路由器应该就丢弃了呀。

        • 哦 是的。

          电脑为什么会在网卡抓到ISP回复的报文的,按道理路由器应该就丢弃了呀。

          这个是电脑直接连到 ISP 进行抓包的,抓包的时候没有接路由器。

  6. 我们学校之前使用的就是 UA 检测,好像是深信服的方案。很搞笑的检测方式,系统会识别安卓和 iOS 的 UA,很多 iOS + PC 之类的设备都没问题,一旦有一个安卓手机加入就会直接踢掉线,后面通过在路由器装一个 UA2F 的插件直接反回一个固定的 UA 即可解决问题。

回复 Manjusaka 取消回复

您的邮箱地址不会被公开。 必填项已用 * 标注