Loading... 在运维独立服务器(Dedicated Server)或 VPS 时,我们经常遇到需要配置**额外 IP (Failover IP / Floating IP)** 的场景。 很多人在配置网络时最担心的就是:**一旦配错,SSH 直接断连,只能去控制台(VNC/IPMI)救火。** 本文分享一个基于 Ubuntu `Netplan` 的自动化脚本,专为 **Root 用户** 设计。它不仅能快速配置 IP,更引入了“后悔药”机制,确保即使配错也能自动回滚,不用担心把自己锁在门外。 ## 核心知识点:为什么选 /32 而不是 /24? 在配置单点 IP 时,很多教程会误导新手使用 `/24` (255.255.255.0) 掩码。 虽然 `/24` 也许能让你临时 ping 通,但这在标准机房网络环境中通常是**错误且有隐患的**: * **广播风暴风险**:`/24` 会让服务器错误地向整个局域网段发送广播包。 * **被机房拦截**:许多机房的交换机或防火墙检测到非法的 ARP 广播后,会判定为配置错误甚至恶意攻击,从而阻断你的网络。 **正确的做法:** 严格遵循机房给出的掩码建议,通常单点 IP 应配置为 **/32 (255.255.255.255)**。这样能避免路由表混乱,是最安全、最标准的配置。 ## 解决方案:安全配置脚本 (`add_ip_safe.sh`) 这个脚本针对 **Root 用户** 优化,无需 sudo,直接执行。它包含两个核心功能: 1. **强制规范掩码**:默认使用 `/32`,防止配置错误。 2. **Netplan Try 机制**:应用配置时给予 **10秒** 的确认时间。如果配置后网络断开(无法确认),系统会自动回滚到旧配置。 ### 脚本代码 将以下代码保存为 `add_ip_safe.sh`: ```bash #!/bin/bash # ================= 用户配置区域 ================= # 请修改为你的实际网卡名称 (如 eth0, ens3, eno1) INTERFACE="eno1" # 你想要作为全局出口的那个 IP NEW_IP="212.83.128.44" # 配置文件路径 CONFIG_FILE="/etc/netplan/60-failover-ip.yaml" # =============================================== # 1. 检查 Root 权限 if [ "$EUID" -ne 0 ]; then echo "❌ 错误: 此脚本必须以 root 身份运行。" exit 1 fi echo "==========================================" echo "正在初始化网络配置脚本..." echo "目标接口: $INTERFACE" echo "目标 IP: $NEW_IP" echo "==========================================" # 2. 自动获取当前默认网关 IP # 我们需要知道原本的网关是谁,才能告诉新 IP 往哪里发数据 GATEWAY_IP=$(ip -4 route list 0/0 | awk '{print $3}' | head -n 1) if [ -z "$GATEWAY_IP" ]; then echo "❌ 致命错误: 无法自动检测到默认网关!" echo "请检查服务器的主网络连接是否正常。" exit 1 fi echo "✅ 检测到当前默认网关: $GATEWAY_IP" # 3. 生成 Netplan 配置文件 # 核心修正点: # 1. metric: 50 -> 优先级高于主 IP (主 IP 通常是 100) # 2. on-link: true -> 允许 /32 IP 跨网段直接与网关通信 (这是之前断连的根本原因) cat > "$CONFIG_FILE" <<EOF network: version: 2 ethernets: $INTERFACE: addresses: - $NEW_IP/32 routes: - to: default via: $GATEWAY_IP from: $NEW_IP metric: 50 on-link: true EOF echo "✅ 配置文件已写入: $CONFIG_FILE" # 4. 语法检查 echo "🔍 正在检查配置语法..." netplan generate if [ $? -ne 0 ]; then echo "❌ 语法错误!已自动删除错误配置,系统未受影响。" rm "$CONFIG_FILE" exit 1 fi # 5. 安全应用 (Netplan Try) echo " " echo "🚀 准备应用配置!" echo "⚠️ 请注意:脚本将等待 10 秒。" echo "👉 如果 SSH 没有断开,请在 10秒内 按【回车键 (Enter)】确认配置!" echo "👉 如果 SSH 断开了,请等待 10秒,系统会自动回滚。" echo " " read -p "准备好了吗?按回车键开始..." # 执行 netplan try netplan try --timeout 10 # 6. 结果判断与验证 if [ $? -eq 0 ]; then echo " " echo "🎉 配置已确认并保存!" echo "正在验证出口 IP..." # 等待路由表刷新 sleep 2 # 检测当前流量出口 IP CURRENT_IP=$(curl -s --connect-timeout 5 ifconfig.me) echo "------------------------------------------" echo "当前对外显示 IP: $CURRENT_IP" echo "------------------------------------------" if [[ "$CURRENT_IP" == "$NEW_IP" ]]; then echo "✅ 完美!全局流量现在通过 $NEW_IP 传出。" else echo "⚠️ 注意:配置已保存,但测试显示的 IP 仍是旧的。" echo "这可能是因为 curl 缓存或多路路由策略,建议重启一次网络服务或服务器。" fi else echo " " echo "↩️ 操作取消或超时,配置已回滚。" echo "正在清理临时文件..." rm "$CONFIG_FILE" echo "清理完成,系统已恢复原样。" fi ``` ## 如何使用 ### 1. 创建脚本 直接在服务器终端执行(直接粘贴代码): ```bash cat > add_ip_safe.sh # (在此处粘贴上面的代码,然后按 Ctrl+D 保存) ``` 或者使用 `vim add_ip_safe.sh` 手动创建。 ### 2. 赋予权限并运行 ```bash chmod +x add_ip_safe.sh ./add_ip_safe.sh ``` ## 运行后的情况预演 执行脚本后,会发生以下两种情况之一: * **情况 A (一切顺利)**: 屏幕上会出现 `Do you want to keep these settings?` 的倒计时提示。 此时你的 SSH 连接正常,直接按 **Enter (回车)** 键。 脚本会显示 `🎉 成功!`,新 IP 即刻生效。 * **情况 B (配置失败/断网)**: 你会发现终端突然卡住了(Network error),或者无法输入任何内容。 **这时候不要慌,去喝口水。** 因为我们设置了 10秒 超时,Netplan 会检测到你没有确认,自动判定为配置失败。 **10秒后,服务器会自动恢复旧配置**,你重新连接 SSH,删除或修改脚本里的配置排查问题即可。 最后修改:2025 年 12 月 15 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏