#!/bin/bash

###############################################################################
# Rocky Linux VPN Firewall 配置脚本 (基于 Firewalld) - 针对当前环境优化
# 检测到的环境:
#   - 外网接口: eth0
#   - VPN 接口: tun1
#   - VPN 网段: 10.10.20.0/24
###############################################################################

set -e

# ================= 自动/手动配置区域 =================
# 根据你的 ip addr 输出,这里强制指定为 tun1
VPN_INTERFACE="tun1"
VPN_SUBNET="10.10.20.0/24"
OUT_INTERFACE="eth0" 
# ===================================================

LOG_PREFIX="[VPN-FIX]"

echo "$LOG_PREFIX 开始配置..."
echo "$LOG_PREFIX 目标接口: $VPN_INTERFACE (IP: 10.10.20.1)"
echo "$LOG_PREFIX 外网接口: $OUT_INTERFACE"
echo "$LOG_PREFIX 目标网段: $VPN_SUBNET"

# 1. 检查 Root
if [ "$EUID" -ne 0 ]; then
  echo "$LOG_PREFIX 错误:请使用 root 运行。"
  exit 1
fi

# 2. 验证接口是否存在
if ! ip link show "$VPN_INTERFACE" > /dev/null 2>&1; then
    echo "$LOG_PREFIX 警告:接口 $VPN_INTERFACE 当前不存在或未启动。"
    echo "$LOG_PREFIX 脚本将继续配置规则,但请确保你的 VPN 服务启动后会产生此接口。"
fi

# 3. 开启内核转发
echo "$LOG_PREFIX 开启内核 IP 转发..."
if ! grep -q "net.ipv4.ip_forward=1" /etc/sysctl.conf; then
    echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
fi
sysctl -w net.ipv4.ip_forward=1 > /dev/null

# 4. 确保 Firewalld 运行
systemctl enable --now firewalld

# 5. 开启 Masquerade (NAT)
echo "$LOG_PREFIX 开启 IP 伪装..."
if ! firewall-cmd --query-masquerade --permanent; then
    firewall-cmd --permanent --add-masquerade
fi

# 6. 将 tun1 加入 trusted 区域
echo "$LOG_PREFIX 将 $VPN_INTERFACE 加入 trusted 区域..."
# 清理旧配置以防万一
firewall-cmd --permanent --zone=trusted --remove-interface="$VPN_INTERFACE" 2>/dev/null || true
firewall-cmd --permanent --zone=trusted --add-interface="$VPN_INTERFACE"

# 7. 重载生效
echo "$LOG_PREFIX 应用配置..."
firewall-cmd --reload

# 8. 验证
echo ""
echo "$LOG_PREFIX === 验证结果 ==="
if firewall-cmd --query-masquerade; then echo "[OK] Masquerade"; else echo "[FAIL] Masquerade"; fi
if firewall-cmd --zone=trusted --list-interfaces | grep -qw "$VPN_INTERFACE"; then 
    echo "[OK] $VPN_INTERFACE 在 trusted 区域"
else 
    echo "[FAIL] $VPN_INTERFACE 不在 trusted 区域"
fi
if [ "$(sysctl -n net.ipv4.ip_forward)" == "1" ]; then echo "[OK] IP Forwarding"; else echo "[FAIL] IP Forwarding"; fi

echo ""
echo "$LOG_PREFIX 完成!现在连接到 $VPN_SUBNET 的客户端应该可以通过 $OUT_INTERFACE 上网了。"
最后修改:2026 年 03 月 05 日
如果觉得我的文章对你有用,请随意赞赏