Freebsd更改默认的互联网通道路由

我在FreeBSD上有两个互联网通道和网关。当我使用命令route change default chan2切换通道时,命令netstat -nr显示默认路由已更改。但是traceroute显示数据包仍然通过旧的chan1通道传输。
$netstat -nr 
Routing tables Internet: Destination Gateway  Flags    Refs   Use  Netif Expire
                         default     xxx.xxx.183.54 US 0 8432    em3

$sudo route change default xxx.xxx.144.125 
change net default: gateway> xxx.xxx.144.125

$netstat -nr
Routing tables Internet: Destination Gateway Flags Refs Use  Netif Expire
                         default     xxx.xxx.144.125   US  2  16450  em3

但是
$ traceroute 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 64 hops max, 52 byte packets
 1  xxx.xxx.183.53 (xxx.xxx.183.53)  0.527 ms  0.415 ms  0.483ms

只要我运行以下组合,一切都正常:

$sudo route del default

$sleep 10

$sudo route add default xxx.xxx.144.125


你正在运行哪个版本(uname -a 应该显示)? - Chris S
FreeBSD 8.2-RELEASE FreeBSD 8.2-RELEASE #0: Fri Apr 15 12:45:40 MSD 2011 root@grs.ru:/usr/src/sys/amd64/compile/IXI_8_2_PF_x64 amd64 - Taron
你第一个路由表中的网关和你 traceroute 的第一跳不一样(.53 vs .54)- 你是复制粘贴还是重新输入?能否同时发布 netstat -rnf inet 的完整输出? - James O'Gorman
从我的网关(.54)运行的traceroute,.53是IP第一个提供商的设备。 - Taron
两个网关都连接到同一个接口吗?你展示的netstat -rn输出中,两个网关都是em3。也许你需要在route change命令中指定-interface选项。 - Craig
6在添加新的默认路由之前,请清除ARP缓存arp -d -a和/或路由表route flush。可能内核/用户空间正在查询过时的数据。 - inetplumber
4个回答

如果您使用route change命令,您需要重新启动网络服务以应用更改,例如:
$ sudo /etc/rc.d/netif restart

你可能有一个缓存的路由到8.8.8.8,这是可能的吗?完整的 netstat -nr 输出会显示这一点。如果是这样,在测试更改之前,您需要将其删除 - 要么是特定的路由,要么是您可以使用route flush然后再添加而不是更改默认网关(但请注意,在执行这两个命令之间,非本地流量将中断)。

我不知道为什么我无法识别你的netstat -rn命令的输出,但我习惯在那里看到一个NETMASK。
不确定为什么你的网络掩码没有显示出来,但既然它们没有显示出来,你可能有完全错误的网络掩码,这肯定可能是你的问题。

从ping命令的输出来看,似乎你的目标是本地IP地址,而不是远程网关。
所以如果xxx.xxx.183.54/29被分配给你的FreeBSD节点(在ifconfig下可见),你需要使用下一跳IP地址,它看起来可能是xxx.xxx.183.53/29。同样的情况可能也适用于xxx.xxx.144.125地址,它是分配给本地接口的地址。
举个例子,我有一台机器,具有以下配置:
ifconfig:
  em0: flags=8863<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
  inet xxx.xxx.123.99 netmask 0xffffff00 broadcast xxx.xxx.xxx.255
  
  em1: flags=8863<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
  inet xxx.xxx.234.99 netmask 0xffffff00 broadcast xxx.xxx.xxx.255

netstat -rn
  Destination        Gateway            Flags     Netif Expire
  default            xxx.xxx.123.254    UGS       em0

在我上面的例子中,所有的流量目前都通过em0接口流向ISP #1路由器IP(xxx.xxx.123.254)作为下一跳。
如果我想将所有的流量路由到em1而不是em0,我会使用以下命令: $sudo route change default xxx.xxx.234.1,如果xxx.xxx.234.1是我在该LAN段上的ISP #2路由器IP地址。
我还建议检查dhclient是否与任何一个ISP一起运行,因为它可能在后台安装你不知道的路由。