配置Debian 12双IP网络优先级和故障转移

在这篇文章中,我们将介绍如何在Debian 12系统上配置双IP网络优先级,并实现故障转移功能。假设您有一台VPS,绑定了两个IP地址:123.123.123.1(主IP)和123.123.123.3(备用IP)。我们的目标是默认使用主IP,只有在主IP不可用时才切换到备用IP。

前提条件

  • 一台运行Debian 12的VPS
  • 两个已配置的IP地址
  • SSH访问权限

步骤概览

  1. 确认网络接口名称
  2. 临时设置路由优先级
  3. 修改网络配置文件
  4. 创建故障转移脚本
  5. 设置定时任务

1. 确认网络接口名称

首先,我们需要确认系统上的网络接口名称和IP地址配置情况:

ip addr show

输出示例:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether aa:bb:cc:dd:ee:ff brd ff:ff:ff:ff:ff:ff
    inet 123.123.123.1/24 brd 123.123.123.255 scope global eth0
       valid_lft forever preferred_lft forever
3: eth0:1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether aa:bb:cc:dd:ee:ff brd ff:ff:ff:ff:ff:ff
    inet 123.123.123.3/24 brd 123.123.123.255 scope global eth0:1
       valid_lft forever preferred_lft forever

通过输出结果,我们可以确认主IP 123.123.123.1 绑定在接口 eth0​ 上,而备用IP 123.123.123.3 绑定在接口 eth0:1​ 上。

2. 临时设置路由优先级

在正式修改配置文件前,我们可以通过命令临时设置路由优先级来测试效果:

# 设置主IP的路由优先级更高(较低的metric值)
sudo ip route add default via 123.123.123.1 dev eth0 metric 100

# 设置备用IP的路由优先级较低(较高的metric值)
sudo ip route add default via 123.123.123.3 dev eth0:1 metric 200

您可以通过以下命令检查路由表,确认更改已生效:

ip route show

这些更改在系统重启后将会丢失,下面我们会通过修改配置文件使其永久生效。

3. 修改网络配置文件

编辑网络接口配置文件:

sudo nano /etc/network/interfaces

将内容修改为:

# 回环接口
auto lo
iface lo inet loopback

# 主网络接口
auto eth0
iface eth0 inet static
    address 123.123.123.1
    netmask 255.255.255.0  # 请根据您的实际子网掩码调整
    gateway 123.123.123.1  # 请根据您的实际网关调整
    metric 100             # 较低的度量值,优先级更高

# 备用网络接口
auto eth0:1
iface eth0:1 inet static
    address 123.123.123.3
    netmask 255.255.255.0  # 请根据您的实际子网掩码调整
    metric 200             # 较高的度量值,优先级较低

4. 创建故障转移脚本

创建一个监控脚本,检查主IP连接状态,在需要时进行切换:

sudo nano /usr/local/bin/ip-failover.sh

写入以下内容:

#!/bin/bash

PRIMARY_IP="123.123.123.1"
SECONDARY_IP="123.123.123.3"
GATEWAY="123.123.123.1"  # 请根据您的实际网关调整
CHECK_HOST="8.8.8.8"     # 用Google DNS服务器测试连接

# 检查主IP连接
check_primary() {
    ping -c 3 -I $PRIMARY_IP $CHECK_HOST > /dev/null 2>&1
    return $?
}

# 激活主IP路由
activate_primary() {
    if ! ip route | grep -q "default via $GATEWAY dev eth0 metric 100"; then
        ip route del default via $GATEWAY dev eth0:1 metric 200 2>/dev/null
        ip route add default via $GATEWAY dev eth0 metric 100
        logger "IP故障转移: 激活主IP $PRIMARY_IP"
        echo "$(date): 激活主IP $PRIMARY_IP" >> /var/log/ip-failover.log
    fi
}

# 激活备用IP路由
activate_secondary() {
    if ! ip route | grep -q "default via $GATEWAY dev eth0:1 metric 200"; then
        ip route del default via $GATEWAY dev eth0 metric 100 2>/dev/null
        ip route add default via $GATEWAY dev eth0:1 metric 200
        logger "IP故障转移: 激活备用IP $SECONDARY_IP"
        echo "$(date): 激活备用IP $SECONDARY_IP" >> /var/log/ip-failover.log
    fi
}

# 主功能逻辑
if check_primary; then
    activate_primary
else
    # 如果主IP连接失败,使用备用IP
    activate_secondary
    
    # 等待30秒后再次尝试主IP
    sleep 30
    if check_primary; then
        activate_primary
    fi
fi

设置脚本权限:

sudo chmod +x /usr/local/bin/ip-failover.sh

5. 设置定时任务

添加cron任务每分钟运行一次故障转移脚本:

sudo crontab -e

选择编辑器时,建议选择nano​(输入1并按回车):

Choose 1-2 [1]: 1

在crontab文件中添加以下行:

* * * * * /usr/local/bin/ip-failover.sh

保存并退出编辑器(在nano中按Ctrl+X​,然后按Y​确认保存)。

6. 重启网络服务

sudo systemctl restart networking

注意事项

  1. 请根据您的实际网络配置调整上述脚本和配置中的子网掩码和网关。
  2. 故障转移脚本使用Google DNS (8.8.8.8) 来测试连接,您可以根据需要更改为其他可靠的测试目标。
  3. 脚本每分钟运行一次,会在主IP不可用时切换到备用IP,在主IP恢复时切回。
  4. 日志会记录在系统日志和 /var/log/ip-failover.log​ 文件中。
  5. 配置后,可以通过 ip route show​ 命令查看当前路由表状态,确认主IP路由是否激活。