Netplan多网关配置及自动故障切换实现求助
Hey there, let's work through this multi-gateway and failover issue with Netplan on your Ubuntu 22.04 server. I see where you're coming from, and your initial config is close but missing a few key pieces for proper failover. Let's break this down step by step.
一、为什么你的初始配置不生效
你的原配置使用了已被弃用的gateway4指令(Ubuntu 22.04搭配的Netplan版本已改用routes定义网关路由),更关键的是:直接定义两个默认网关却不设置优先级和故障切换逻辑,会导致路由表冲突——系统只会优先使用其中一个网关,且不会在主网关失效时自动切换到备用网关。
二、修正Netplan配置
我们将用现代Netplan语法,把gateway4替换为routes条目,通过metric(数值越小优先级越高)设置网关优先级,具体配置如下:
network: version: 2 renderer: networkd ethernets: enp0s1: addresses: [192.168.1.2/24] routes: - to: default via: 192.168.1.1 metric: 100 # 主网关,优先级更高 on-link: true nameservers: addresses: [8.8.8.8, 8.8.4.4] enp0s2: addresses: [192.168.2.2/24] routes: - to: default via: 192.168.2.1 metric: 200 # 备用网关,优先级更低 on-link: true nameservers: addresses: [8.8.8.8, 8.8.4.4]
应用配置并验证
执行以下命令加载新的Netplan设置:
sudo netplan generate sudo netplan apply
然后查看路由表,确认两个默认路由已按metric优先级存在:
ip route show default
正常输出应类似:
default via 192.168.1.1 dev enp0s1 proto static metric 100 default via 192.168.2.1 dev enp0s2 proto static metric 200
三、添加自动故障切换逻辑
Netplan配置仅设置了路由优先级,系统不会自动检测网关是否失效。我们需要额外的监控机制来实现自动切换,以下是两种方案:
方案A:简易Shell脚本(快速上手)
创建一个监控脚本,定期ping主网关,若不可达则调整路由metric实现切换。
- 创建脚本文件:
sudo nano /usr/local/bin/gateway_failover.sh
粘贴以下内容:
#!/bin/bash MAIN_GW="192.168.1.1" MAIN_IF="enp0s1" BACKUP_GW="192.168.2.1" BACKUP_IF="enp0s2" PING_COUNT=3 PING_TIMEOUT=2 LOG_FILE="/var/log/gateway_failover.log" # 确保日志文件存在 touch $LOG_FILE while true; do # 检测主网关连通性 if ! ping -c $PING_COUNT -W $PING_TIMEOUT $MAIN_GW &>/dev/null; then # 主网关失效,切换到备用网关:抬高主路由metric,降低备用路由metric ip route change default via $MAIN_GW dev $MAIN_IF metric 300 ip route change default via $BACKUP_GW dev $BACKUP_IF metric 100 echo "$(date '+%Y-%m-%d %H:%M:%S'): 主网关$MAIN_GW不可用,已切换到备用网关$BACKUP_GW" >> $LOG_FILE else # 主网关恢复,切回原优先级 CURRENT_MAIN_METRIC=$(ip route show default | grep $MAIN_GW | awk '{print $6}') if [ "$CURRENT_MAIN_METRIC" != "100" ]; then ip route change default via $MAIN_GW dev $MAIN_IF metric 100 ip route change default via $BACKUP_GW dev $BACKUP_IF metric 200 echo "$(date '+%Y-%m-%d %H:%M:%S'): 主网关$MAIN_GW已恢复,切回主网关" >> $LOG_FILE fi fi sleep 10 # 每10秒检测一次 done
- 赋予脚本执行权限:
sudo chmod +x /usr/local/bin/gateway_failover.sh
- 配置systemd服务实现开机自启:
sudo nano /etc/systemd/system/gateway_failover.service
粘贴以下内容:
[Unit] Description=网关故障切换监控服务 After=network.target [Service] ExecStart=/usr/local/bin/gateway_failover.sh Restart=always User=root [Install] WantedBy=multi-user.target
- 启动并启用服务:
sudo systemctl daemon-reload sudo systemctl start gateway_failover.service sudo systemctl enable gateway_failover.service
可通过以下命令查看服务状态和日志:
sudo systemctl status gateway_failover.service tail -f /var/log/gateway_failover.log
方案B:Keepalived(企业级可靠方案)
如果需要更健壮的故障切换,可使用Keepalived(基于VRRP协议的工具)来监控网关并自动管理切换。
- 安装Keepalived:
sudo apt update && sudo apt install keepalived
- 配置Keepalived:
sudo nano /etc/keepalived/keepalived.conf
粘贴基础配置(按需调整参数):
global_defs { router_id GW_MONITOR } # 定义检测主网关的脚本 vrrp_script check_main_gw { script "/usr/bin/ping -c 3 -W 2 192.168.1.1" interval 10 # 每10秒检测一次 weight -20 # 检测失败时降低优先级20 } vrrp_instance VI_1 { state MASTER interface enp0s1 virtual_router_id 51 priority 100 # 初始优先级 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { check_main_gw } }
- 启动并启用服务:
sudo systemctl start keepalived sudo systemctl enable keepalived
Keepalived会自动检测主网关状态,当主网关不可达时,会降低其优先级,让备用网关自动接管流量。
四、测试故障切换
你可以通过断开主网络线缆或关闭主路由器来测试故障切换,正常情况下10-30秒内会自动切换到备用网关;当主网关恢复后,系统也会自动切回主路由。
如果配置过程中遇到任何问题,随时告诉我,我会帮你调整细节!
备注:内容来源于stack exchange,提问作者Wali Haider

