我有一个安装了 DD-WRT v24-sp2 的路由器,我无法访问与我的公共 IP 地址在同一子网内配置的另一个 IP 地址。我的 ISP 需要使用 DHCP 建立 WAN 连接,因此 IP 和网关都是自动分配的。分配给 WAN 接口的 IP 地址也是公共 IP 地址。
为了说明这个例子:
DD-WRT router -> [lan] ip: 192.168.1.1/24
[wan] ip: 12.34.56.78/24 (public IP)
现在让我们假设我的邻居使用相同的 ISP 和相同的配置,因此连接到相同的公共12.34.56.0/24
网络(例如使用 WAN IP 地址12.34.56.10
)并在该公共 IP 上公开一些服务。我遇到的问题是,我无法从我的 DD-WRT 路由器或连接到此路由器的任何设备访问该服务,甚至无法 ping 我邻居的公共 IP。
当我使用不同的互联网连接时,我可以毫无问题地访问此服务,所以我 100% 确定这个问题只存在于我的 DD-WRT 路由器后面。
我的路由表如下所示:
root@DD-WRT:~# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 12.34.56.1 0.0.0.0 UG 0 0 0 vlan2
12.34.56.0 0.0.0.0 255.255.255.0 U 0 0 0 vlan2
127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 br0
192.168.66.0 192.168.66.2 255.255.255.0 UG 0 0 0 tun0
192.168.66.2 0.0.0.0 255.255.255.255 UH 0 0 0 tun0
有什么想法可以开始解决这个问题吗?
答案1
我也不是专家。我写这篇文章是因为我的 ISP 也有类似的设置(WAN 作为/24
子网),路由表也类似。不同之处在于它可以工作。我甚至可以嗅探来自或发往我的一些“邻居”的数据包(但不是全部;我认为这些邻居与我共享一个集线器)。
traceroute
正如我所料,我的“邻居”显示了单跳。
就你的情况而言,你和邻居之间似乎没有单跳连接,或者某些透明设备出于某种原因将你们分开。无论哪种情况,根据你获得的这些 DHCP 设置,你的 ISP 配置并不完全符合我的预期。ISP 方面存在一些特殊情况。ISP 应该做的正确事情可能是:
- 允许您和您的邻居通过集线器、交换机等透明设备进行一跳通信,这将使其成为一个常规子网;或者
- 允许您和您的邻居通过网关进行两跳通信。
您可以自行尝试
上述第二点并不意味着你完全不能通过网关与邻居通信现在。您可能会被允许,也可能不被允许,网关可以以任何方式配置。重点是:使用您当前的路由表,您不会尝试这样做。
路由表的第二行(12.34.56.0 …
)告诉路由器,每当它需要向邻居发送数据包时,它都应该使用邻居的 IP 发送数据包和硬件 (MAC) 地址作为目标。硬件地址最初是未知的,因此路由器会广播该地址。这永远不会到达邻居,您就陷入困境。
尝试暂时从路由表中删除第二行:
route del -net 12.34.56.0 netmask 255.255.255.0 dev vlan2
并让默认的那个起作用。您发送给邻居的每个数据包都将发送到他或她的 IP,但发送到网关的硬件地址(类似于您与外界通信时的情况)。现在网关的工作就是传递这个数据包。它可能会也可能不会这样做。
就我而言,如果我删除了正确的路由规则,我仍然可以联系到我的“邻居”;traceroute
显示二跳数,中间节点是我的 ISP 网关。问题在于响应:它们直接发往我的硬件地址,因为我的“邻居”未改变路由表。这对我来说有用,但对你却没用。所以你的邻居必须用同样的方法他们的路由表,然后可能工作。
我碰巧拥有我的一个“邻居”的管理员权限。我更改了它的路由表以及我的路由表。然后我确认wireshark
数据包在两个方向上都通过网关(使用其硬件地址)跳跃。
如果这对你和你的邻居有用,那么就以某种方式使这个更改永久生效。当然,这是一种解决方法,如果你的 ISP 更改配置会更好。