我有一个连接到两个 ISP 的路由器(运行 Linux),使用 BGP 选择路由,但是,我想分别 ping/跟踪每个连接。
标准的traceroute命令似乎能够做到这一点(允许选择传出接口、源IP),但它不允许选择网关。虽然有一个命令行选项 (-g),但它所做的只是设置 IP 路由选项,而不是仅仅将数据包发送到那里。
这就是我想要的:假设我的路由器有两个 IP - 10.0.0.1(由第一个 ISP 提供)、10.1.0.1(由第二个 ISP 提供)。第一个 ISP 上的默认网关(下一跃)是 10.0.0.254,第二个 ISP 上的默认网关是 10.1.0.254。其中一个被选为当前默认网关(通过 BGP),但我也希望能够通过另一个网关使用跟踪/ping。我无法更改路由表(在不导致连接中断的情况下,尤其是在其他 ISP 出现问题的情况下)。
traceroute_oth --nexthop 10.0.0.254 8.8.8.8 应该给出
1 10.0.0.254
2 some-iother-ip.first-isp.com
...
x 8.8.8.8
traceroute_oth --nexthop 10.1.0.254 8.8.8.8 应该给出
1 10.1.0.254
2 some-ip.second-isp.com
...
x 8.8.8.8
编辑:“traceroute -i”不起作用,因为路由器不知道其他网关。基本上,路由表是这样的(简化的):
0.0.0.0/0 gw 10.0.0.254 eth0
如果我没有明确指定,程序就无法知道 eth1 上的默认网关(链接到其他 ISP)是什么。
答案1
您确实阅读了手册页,对吧?
-i interface, --interface=interface
Specifies the interface through which traceroute should send
packets. By default, the interface is selected according to the
routing table.
答案2
发布此内容以防有人遇到与我相同的问题:
在 ubuntu 上,程序inetutils-traceroute
包不允许您设置源接口,而程序traceroute
包却允许。您几乎肯定想要后者。
答案3
我遇到了同样的问题,但幸运的是我能够解决它。
在一台多宿主计算机中,无论存在多少个接口,都只能定义一个默认网关。如果您尝试跟踪路由到与您使用标志指定的接口不在同一子网中的主机-i
,则跟踪路由将因缺少网关而失败(假设您不够幸运,无法使用具有网关的单个接口)定义的默认网关)。
解决方案是为计算机中的每个“额外”接口定义额外的路由表
总而言之,如果您有 2 个具有以下特征的接口:
Interface A: IP: 10.0.0.10 subnet: 255.255.255.0 Gateway 10.0.0.1
Interface B: IP: 192.168.0.10 subnet: 255.255.255.0 Gateway 192.168.0.1
并且只有 A 的默认网关出现在路由表中,您需要执行以下步骤来包含 B 的网关:
转到
/etc/iproute2/rt_tables
以下行的末尾1 routingTableB
以 root 身份运行以下命令:
ip route add 192.168.0.0/24 dev <Interface B> src 192.168.0.10 table routingTableB ip route add default via 192.168.0.1 dev <Interface B> table routingTableB ip rule add from 192.168.0.10/32 table routingTableB ip rule add to 192.168.0.10/32 table routingTableB
此后,您将能够-i
在接口 B 中使用该标志,不会出现任何问题。
请注意,重新启动后此配置将丢失。检查上面的链接,了解如何使其永久化。
附带说明一下,标志-g
, 并不指示接口将数据包发送到哪个 IP。它是探针中包含的一个参数,旨在指示中间节点如何路由数据包。
答案4
嗯......这里只是一个概念,但我想说 - 策略路由:
将新的 RT 表添加到您的 Linux
echo 200 test >> /etc/iproute2/rt_tables
添加与其匹配的策略规则
ip rule add oif <iface_to_second_ISP> table test
在新创建的表中添加默认路由
ip route add 0.0.0.0/0 via <second_ISP_next_hop> dev <iface_to_second_ISP> table test
刷新缓存并测试
ip route flush cache
ping -I <IP_on_second_ISP_iface> google.com