Ubuntu 路由配置从入门到实践:静态路由与策略路由详解

为什么需要手动配置路由

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

Ubuntu 路由配置从入门到实践:静态路由与策略路由详解
Ubuntu 路由配置从入门到实践:静态路由与策略路由详解

基础概念回顾

路由表与默认网关

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.yaml00-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 ruleip 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,复杂分流用策略路由。建议每次修改后先测试连通性,再决定是否保留。掌握这些方法,能有效应对多网络环境下的流量控制需求。

发表评论