接二连三的巧合,让我迷失方向
有一天,我让其他部门的做开发的同事测试一下他们那边到我们这边一个机房的网络情况。果断掏出三件宝ping、telnet、traceroute上来就干。当然结果是ping不通、telnet不到、只好用路由追踪Traceroute来试试。这不测不知道,一测还是不知道。因为测下来只显示了到网关的一跳路由后面的路由就没有显示了,第一个反应肯定是对端的网关没有到我们这边来的路由。后来我又找另外一个开发基友,在网段一样的另一个机子(之前网络已打通)上试下去我们其他机房的路由情况。试下来一看确实只有一跳,当中的路由全部看不到,最后一跳就到我们机房了。这一对比,明显是被禁用了ICMP回显,那两边是都有可能存在问题了啊。很多时候可能为了安全就把ICMP回显关了,也同样给运维人员问题排查带来了困扰。
如果抛开打通过的机子上测试,当看到只有网关的一跳,后面全是*号,会有哪些情况导致这个结果呢,另外我为什么第一反应会是对端的网关没加路由呢?下面我们通过实验详细说说追踪不到路由的原因。
测试环境拓扑:
Route2上Ip 192.168.4.1 用来当做开发同事的网关。Route4当做开发同事的机器。Route3就作为我们另一个机房的三层出口交换机或者说具有路由功能的设备。首先在Route4上看下正常有回显,有路由情况下的追踪情况。
[root@route4_vsw5 ~]# traceroute -n 192.168.4.5
traceroute to 192.168.4.5 (192.168.4.5), 30 hops max, 60 byte packets
1 192.168.3.1 0.915 ms 0.903 ms 0.900 ms
2 192.168.1.1 2.200 ms 2.159 ms 2.166 ms
3 192.168.2.3 3.880 ms 3.848 ms 3.869 ms
4 192.168.4.5 4.138 ms 4.258 ms 4.271 ms
第一种可能:Route2无路由
# 先在Route2上将路由删除,这里网关必须存在default默认路由,如果没有默认路由,会匹配不到任何路由,报文数据就不会进入协议栈。因而直接结束追踪。
[root@route2_vsw4 ~]# ip route show
default via 192.168.10.254 dev ens192
192.168.1.0/24 dev ens224 proto kernel scope link src 192.168.1.2
192.168.2.0/24 via 192.168.1.1 dev ens224 proto static metric 101
192.168.3.0/24 dev ens256 proto kernel scope link src 192.168.3.1
192.168.4.0/24 via 192.168.1.1 dev ens224 proto static metric 101
192.168.10.0/24 dev ens192 proto kernel scope link src 192.168.10.2 metric 100
[root@route2_vsw4 ~]# ip route del 192.168.4.0/24 via 192.168.1.1 dev ens224 proto static metric 101
[root@route4_vsw5 ~]# traceroute -n 192.168.4.5
traceroute to 192.168.4.5 (192.168.4.5), 30 hops max, 60 byte packets
1 192.168.3.1 0.869 ms 0.881 ms 0.841 ms
2 * * *
3 * * *
...... #当中都是一样的,又比较长,使用省略号表示
29 * * *
30 * * *
如上可以看到,当Route2没有去往Route4的静态路由时,现象是Route4 只有下一跳网关地址192.168.3.1。
第二种可能:Route2关回显,Route3无路由
[root@route2_vsw4 ~]# iptables -A FORWARD -m ttl --ttl-gt 1 -j DROP #关闭ttl大于1的回显(相当于后些跳数的回显)
[root@route2_vsw4 ~]# iptables -A FORWARD -m ttl --ttl-eq 1 -j DROP #--ttl-eq 1 是丢弃ttl等于1的回显(相当于本机回显),这里先不执行此命令,如执行后现象和前面‘第一种可能’会不一致
[root@route3_vsw5 ~]# ip route show
default via 192.168.10.254 dev ens192
192.168.1.0/24 via 192.168.2.1 dev ens224 proto static metric 101
192.168.2.0/24 dev ens224 proto kernel scope link src 192.168.2.3
192.168.3.0/24 via 192.168.2.1 dev ens224 proto static metric 101
192.168.4.0/24 dev ens256 proto kernel scope link src 192.168.4.1
192.168.10.0/24 dev ens192 proto kernel scope link src 192.168.10.3 metric 100
[root@route3_vsw5 ~]# ip route del 192.168.3.0/24 via 192.168.2.1 dev ens224 proto static metric 101
[root@route4_vsw5 ~]# traceroute -n 192.168.4.5
traceroute to 192.168.4.5 (192.168.4.5), 30 hops max, 60 byte packets
1 192.168.3.1 1.135 ms 1.067 ms 1.085 ms
2 * * *
3 * * *
......
29 * * *
30 * * *
看到这里,应该可以理解我为什么一开始怀疑的是对端的网关没加路由了吧。因为光从现象上看,第一种可能只需要满足一个条件,而第二种可能则... 就这么巧关了后面的回显,就这么巧不关本机回显,就这么巧我方的回程路由没加。任何一个知道什么是概率的人,也能理解我为什么会这样判断吧!下面在补充两个知识点!
补充知识点1:如果我想隐藏几条跳路由,如何实现
注意这里是隐藏一些路由追踪条目,而不是像上面一样为*。
[root@route2_vsw4 ~]# iptables -t mangle -A PREROUTING -m ttl --ttl-gt 1 -j TTL --ttl-inc 2 #隐藏两条
[root@route4_vsw5 ~]# traceroute -n 192.168.4.5 #比正常情况下少了两条
traceroute to 192.168.4.5 (192.168.4.5), 30 hops max, 60 byte packets
1 192.168.3.1 1.674 ms 1.583 ms 1.544 ms
2 192.168.4.5 5.270 ms 5.254 ms 5.239 ms
[root@route2_vsw4 ~]# iptables -t mangle -D PREROUTING -m ttl --ttl-gt 1 -j TTL --ttl-inc 2 #删除原来的配置
[root@route2_vsw4 ~]# iptables -t mangle -A PREROUTING -m ttl --ttl-gt 1 -j TTL --ttl-inc 1 #隐藏一条
[root@route4_vsw5 ~]# traceroute -n 192.168.4.5 #比正常情况下少了一条
traceroute to 192.168.4.5 (192.168.4.5), 30 hops max, 60 byte packets
1 192.168.3.1 1.000 ms 1.010 ms 1.009 ms
2 192.168.2.3 3.821 ms 3.795 ms 3.845 ms
3 192.168.4.5 5.604 ms 5.779 ms 5.770 ms
补充知识点2:Traceroute和ICMP回显有什么关系
如下图,从Route5上抓包可以得出结论。Route5收到TTL为1的UDP数据包,返回的是TTL为64的ICMP数据包且ICMP Type是3、Code也是3。
ICMP TYPE CODE 对应表
ICMP类型
TYPE | CODE | Description | Query | Error |
---|---|---|---|---|
0 | 0 | Echo Reply——回显应答(Ping应答) | x | |
3 | 0 | Network Unreachable——网络不可达 | x | |
3 | 1 | Host Unreachable——主机不可达 | x | |
3 | 2 | Protocol Unreachable——协议不可达 | x | |
3 | 3 | Port Unreachable——端口不可达 | x | |
3 | 4 | Fragmentation needed but no frag. bit set——需要进行分片但设置不分片比特 | x | |
3 | 5 | Source routing failed——源站选路失败 | x | |
3 | 6 | Destination network unknown——目的网络未知 | x | |
3 | 7 | Destination host unknown——目的主机未知 | x | |
3 | 8 | Source host isolated (obsolete)——源主机被隔离(作废不用) | x | |
3 | 9 | Destination network administratively prohibited——目的网络被强制禁止 | x | |
3 | 10 | Destination host administratively prohibited——目的主机被强制禁止 | x | |
3 | 11 | Network unreachable for TOS——由于服务类型TOS,网络不可达 | x | |
3 | 12 | Host unreachable for TOS——由于服务类型TOS,主机不可达 | x | |
3 | 13 | Communication administratively prohibited by filtering——由于过滤,通信被强制禁止 | x | |
3 | 14 | Host precedence violation——主机越权 | x | |
3 | 15 | Precedence cutoff in effect——优先中止生效 | x | |
4 | 0 | Source quench——源端被关闭(基本流控制) | ||
5 | 0 | Redirect for network——对网络重定向 | ||
5 | 1 | Redirect for host——对主机重定向 | ||
5 | 2 | Redirect for TOS and network——对服务类型和网络重定向 | ||
5 | 3 | Redirect for TOS and host——对服务类型和主机重定向 | ||
8 | 0 | Echo request——回显请求(Ping请求) | x | |
9 | 0 | Router advertisement——路由器通告 | ||
10 | 0 | Route solicitation——路由器请求 | ||
11 | 0 | TTL equals 0 during transit——传输期间生存时间为0 | x | |
11 | 1 | TTL equals 0 during reassembly——在数据报组装期间生存时间为0 | x | |
12 | 0 | IP header bad (catchall error)——坏的IP首部(包括各种差错) | x | |
12 | 1 | Required options missing——缺少必需的选项 | x | |
13 | 0 | Timestamp request (obsolete)——时间戳请求(作废不用) | x | |
14 | Timestamp reply (obsolete)——时间戳应答(作废不用) | x | ||
15 | 0 | Information request (obsolete)——信息请求(作废不用) | x | |
16 | 0 | Information reply (obsolete)——信息应答(作废不用) | x | |
17 | 0 | Address mask request——地址掩码请求 | x | |
18 | 0 | Address mask reply——地址掩码应答 |
路由追踪原理:
默认 TTL 和跃点限制值
TTL代表路由的跳数,为防止路由环路而生,TTL值每经过一个路由会减一。
- Linux 内核 2.4(大约 2001 年):TCP、UDP 和 ICMP 为255
- Linux 内核 4.10 (2015):TCP、UDP 和 ICMP 为64
- Windows XP (2001):TCP、UDP 和 ICMP 为128
- Windows 10 (2015):TCP、UDP 和 ICMP 为128
- Windows Server 2008:TCP、UDP 和 ICMP 为128
- Windows Server 2019 (2018):TCP、UDP 和 ICMP 为128
- MacOS (2001):TCP、UDP 和 ICMP 为64
Linux Traceroute 和 Windows Tracert 工具(以及其他工具)依赖于 TTL 或跳数限制字段来进行操作。这些工具使用不断增加的 TTL(从值 1 开始)将数据包发送到目的地。收到 TTL 为 1 的数据包后,第一跳路由器(可能是源主机的默认网关)会将 TTL 减 1,导致值为零。这将导致路由器丢弃数据包并向源发送一条 ICMP 超时错误消息。
然后以 TTL 为 2 的数据包发送,依此类推,直到数据包最终到达目标主机。 ICMP 错误消息和发送它们的主机的源地址揭示了沿路径使用哪些路由器将数据包传送到目的地。然后,traceroute 工具以逻辑方式将该信息呈现给用户。
:::: column
::: column-left
:::
::: column-right
:::
::::
客官,欢迎光临本站!路途遥远,常进来看看!
本文由mdnice多平台发布
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。