Linux中不能为特定IP直接指定专属网关,但可通过静态路由让目标网段(如10.10.20.0/24)或主机(如172.16.0.100/32)流量经指定网关和出口网卡,需用ip route add命令并明确via和dev参数,避免多默认网关冲突。

Linux 系统中不能也不应为“特定目的 IP”直接指定一个“专属网关”,但可以通过添加**静态路由规则**,让发往某个目标网络(或单个主机)的数据包走指定的网关和出口网卡。这本质上是路由层面的精细控制,不是修改默认网关本身。
明确适用场景:按目标网络选路
所谓“特定目的 IP”,实际操作中几乎总是指一个目标子网(如 10.10.20.0/24)或一个精确主机路由(如 192.168.5.100/32)。Linux 路由表按最长前缀匹配工作,因此必须用 CIDR 表示法精确声明目标范围。
- 想让所有去
192.168.5.0/24的流量走192.168.1.2?可以。 - 想让唯一一个 IP
172.16.0.100的包走另一台路由器?需写成172.16.0.100/32。 - 试图给每个公网 IP 单独配网关?不现实,也不符合路由设计逻辑。
用 ip route 添加静态路由(推荐)
这是现代 Linux 最标准、最可靠的方式,无需重启服务,立即生效:
-
添加路由:
sudo ip route add 10.10.20.0/24 via 192.168.1.2 dev eth0
其中via指定下一跳网关,dev明确出口接口(强烈建议加上,避免内核自动选择错误设备)。 -
验证是否生效:
ip route get 10.10.20.10—— 会显示该地址实际匹配哪条路由及出接口。 -
删除路由:
sudo ip route del 10.10.20.0/24
永久保存静态路由
临时命令重启即失效。要持久化,需写入对应发行版的网络配置文件:
-
Debian/Ubuntu(使用 ifupdown):在
/etc/network/interfaces对应接口段落中加一行:up ip route add 10.10.20.0/24 via 192.168.1.2 dev eth0 -
RHEL/CentOS/Fedora(NetworkManager 或传统脚本):
→ 若用 NetworkManager:nmcli connection modify "System eth0" +ipv4.routes "10.10.20.0/24 192.168.1.2"
→ 若用传统脚本:在/etc/sysconfig/network-scripts/route-eth0中写入:10.10.20.0/24 via 192.168.1.2 dev eth0
注意多网关冲突与策略路由
一台机器只允许一个默认网关(0.0.0.0/0),否则会导致路由混乱甚至断网。若你已有默认网关,又需要多个出口路径,必须避免添加第二个 default via。
- 所有非默认路由都应基于具体目标网段,而非覆盖默认行为。
- 如果真需按源地址、协议或应用分流(比如办公流量走 A 网关、视频流量走 B 网关),则需进阶使用
ip rule + ip route构建策略路由(policy routing),这不是简单“指定专属网关”,而是整套路由策略体系。


















