Linux 路由表是系统网络堆栈中的核心组件之一,用于决定数据包的传输路径。通过理解路由表的结构和配置,可以精确地控制流量的转发和分流。
Linux 路由表的结构
通过命令 ip route show
或 route -n
查看路由表。输出示例如下:
# ip route show
default via 192.168.1.1 dev eth0
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100
10.0.0.0/8 via 192.168.1.2 dev eth1
路由表字段说明
每条路由规则包含以下关键字段:
字段 | 含义 |
---|---|
目标地址 (prefix) | 数据包的目的网络或 IP,例如 192.168.1.0/24 。 |
网关 (via) | 下一跳地址,表示数据包要先发送到网关再转发。 |
网络设备 (dev) | 用于发送数据包的网络接口,例如 eth0 或 tun0 。 |
协议 (proto) | 路由条目的来源(如 kernel 表示内核生成,static 表示手动配置)。 |
作用域 (scope) | 路由的范围,例如 link 表示直接连接。 |
源地址 (src) | 数据包从该源 IP 地址发送(通常在多网卡或多 IP 场景下使用)。 |
权重 (metric) | 路由优先级,数字越小优先级越高。 |
Linux 路由表中的路由类型
1. 默认路由 (Default Route)
default via 192.168.1.1 dev eth0
- 匹配所有未明确指定目标地址的流量。
- 通常指向网关(如路由器或上层交换机)。
2. 主机路由 (Host Route)
192.168.1.100 dev eth0 scope host
- 仅匹配一个具体的 IP 地址(
/32
)。 - 用于本地通信或特定流量控制。
3. 子网路由 (Subnet Route)
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100
- 匹配一个子网范围(如
/24
表示 256 个 IP)。 - 常见于 LAN 环境。
4. 策略路由
结合多路由表和规则,允许基于条件(如源地址、协议类型)指定路由。
Linux 路由表的管理
可以使用 ip route
命令动态配置路由表。
1. 查看路由
ip route show
或简写:
ip r
2. 添加路由
添加静态路由:
ip route add <网络地址>/<子网掩码> via <网关> dev <接口>
示例:
ip route add 192.168.2.0/24 via 192.168.1.1 dev eth0
添加默认路由:
ip route add default via 192.168.1.1 dev eth0
3. 删除路由
ip route del <网络地址>/<子网掩码>
示例:
ip route del 192.168.2.0/24
4. 修改路由
实际上是删除旧路由并添加新路由:
ip route del 192.168.2.0/24
ip route add 192.168.2.0/24 via 192.168.1.2 dev eth0
5. 清空路由
清空某个接口的路由:
ip route flush dev <接口>
清除缓存:
ip route flush cache
路由的高级用法
1. 配置多路由表
Linux 支持多路由表,可以为特定流量设置不同的路由。
添加一个新路由表:
echo "200 mytable" >> /etc/iproute2/rt_tables
为新表添加路由:
ip route add 192.168.3.0/24 via 192.168.2.1 table mytable
设置规则使用新表:
ip rule add from 192.168.2.100 table mytable
2. 设置路由优先级
通过 metric
字段设置优先级(数字越小,优先级越高):
ip route add default via 192.168.1.1 dev eth0 metric 100
ip route add default via 192.168.1.2 dev eth1 metric 200
路由表的工作机制
-
匹配规则:
- 路由表按照最长前缀匹配原则工作,即选择最具体的路由规则。
- 例如,
192.168.1.0/24
会优先于192.168.0.0/16
。
-
路由优先级:
- 如果多条路由规则有相同的匹配范围,则根据
metric
字段选择优先级较高的规则。
- 如果多条路由规则有相同的匹配范围,则根据
-
路由缓存:
- Linux 会缓存路由查询结果以提高性能,但动态更改路由表时可能需要清空缓存。
常见场景
1. VPN 路由
让 VPN 流量走专用隧道:
ip route add 10.0.0.0/8 dev tun0
2. 分流多网卡流量
为特定网络绑定特定网卡:
ip route add 192.168.2.0/24 dev eth1
ip route add 192.168.3.0/24 dev eth2
3. 配置多出口
设置两条默认路由,实现简单的负载均衡:
ip route add default nexthop via 192.168.1.1 weight 1 nexthop via 192.168.1.2 weight 2
总结
Linux 路由表通过 ip route
提供强大的网络流量控制能力。其灵活性和可扩展性可以满足从简单的单网卡配置到复杂的多网卡、多出口、多策略的需求。如果需要进一步应用到具体环境或场景,可以提供更多细节,我可以帮你定制路由解决方案。