
一、前言
在多IP或多网卡服务器中,默认所有流量都走主路由出口。
但在某些情况下,我们希望让指定目标网段通过特定源IP访问,例如:
一台服务器绑定多个公网IP,想让不同目标网站使用不同出口;
需要从指定源IP访问合作方系统;
内外网并存时,想强制某流量走内网。
本文总结 三种通用实现方式,在 CentOS / Ubuntu / Debian / Rocky / AlmaLinux / openEuler 等系统均可使用。
二、方法一:策略路由(Policy Routing)【推荐】
🧩 示例需求
从源IP 10.0.0.3 访问目标网段 1.1.1.0/24
指定网关为 10.0.0.254,网卡为 eth0。
1️⃣ 创建自定义路由表
编辑 /etc/iproute2/rt_tables,添加一行:
echo "200 custom_table" >> /etc/iproute2/rt_tables2️⃣ 在该表中添加默认路由
ip route add default via 10.0.0.254 dev eth0 table custom_table3️⃣ 建立策略规则
ip rule add to 1.1.1.0/24 lookup custom_table4️⃣ 指定源IP绑定
ip route add default via 10.0.0.254 dev eth0 src 10.0.0.3 table custom_table5️⃣ 验证生效
ip rule show | grep 1.1.1.0
ip route show table custom_table
tcpdump -i eth0 src 10.0.0.3 and dst 1.1.1.0/24✅ 持久化配置(根据系统不同)
CentOS / RHEL / Rocky / AlmaLinux:
echo "to 1.1.1.0/24 lookup custom_table" > /etc/sysconfig/network-scripts/rule-eth0
echo "default via 10.0.0.254 dev eth0 src 10.0.0.3" > /etc/sysconfig/network-scripts/route-custom_table⚠️ 权限需为
644,否则系统可能忽略。
Ubuntu / Debian:
Ubuntu 18+ / Debian 10+ 默认使用 netplan 或 systemd-networkd。
两种方法任选其一:
方法A:Netplan 方式
编辑配置文件 /etc/netplan/01-netcfg.yaml:
network:
version: 2
ethernets:
eth0:
dhcp4: no
addresses: [10.0.0.3/24]
routes:
- to: 1.1.1.0/24
via: 10.0.0.254
table: 200
routing-policy:
- to: 1.1.1.0/24
table: 200保存后应用:
netplan apply方法B:开机脚本方式(兼容旧系统)
cat >/etc/networkd-dispatcher/routable.d/10-custom-route <<'EOF'
#!/bin/bash
ip route add default via 10.0.0.254 dev eth0 src 10.0.0.3 table custom_table
ip rule add to 1.1.1.0/24 lookup custom_table
EOF
chmod +x /etc/networkd-dispatcher/routable.d/10-custom-route此脚本会在网络接口启动后自动执行,Ubuntu 16~22.04 均适用。
三、方法二:iptables SNAT(修改源IP)
通过SNAT让发往目标网段的流量自动改为指定源IP。
iptables -t nat -A OUTPUT -d 1.1.1.0/24 -j SNAT --to-source 10.0.0.3保存规则:
CentOS / RHEL 系列:
yum install -y iptables-services
service iptables save
systemctl enable iptablesUbuntu / Debian 系列:
apt install -y iptables-persistent
netfilter-persistent save验证:
iptables -t nat -L -n -v
curl --connect-timeout 5 http://1.1.1.1四、方法三:手动静态路由(简易版)
适用于无需复杂策略的小场景。
ip route add 1.1.1.0/24 via 10.0.0.254 src 10.0.0.3 dev eth0要持久化:
CentOS / RHEL:
echo "1.1.1.0/24 via 10.0.0.254 src 10.0.0.3 dev eth0" >> /etc/sysconfig/network-scripts/route-eth0Ubuntu / Debian:
echo "up ip route add 1.1.1.0/24 via 10.0.0.254 src 10.0.0.3 dev eth0" >> /etc/network/interfaces
五、常见问题与注意事项
1️⃣ 网关验证
确保网关正确:
ip route show default2️⃣ 策略优先级
如系统已有其他策略,可指定优先级:
ip rule add to 1.1.1.0/24 lookup custom_table priority 10003️⃣ 防火墙干扰
如启用 firewalld,建议禁用或放行相关规则:
systemctl stop firewalld && systemctl disable firewalld4️⃣ 检查生效状态
ip rule show
ip route show table custom_table六、总结对比
七、完整验证流程
查看策略表:
ip rule show查看自定义路由:
ip route show table custom_table抓包验证:
tcpdump -i eth0 src 10.0.0.3 and dst 1.1.1.0/24测试连通性:
curl -4 -I http://1.1.1.1
✅ 总结
推荐使用 策略路由(Policy Routing),兼容所有主流Linux系统,灵活可靠。
若仅需短期修改源IP,可用 iptables SNAT。
小规模静态出口可用 静态路由绑定源IP。
评论区