不可以用路由器?

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

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

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

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

假设我的狗是电子狗,它能发出来遵守以太网协议的数据,我的狗就可以直接跟 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. 重新认识 TCP 的握手和挥手
  12. 重新认识 TCP 的握手和挥手:答案和解析
  13. TCP 下载速度为什么这么慢?
  14. TCP 长肥管道性能分析
  15. 后记:学习网络的一点经验分享
与本博客的其他页面不同,本页面使用 署名-非商业性使用-禁止演绎 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 即可解决问题。

Leave a comment

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