在 Ubuntu 上配置静态路由,本质是告诉内核:去往某个目标网段的数据包,不应该走默认网关,而应该从指定网卡发出并交给下一跳路由器。很多网络问题看似是网线或交换机故障,实际只是路由表里少了一条记录。例如主机同时连接内网和互联网,默认网关通常指向公网出口,如果内网还有其他网段,就必须为这些网段单独添加静态路由。

先看路由表:理解Ubuntu路由决策
Ubuntu 内核在发送数据包前,会查询路由表决定从哪块网卡发出、下一跳发给谁。执行 ip route show 可以看到当前主机的完整路由信息,常见输出类似下面这样:
default via 192.168.1.1 dev eth0 proto dhcp metric 100 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.10 metric 100
第一行是默认路由,表示所有没有更精确匹配的流量都发给 192.168.1.1。第二行是直连路由,说明 192.168.1.0/24 这个网段就在 eth0 接口上,无需经过网关。Ubuntu 选路遵循最长前缀匹配原则,如果路由表中同时存在 10.0.0.0/8 和 10.0.1.0/24 两条静态路由,访问 10.0.1.5 时优先匹配掩码更长的那条。
传统命令 route -n 也能查看路由表,不过现在更推荐使用 iproute2 工具集。理解这些输出并不复杂,关键是区分目的地、网关、子网掩码和接口四类信息。当目标网段没有对应路由时,数据包会走默认路由;如果默认路由也无法到达,就会出现网络不可达。
临时添加静态路由:ip route 与 route 命令
如果只是测试网络或临时打通某个网段,可以直接用 ip route add 添加静态路由。命令的基本格式是:目标网段、下一跳地址、出口设备,必要时还可以指定优先级。
sudo ip route add 192.168.10.0/24 via 192.168.1.254 dev eth0 sudo ip route add 10.20.0.0/16 via 192.168.1.254 metric 50
第一条命令表示访问 192.168.10.0/24 的流量不再走默认网关,而是交给 192.168.1.254 转发。第二条命令额外设置了 metric 50,在存在多条到达相同网段的路由时,metric 值越小优先级越高。添加完成后调用 ip route show 就能看到新的记录。如果写错了,可以用 sudo ip route del 192.168.10.0/24 删除。
习惯旧工具的用户,也可以使用 route add -net 实现相同效果,但需要显式给出子网掩码:
sudo route add -net 192.168.10.0 netmask 255.255.255.0 gw 192.168.1.254 dev eth0
无论使用哪种命令,临时路由都只保存在当前内核路由表中,重启网络服务或重启主机后就会消失。因此它适合故障排查和临时组网,不适合作为长期配置。
永久配置静态路由:Netplan与interfaces
Ubuntu 18.04 以后的版本默认使用 Netplan 管理网络配置,静态路由可以写在 YAML 文件里,重启后依然有效。通常配置文件位于 /etc/netplan/ 目录,文件名可能是 00-installer-config.yaml 或 01-network-manager-all.yaml。可以先执行 ls /etc/netplan/ 查看具体名称。
下面给出一个常见配置,在启用 DHCP 的同时添加一条到测试网的静态路由:
network:
version: 2
ethernets:
eth0:
dhcp4: true
routes:
- to: 192.168.10.0/24
via: 192.168.1.254
metric: 100
这个文件对缩进非常敏感,必须使用空格而不能使用 Tab。routes 是一个列表,每条静态路由用 to 表示目的网段,via 表示下一跳,metric 可选。编辑完成后先执行 sudo netplan try 做配置校验,Netplan 会在一定时间内等待确认,如果网络因此中断还可以自动回滚。确认无误后再执行 sudo netplan apply 让配置正式生效。
如果管理的是一台使用 /etc/network/interfaces 的旧版 Ubuntu 或定制系统,可以通过 up route add 在接口启动时追加路由:
auto eth0
iface eth0 inet static
address 192.168.1.10/24
gateway 192.168.1.1
up route add -net 192.168.10.0/24 gw 192.168.1.254 dev eth0
这种方式需要安装 ifupdown,并且与 NetworkManager、Netplan 混用时要格外小心,避免多套网络管理工具互相覆盖配置。
多网卡双网关场景:metric与策略路由
当服务器同时接入两个网络,并且两张网卡都配置了默认网关时,内核需要知道优先使用哪一个出口。此时 metric 就会发挥作用,数值较低的默认路由优先生效。执行 ip route show default 可以看到类似如下结果:
default via 192.168.1.1 dev eth0 proto dhcp metric 100 default via 10.0.0.1 dev eth1 proto dhcp metric 200
这种情况下所有主动发起的外网连接都会从 eth0 出去,eth1 的默认路由只是备用。如果希望来自 10.0.0.0/24 的流量仍然从 eth1 回包,仅靠静态路由可能不够,因为内核选择源地址和出口时会参考主路由表。一旦出现能收到请求但无法回复的问题,往往就是回程路由走错了出口。
更精细的做法是基于源地址做策略路由。先为 eth1 创建一张独立路由表,再让来自该网段的流量查询这张表:
sudo ip route add default via 10.0.0.1 dev eth1 table 100 sudo ip rule add from 10.0.0.10/32 table 100
这样从 10.0.0.10 发出的数据包会优先匹配 table 100 中的默认路由,而不是主表中的 eth0 默认路由。生产环境中还可以结合 ip rule show 查看规则顺序。需要提醒的是,策略路由只是路由层面控制,如果 Linux 本身没有开启 IP 转发,外部主机仍然无法经这台服务器访问其他网络。
常见问题与注意事项
静态路由配置中最常见的现象是:命令执行成功,但目标网段仍然不通。此时不要只盯着路由表,可以按顺序检查下一跳是否可达、物理链路是否正常、目标主机有没有回程路由。使用 ping -c 4 192.168.1.254 确认下一跳,再用 ip neigh show 查看 ARP 解析是否正常。
另一个高频问题是重启后路由丢失。所有通过 ip route add 或 route add 写入的路由都不会自动持久化,必须放入 Netplan、systemd-networkd 或 interfaces 配置文件。不少管理员配置了 Netplan 但没有执行 sudo netplan apply,或者 YAML 缩进使用了 Tab 导致解析失败,这些都需要在 /var/log/syslog 或 journalctl -u systemd-networkd 中检查。
如果 Ubuntu 主机被当作网关或 VPN 服务器使用,还需要确认内核转发功能已经打开。可以执行 sysctl net.ipv4.ip_forward 查看当前值,输出为 1 表示已开启。长期生效则需要修改 /etc/sysctl.conf,加入 net.ipv4.ip_forward=1 后执行 sudo sysctl -p。此外,防火墙规则也可能拦截转发流量,使用 sudo ufw status 或 sudo iptables -L -n -v 确认转发链是否放行。
最后要注意多套网络工具并存的问题。Ubuntu 桌面版通常由 NetworkManager 接管网络,如果手工修改了 Netplan 或 interfaces,可能被 NetworkManager 覆盖。建议根据实际发行版和部署方式只保留一套配置来源,避免同一个接口在不同工具中出现冲突定义。
Ubuntu路由配置静态路由netplan修改时间:2026-10-04 09:00:23