#!/bin/bash

# 检查root权限
if [ "$(id -u)" -ne 0 ]; then
    echo "必须使用root用户运行!" >&2
    exit 1
fi

# 输入参数
read -p "输入VPN服务器IP/域名: " SERVER_IP
read -p "输入VPN用户名: " USERNAME
read -s -p "输入VPN密码: " PASSWORD
echo

# 安装依赖(自动处理EPEL)
echo "正在安装依赖包..."
if ! yum list installed epel-release &>/dev/null; then
    yum install -y epel-release || { echo "安装EPEL仓库失败!"; exit 1; }
fi
yum install -y xl2tpd libreswan ppp || { echo "安装软件包失败!"; exit 1; }

# 配置xl2tpd
echo "配置xl2tpd..."
cat > /etc/xl2tpd/xl2tpd.conf <<EOF
[global]
listen-addr = 0.0.0.0
force userspace = yes
ipsec saref = no

[lac vpn]
lns = $SERVER_IP
ppp debug = yes
pppoptfile = /etc/ppp/options.l2tpd.client
redial = yes
redial timeout = 3
EOF

# 配置PPP选项
echo "配置PPP选项..."
cat > /etc/ppp/options.l2tpd.client <<EOF
noauth
debug
name $USERNAME
password $PASSWORD
mtu 1280
mru 1280
defaultroute
usepeerdns
connect-delay 5000
EOF

# 配置CHAP认证
echo "配置CHAP认证..."
cat > /etc/ppp/chap-secrets <<EOF
"$USERNAME" * "$PASSWORD" *
EOF
chmod 600 /etc/ppp/chap-secrets

# 禁用IPSec(如果不需要)
systemctl stop ipsec 2>/dev/null
systemctl disable ipsec 2>/dev/null

# 启动服务
echo "启动服务..."
systemctl restart xl2tpd
systemctl enable xl2tpd

# 触发连接
echo "启动VPN连接..."
echo "c vpn" > /var/run/xl2tpd/l2tp-control

# 验证结果
echo -n "等待连接建立..."
for i in {1..10}; do
    if ip a show ppp0 &>/dev/null; then
        echo -e "\nVPN连接成功!"
        echo "PPP接口信息:"
        ip a show ppp0
        echo "测试网络连通性:"
        ping -I ppp0 -c 3 8.8.8.8
        exit 0
    fi
    sleep 2
    echo -n "."
done

# 失败处理
echo -e "\nVPN连接失败!请检查:"
echo "1. 日志:journalctl -u xl2tpd -n 20"
echo "2. 服务器端口:nc -vzu $SERVER_IP 1701"
echo "3. 用户名密码:cat /etc/ppp/chap-secrets"
exit 1
作者:严锋  创建时间:2025-04-06 11:45
最后编辑:严锋  更新时间:2025-05-09 15:48