金山云下面的专有网络, 内部只有两台机器绑定弹性公网IP, 其中有公网IP的主机可以直接访问公网, 而没有公网IP的主机, 需要通过指定的主机(例如 10.1.1.200)作为网关才能访问公网.
尝试过通过金山云后台给子网添加路由, 但是这个路由会影响到 10.1.1.200 自身, 和阿里云不一样. 所以只能在每台内网机器上手工设置使用root执行命令添加默认网关
bash
route add -net 0.0.0.0 netmask 0.0.0.0 gw 10.1.1.200
检查是否存在这个路由用route -n命令, 下面第二第三条是系统自带的
bash
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.1.1.200 0.0.0.0 UG 0 0 0 eth0
0.0.0.0 10.1.1.1 0.0.0.0 UG 0 0 0 eth0
10.1.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
要确保 gateway 10.1.1.200 这条在 10.1.1.1 之上, 或者 metric 更小, metric 值越小权重越高, 如果要调整 metric, 可以用命令
bash
sudo ip route replace 0.0.0.0/0 via 10.1.1.200 metric 1
方案一: 通过 systemctl
添加到服务后, 重启后可以自动应用
创建文件 /etc/systemd/system/add-route.service
[Unit]
Description=Add default route
After=network.target
Wants=network.target
[Service]
Type=oneshot
ExecStart=/usr/bin/ip route replace 0.0.0.0/0 via 10.1.1.200 metric 0
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
添加到系统服务
bash
sudo systemctl daemon-reload
sudo systemctl enable add-route.service
sudo systemctl start add-route.service
但是这种方法, 在主机的DHCP网络产生变化后, 容易丢失路由
方案二: 添加到DHCP hook脚本
创建文件 /etc/dhcp/dhclient-enter-hooks.d/add-default-route
内容为
bash
#!/bin/bash
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') [dhclient-hook] $1"
}
# 只在特定事件时执行
case "${reason:-}" in
BOUND|RENEW|REBIND|REBOOT|EXPIRE|FAIL|RELEASE|STOP)
log "DHCP event: $reason for interface ${interface:-unknown}"
# 等待网络稳定
sleep 2
# 添加默认路由
log "Setting default route via 10.1.1.200
/usr/bin/ip route replace 0.0.0.0/0 via 10.1.1.200 metric 0
# 提高优先级,防止被覆盖
sleep 1
/usr/bin/ip route change default via 10.1.1.200 metric 0
log "Route set successfully"
;;
*)
# 其他事件不处理
;;
esac
将其设置为可执行, 启动后, 会随dhcp变化自动执行, 查看日志
bash
sudo journalctl|grep dhclient-hook
# or
sudo journalctl|grep 10.1.1.200
可以看到类似这样的内容
Feb 05 22:06:50 vm10-0-0-4 ifdown[6585]: 2026-02-05 22:06:50 [dhclient-hook] Setting default route via 10.1.1.200