为什么需要手动配置路由
在Ubuntu系统中,默认的路由通常由DHCP自动分配,但面对多网卡、多子网或VPN等场景时,手动配置路由成为必要技能。例如,服务器同时连接内网和外网,需要指定特定网段走特定网关;或者实验室环境需要模拟不同网络拓扑。本文基于Ubuntu 22.04 LTS,介绍使用ip命令、netplan以及networkd配置静态路由和策略路由的方法,所有操作均需sudo权限。

基础概念回顾
路由表与默认网关
Linux内核维护多个路由表,默认表名为main(表ID 254)。路由表包含目标网络、网关、接口等条目。默认网关(default gateway)用于处理未匹配到其他路由的流量,通常表示为default via 192.168.1.1 dev eth0。
查看当前路由信息
ip route show
# 或
route -n
输出示例:
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.100
其中proto dhcp表示由DHCP分配,metric决定优先级。
临时配置静态路由(重启失效)
适合快速测试,使用ip route add命令。
添加静态路由
sudo ip route add 10.0.0.0/8 via 192.168.1.254 dev eth0
该命令将发往10.0.0.0/8网段的流量通过网关192.168.1.254从eth0发出。若需指定路由表,可加table 100参数。
删除与修改路由
sudo ip route del 10.0.0.0/8
sudo ip route replace 10.0.0.0/8 via 192.168.1.253 dev eth0
注意事项
- 临时配置不会写入配置文件,重启或网络服务重启后丢失。
- 添加前需确保网关可达,否则可能报错“Nexthop has invalid gateway”。
永久配置路由:使用netplan
Ubuntu 22.04默认使用netplan管理网络配置,配置文件位于/etc/netplan/,通常为01-network-manager-all.yaml或00-installer-config.yaml。
配置静态路由示例
network:
version: 2
ethernets:
eth0:
dhcp4: no
addresses: [192.168.1.100/24]
routes:
- to: 10.0.0.0/8
via: 192.168.1.254
metric: 100
nameservers:
addresses: [8.8.8.8, 1.1.1.1]
保存后执行sudo netplan apply生效。若使用NetworkManager管理,则需修改/etc/NetworkManager/system-connections/下的连接文件。
多网卡多路由配置
假设服务器有eth0(外网)和eth1(内网),需要同时访问两个网段:
network:
version: 2
ethernets:
eth0:
dhcp4: yes
eth1:
dhcp4: no
addresses: [192.168.10.10/24]
routes:
- to: 172.16.0.0/12
via: 192.168.10.1
注意:默认路由仍由eth0的DHCP提供,内网路由单独添加。
使用networkd后端
netplan默认后端为networkd,也可在配置中显式指定:
network:
version: 2
renderer: networkd
ethernets:
eth0:
...
配置完成后,可用networkctl查看状态。
策略路由(基于源地址或标记)
策略路由允许根据源IP、目的端口等条件选择不同的路由表,实现负载均衡或分流。常用工具为ip rule和ip route。
创建独立路由表
编辑/etc/iproute2/rt_tables,添加表名和ID:
100 custom_table
添加规则和路由
# 从192.168.10.0/24来的流量查找custom_table
sudo ip rule add from 192.168.10.0/24 table custom_table
# 在custom_table中添加默认路由
sudo ip route add default via 192.168.20.1 dev eth1 table custom_table
这样来自内网的流量将走eth1的网关,而其他流量走原默认路由。
持久化策略路由
netplan支持策略路由配置,但语法较为复杂。推荐使用systemd-networkd的.network文件,或编写启动脚本。简单场景下,可将命令写入/etc/rc.local(需先启用systemd服务)或使用cron @reboot。
# /etc/rc.local 示例
#!/bin/bash
ip rule add from 192.168.10.0/24 table custom_table
ip route add default via 192.168.20.1 dev eth1 table custom_table
exit 0
常见问题与排查
路由配置后不生效
- 检查语法:
sudo netplan try可测试配置,若失败会自动回滚。 - 确认接口名称:使用
ip link show查看实际网卡名,可能为enp0s3等。 - 冲突路由:使用
ip route show table all查看所有路由,避免重复或冲突。
网关ping不通
检查网关是否在同一子网,且接口已启用。可使用arping测试二层连通性。
重启后路由丢失
确认netplan配置已应用,且没有其他服务覆盖。若使用NetworkManager,需在连接设置中配置路由。
策略路由不匹配
使用ip rule show查看规则优先级,规则按数字从小到大匹配。注意from条件需与源地址完全匹配,可用ip addr确认地址。
总结
配置路由是Ubuntu网络管理的重要部分。临时调整用ip route,永久配置用netplan,复杂分流用策略路由。建议每次修改后先测试连通性,再决定是否保留。掌握这些方法,能有效应对多网络环境下的流量控制需求。