在Linux系统中,路由表是网络数据包转发的重要依据,它决定了数据包的传输路径,当需要让Linux系统访问特定网络或通过特定网关通信时,就需要手动添加路由条目,本文将详细介绍Linux系统中添加临时路由和永久路由的方法,包括常用命令参数、不同发行版的配置差异及注意事项。
路由的基本概念
Linux路由表记录了目标网络与下一跳(网关)或输出设备的映射关系,当系统需要发送数据包时,会根据目标IP地址匹配路由表:若目标地址在直连网络范围内,则直接通过对应网卡发送;若不在,则根据路由表将数据包转发到指定的网关,由网关负责后续转发,查看当前路由表可使用ip route show
或route -n
命令(-n
参数以数字形式显示,避免DNS解析延迟)。
添加临时路由(重启后失效)
临时路由适用于测试场景或短期需求,重启系统或网络服务后路由条目会自动消失,常用命令为ip route add
和route add
(route
是传统工具,ip route
是iproute2包的一部分,推荐使用后者)。
使用ip route add
命令
基本语法:ip route add <目标网络> via <网关IP> dev <网卡设备> [src <源IP>] [metric <优先级>] [table <路由表>]
参数说明:
<目标网络>
:目标网络地址,格式为IP/子网掩码长度
(如168.2.0/24
);via <网关IP>
:下一跳网关地址(若目标网络为直连网络,可省略此项);dev <网卡设备>
:输出网卡名称(如eth0
、ens33
);src <源IP>
:可选,指定数据包的源IP地址(需为网卡已配置的IP);metric <优先级>
:可选,路由优先级(值越小优先级越高,默认为0);table <路由表>
:可选,指定路由表(默认为main
,还可使用default
、local
等)。
示例:
- 添加一条到
168.2.0/24
网段的路由,通过网关168.1.254
,从网卡eth0
发送:sudo ip route add 192.168.2.0/24 via 192.168.1.254 dev eth0
- 添加默认路由(所有未知流量通过指定网关):
sudo ip route add default via 192.168.1.1 dev eth0
- 添加带优先级的路由(当存在多个网关时,优先使用高优先级路由):
sudo ip route add 10.0.0.0/24 via 192.168.1.100 dev eth0 metric 100
删除临时路由:
使用ip route del
命令,语法与add
相同,只需将add
替换为del
:
sudo ip route del 192.168.2.0/24 via 192.168.1.254 dev eth0
使用route add
命令(传统工具)
route
命令在较旧的Linux系统中仍可用,但功能有限,不支持CIDR格式的子网掩码(需使用netmask
参数)。
基本语法:route add [-net|-host] <目标地址> netmask <子网掩码> gw <网关IP> dev <网卡设备>
示例:
- 添加到
168.2.0
网络(子网掩码255.255.0
)的路由:sudo route add -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.1.254 dev eth0
- 添加主机路由(目标为单个IP):
sudo route add -host 10.0.0.10 gw 192.168.1.100 dev eth0
添加永久路由(重启后生效)
临时路由无法满足长期需求,需通过修改配置文件实现永久路由,不同Linux发行版的配置文件位置和格式差异较大,需分别处理。
Debian/Ubuntu系统(使用/etc/network/interfaces
)
在/etc/network/interfaces
文件中,通过up
指令在网卡启动后执行路由添加命令。
示例:
假设网卡为eth0
,需添加到168.2.0/24
的路由,网关为168.1.254
,编辑文件:
sudo nano /etc/network/interfaces
在网卡配置块中添加up
指令(需与网卡配置缩进对齐):
iface eth0 inet static address 192.168.1.10 netmask 255.255.255.0 gateway 192.168.1.1 # 添加永久路由 up ip route add 192.168.2.0/24 via 192.168.1.254 dev eth0
保存后重启网络服务或重启系统:
sudo systemctl restart networking
CentOS/RHEL系统(使用/etc/sysconfig/network-scripts/route-<interface>
)
CentOS/RHEL系统通过为每个网卡创建独立的路由配置文件实现,文件格式为/etc/sysconfig/network-scripts/route-<网卡名>
。
方法1:使用ADDRESS
、NETMASK
、GATEWAY
参数(传统格式)
创建文件/etc/sysconfig/network-scripts/route-eth0
:
sudo nano /etc/sysconfig/network-scripts/route-eth0 ``` 每行一条路由): ```ADDRESS0=192.168.2.0 NETMASK0=255.255.255.0 GATEWAY0=192.168.1.254
ADDRESS0
、NETMASK0
、GATEWAY0
中的数字0
表示第一条路由,可依次添加1
、2
等配置多条路由。
方法2:使用ip route
格式(推荐)
在route-eth0
文件中直接写入ip route add
命令(无需sudo
):
168.2.0/24 via 192.168.1.254 dev eth0
保存后重启网络服务:
sudo systemctl restart network
使用systemd-networkd(现代Linux系统)
对于使用systemd-networkd的系统(如Ubuntu 18.04+、CentOS 8+),可通过创建.network
文件配置路由。
示例:
创建文件/etc/systemd/network/10-eth0.network
:
sudo nano /etc/systemd/network/10-eth0.network
添加路由配置(在[Route]
段中定义):
Name=eth0
[Network]
Address=192.168.1.10/24
Gateway=192.168.1.1
[Route]
Destination=192.168.2.0/24
Gateway=192.168.1.254
保存后重启systemd-networkd服务:
sudo systemctl restart systemd-networkd
不同发行版永久路由配置对比
发行版系列 | 配置文件位置 | 配置格式示例 | 重启命令 |
---|---|---|---|
Debian/Ubuntu | /etc/network/interfaces | up ip route add ... dev <iface> |
systemctl restart networking |
CentOS/RHEL | /etc/sysconfig/network-scripts/route- | ADDRESS0=... NETMASK0=... GATEWAY0=... |
systemctl restart network |
systemd-networkd | /etc/systemd/network/ |
[Route] Destination=... Gateway=... |
systemctl restart systemd-networkd |
注意事项
- 权限问题:添加路由需root权限,使用
sudo
执行命令; - 网关可达性:网关IP必须与当前网络直连(即在同一网段),否则路由无法生效;
- 设备状态:确保网卡已启用(
ip link show <dev>
检查状态),未启用的设备无法添加路由; - 路由冲突:避免添加重复或冲突的路由(如同一目标网络通过不同网关添加多条路由),可通过
metric
参数指定优先级; - 多网卡场景:在多网卡系统中,需明确指定
dev
参数,避免数据包从错误网卡发出。
相关问答FAQs
Q1:添加永久路由后重启系统不生效,可能的原因是什么?
A:可能的原因包括:
- 配置文件语法错误:检查
/etc/network/interfaces
或route-<iface>
文件中的命令格式是否正确(如ip route add
命令是否完整); - 网络服务未正确重启:某些系统(如CentOS 7+)需使用
systemctl restart network
,而非service network restart
; - 网卡名称变更:若网卡名称(如从
eth0
变为ens33
),需修改配置文件中的设备名称; - SELinux或防火墙拦截:检查SELinux状态(
sestatus
)或防火墙规则(iptables -L
),可能阻止路由配置生效。
Q2:如何添加一条基于策略的路由(Policy Route),实现根据源IP选择不同网关?
A:策略路由通过ip rule
和ip route
配合实现,步骤如下:
- 创建自定义路由表(如
table 100
):echo "100 custom_table" >> /etc/iproute2/rt_tables
- 添加策略规则(如源IP为
168.1.10
的流量使用custom_table
):sudo ip rule add from 192.168.1.10 table custom_table
- 在自定义表中添加路由(如通过网关
168.1.100
):sudo ip route add default via 192.168.1.100 dev eth0 table custom_table
- 保存配置(永久生效需将规则添加到网络配置文件或使用
iptables-persistent
):- Debian/Ubuntu:在
/etc/network/interfaces
中添加up ip rule add ...
和up ip route add ... table ...
; - CentOS/RHEL:在
/etc/sysconfig/network-scripts/rule-eth0
中添加规则,格式为from <src> table <table>
。
- Debian/Ubuntu:在
验证策略路由:
sudo ip route get from 192.168.1.10 to 8.8.8.8 # 应显示通过custom_table的路由
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/36576.html