几天前,我遇到了无法使用工作 VPN 的情况。当时我正在工作,我试图 ping 我的家庭服务器,但它没有响应;好吧,这种情况发生的选项太多了。但后来我尝试用手机(蜂窝网络)连接到它……它有响应。我开始调查这个问题,并遇到了以下事实。
先决条件:家用设备是华硕 RT-AC68U 路由器,带有 Merlin 固件,没有任何已知故障。家用 IP 是静态的,89.179.244.35 - vnikityuk.static.corbina.ru(从未发生过 DNS 故障,这是此记录的唯一 IP 地址)。提供商连接是 IPoE(以太网 100 MBps)。从家里可以看到大部分互联网(包括 Google 和 Serverfault.com)。所有必要的操作,如重新启动路由器、更新其固件、将连接直接更改为 PC,都已完成且没有任何影响。
当我从办公室网络追踪我的家庭住址时,它卡在了第 3 跳。
当我从办公网络追踪我的“邻居”的地址 89.179.244.40 时,它在 10 跳内成功追踪到最后。
当我从家里追踪我的办公室地址时,它被卡在我的提供商和其中一个中间提供商之间的边界上的第 5 跳处。
我联系了办公室的网络管理员,他发誓说他没有 IP 过滤之类的东西。我相信他,因为第 5 条:
当我尝试从不同的提供商追踪我的家庭住址时,同样的情况出现,概率为 50/50。我的意思是,追踪不会再进行第二跳(或第三跳)。为了得到这个结果,我询问了大约 10 位朋友,要求追踪我的和“邻居”的地址。
在所有这些网络中,“邻居”都会被追踪。
这让我大吃一惊。我没有 CCNA 认证,但我倾向于相信我了解互联网的工作原理 - 子网、自治系统、BGP 等。但现在似乎在同一个子网 (89.179.244.0/24, AS8402) 中路由不同的 IP 地址会收到不同的回复!这怎么可能呢?
PS 我有一个“快速解决方法”,即更换 ISP(我所在地区有很多 ISP)。但首先我想了解一下这种情况。
答案1
当我从办公室网络追踪我的家庭住址时,它卡在了第 3 跳。
这可能是你的错工作场所的上游提供商,纯粹根据跳数进行猜测(做出假设,但如果公司规模足够大,拥有多个办事处和一个 VPN,那么在到达 ISP 之前可能会有两个甚至三个内部跳数),并且还尝试从不同位置跟踪指定的地址。
当我从家里追踪我的办公室地址时,它被卡在我的提供商和其中一个中间提供商之间的边界上的第 5 跳处。
如果看不到来自两个方向的踪迹,这可能会产生误导。通常,同一台路由器的 IP 地址既属于其实际所有者,也属于其实际所有者和与其对等的各个中间提供商,并且 AS 编号和“反向 DNS”都可能对应于该提供商(或例如 IX),即使它在技术上是客户的路由器。
现在似乎在同一个子网(89.179.244.0/24,AS8402)中路由不同的 IP 地址会收到不同的回复!
可能有以下几种解释:
BGP 路由(以及一般路由)不要必然对应于子网。它们对应于网络,但网络可能由一个子网、多个子网或半个子网组成。您的 ISP 完全有可能拥有两个
/25
子网或四个/26
子网,并通过 BGP 将它们作为聚合/24
路由进行通告(ISP 的内部路由也是如此)。反之亦然,实际子网可能是 /20 或 /17 或其他,但 ISP 将 BGP 通告分解为多个 /24 以达到(通常可疑的)“BGP 优化”目的。
一些路由可能根本不一定指向“子网”;相反,/24 中的每个单独地址都可能通过不同的设备进行点对点路由。
例如,实际上可能没有 89.179.244.0/24 子网,但客户路由器内部使用完全不同的地址,并且其“公共”地址在内部路由为 /32(例如
89.179.244.35/32 via 172.16.42.35
类似的东西)。我知道附近的一家 ISP 就是这样做的。我不会对某些完全过渡到 IPv6(使用“IPv4 即服务”模型)的网络中出现这种情况感到惊讶。作为一个更常见的例子,大多数 VPN 类型都以点对点模式(无 ARP)工作,而不是模拟广播子网。
与上述类似,即使 ISP 有针对整个网络的通用 BGP 路由,他们内部也可能有手动专门为您的地址添加了一条更具体的路线,例如,如果他们出于某种原因需要阻止到该地址的流量。完全有可能将某个地址路由到
/32
其他地方而不是其他地方(唯一的问题是为什么)。路由分歧点可能是使用 ECMP(等价多路径路由)。在企业路由器(甚至 Linux)中,路由可能具有多种的指定网关,数据包可使用其中任意一个。这可与 BGP 结合使用,例如,如果存在多条优先级相同的路径,路由器无需使用决胜局来选择一条“最佳”路径,而是将它们全部组合成 ECMP 路由。
$ ip route show /* Normal route: */ 10.147.112.0/24 via 10.147.240.4 dev gre-ember proto bird metric 32 /* ECMP route: */ 10.147.122.0/24 proto bird metric 32 nexthop via 10.147.240.3 dev gre-wind weight 1 nexthop via 10.147.240.4 dev gre-ember weight 1
通常在 ECMP 中,每个数据包的下一跳是通过对其源和目标地址进行哈希处理来选择的,这样来自同一对等体的所有数据包都采用相同的路径,但不同的目的地可能采用不同的路径。
例如,如果有两个下一跳,则
hash(src.dst) mod 2
确定选择哪个下一跳(第 0 个或第 1 个),因此,您可能会看到“奇数”目标 IP 将使用下一跳 A,而“偶数”目标将使用下一跳 B,反之亦然。(这与基于 LACP 的链路聚合的工作方式类似,只是在 L3 而不是 L2。)
答案2
Traceroute 并非 100% 可靠。除非它能从每个跳转获得响应,否则它不会很好地工作。几年前它工作得很好,因为没有服务器有理由避免使用它。但现在有很多理由放弃 ping。
您可以尝试nmap
获取的最后一个跳转,并确切了解该服务器的情况。您的家用路由器可能配置为丢弃某些 ping,在这种情况下,traceroute 将无法发现它。
您还可以摆弄 traceroute 程序,看看是否可以调整时间以获得更多响应。我做过跟踪,但在第一跳之后什么都没有显示!所以,除非您对看似已死的主机进行端口扫描,否则您根本不知道那里到底有什么。
你家里有开放端口来接收 ping 吗?如果每个端口都关闭,即没有服务器连接到互联网,路由器也可能会丢弃 ping,因为根本没有必要透露你在那里。另外,你的静态 IP 是从 dhcp 调制解调器连接转换而来的吗?有些服务会提交你的动态 IP,然后你会得到一个静态 IP。如果你的动态 IP 发生变化,你必须告诉服务新的 IP。
这些类型的静态 IP 并非普遍接受。它不像动态 DNS,动态 IP 会转换为 URL。从网络角度来看,将一个 IP 转换为另一个 IP 更加危险。而且并不是每个互联网路由器都能识别这样的事情。
尝试使用来自 ISP 的 IP,还是从 ISP 获取静态 IP?无论如何,事情并不总是像简单的网络工具所显示的那样。有时你需要深入挖掘。