小李是一个刚上大学的大学生,来到学生宿舍,小李和他的舍友一起办了宽带。接好路由器,准备在宿舍进行上网冲浪的时候,他们发现无法正常上网。怎么回事?明明办宽带的时候,他们用自己的电脑接上网线验收了的呀!于是他们打电话给宽带公司,宽带公司说,只能一个设备上网,不能用多个设备一起上网,要想上网呀,宿舍里面的每一个人都要去办一个宽带才行。
真是奸商!但是小李认为,运营商是不可能知道我们是否使用了路由器的。理由这这样:运营商拉了一根线到我们的宿舍,这条线的一头是运营商的设备,另一头运营商也不知道是什么。
有这么一个谚语:在互联网上,没有人知道你是一条狗。
假设我的狗是电子狗,它能发出来遵守以太网协议的数据,我的狗就可以直接跟 ISP 之间进行交流,它就能上网了。这就是网络协议的本质,它规定了不同的设备(或者生物?)之间交流的方式,只要能遵守这种「交流方式」,就可以进行交流。
无论是什么黑科技,最终网络都是遵循不同的协议来传输数据的,这背后藏不住秘密!我们一定能找到答案!
小李首先想到:既然同一条网线用在一个网络设备上可以,另一个网络设备上却不行,那会不会是 MAC 地址的问题?网线另一端的 ISP 只允许电脑的 MAC 地址,如果是路由器的 MAC 地址,就拒绝掉。有一种叫做 Sticky MAC 的端口安全技术,指的是,当交换机的端口第一次发生流量的时候,交换机就记住这个端口的 MAC 地址,从此之后,这个端口就只能允许这个 MAC 来访问。
验证这个想法很简单,小李让宿舍的另一个同学,把他的电脑接在了网线上。结果发现,即使是另一台电脑,也是可以上网的。这说明网线另一端的 ISP 并没有拿 MAC 来做限制。
那会不会是通过 MAC 来识别了设备类型呢?MAC 地址的前 24 bit 叫做 OUI,是由 IEEE 分配给不同组织的唯一标志符。我们可以在这个网站查询一个 MAC 地址属于哪一个制造商。
会不会是 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 分析此文件,解释本文中小李遇到的问题。
(欢迎在评论区留下你的答案和想法。在思考之前,可以先不要往下滑,继续往下滑动可能会看到其他人留下的答案。)
==计算机网络实用技术 目录==
这篇文章是计算机网络实用技术系列文章中的一篇,这个系列正在连载中,我计划用这个系列的文章来分享一些网络抓包分析的实用技术。这些文章都是总结了我的工作经历中遇到的问题,经过精心构造和编写,每个文件附带抓包文件,通过实战来学习网路分析。
如果本文对您有帮助,欢迎扫博客右侧二维码打赏支持,正是订阅者的支持,让我公开写这个系列成为可能,感谢!
没有链接的目录还没有写完,敬请期待……
- 序章
- 抓包技术以及技巧
- 理解网络的分层模型
- 数据是如何路由的
- 网络问题排查的思路和技巧
- 不可以用路由器?
- 网工闯了什么祸?
- 网络中的环路和防环技术
- 延迟增加了多少?
- TCP 延迟分析
- 重新认识 TCP 的握手和挥手
- 重新认识 TCP 的握手和挥手:答案和解析
- TCP 下载速度为什么这么慢?
- TCP 长肥管道性能分析
- 后记:学习网络的一点经验分享
与本博客的其他页面不同,本页面使用 署名-非商业性使用-禁止演绎 4.0 国际 协议。
TTL
意思是,电脑经过路由器到达运营商时的TTL值已经减一了?
跳跳乐
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
学到了,可惜我上大学的时候宿舍可以用路由器,没研究过这个问题
如果能在路由器上用 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 包时产生的,貌似也可以用来判断丢包原因。
用 Wireshark 看抓包文件,发现直接标明了红色,发现接收到的 IP 数据包的 TTL 都被设置了 1,所以应该是 ISP 限制了 TTL 值。
感谢分享,又涨知识了!
熟悉软路由的同学都一眼 TTL(
有意思
第一眼想到的居然是网络尖兵。。
如果还想用路由器上网,得在路由上用iptable改回包的ttl是吧
是的。
Wireshark太智能了,打开就提示 ”Time To Live” only 1,我大学的时候运营商是通过用专用拨号软件来限制使用路由器的。
用集线器应该就可以了?
集线器应该是不行的。这里您是想到不让 TTL 减1?思路是对的,但是集线器却失去了路由器的基本功能:在不同的网段转发包。集线器的话,你的终端必须得跟 ISP 那边的 IP 在同一个网段才行。
make sense!
但是我这边有个疑问,因为ttl=1了,那从互联网回复的报文经过路由器之后,应该被丢弃了,为什么终端的网卡eth0还能收到报文呢?不太理解
这个包 TTL=1,路由器和电脑插上线都可以收到。只不过路由器无法转发,电脑插在路由器上,就无法收到了。
电脑的线不是先接到路由器上吗?然后路由器去对接的ISP提供的线,那路由器无法转发,我还是不太懂,电脑为什么会在网卡抓到ISP回复的报文的,按道理路由器应该就丢弃了呀。
哦 是的。
这个是电脑直接连到 ISP 进行抓包的,抓包的时候没有接路由器。
嗷嗷,你这么一说我就理解了
Pingback: 网络中的环路和防环技术 | 卡瓦邦噶!
我们学校之前使用的就是 UA 检测,好像是深信服的方案。很搞笑的检测方式,系统会识别安卓和 iOS 的 UA,很多 iOS + PC 之类的设备都没问题,一旦有一个安卓手机加入就会直接踢掉线,后面通过在路由器装一个 UA2F 的插件直接反回一个固定的 UA 即可解决问题。
ISP刀法精准啊,TTL多砍一刀就倒自己家过不来。