如何用脚本批量添加VPN用户?

wen 实用脚本 2

本文目录导读:

如何用脚本批量添加VPN用户?

  1. 重要安全提示
  2. 基于 OpenVPN(使用 easy-rsa 或管理命令行)
  3. 基于 WireGuard(使用 wg set 或自动生成配置文件)
  4. 基于 SoftEther(使用 vpncmd 脚本)
  5. 通用方法:通过SSH循环执行
  6. 总结选择

批量添加VPN用户通常需要通过SSH远程执行命令或读取用户列表文件来完成,具体方法取决于你使用的VPN服务软件(如OpenVPN、WireGuard、StrongSwan、SoftEther等),以下是一些常见场景的脚本示例(假设你已经拥有管理员权限和相应的VPN服务配置文件)。

重要安全提示

  • 使用强密码:脚本中应随机生成或读取预设的强密码。
  • 访问控制:确保脚本文件权限为600(仅管理员可读写),避免密码泄露。
  • 备份配置:批量操作前务必备份现有的VPN配置文件和用户数据库。

基于 OpenVPN(使用 easy-rsa 或管理命令行)

OpenVPN通常使用证书认证,用户添加意味着生成客户端证书和密钥。

示例脚本 (bash):

#!/bin/bash
# 配置环境
EASYRSA_DIR="/etc/openvpn/easy-rsa"
CLIENT_DIR="/etc/openvpn/clients"
USER_LIST="users.txt"  # 每行一个用户名
# 导入环境变量
source $EASYRSA_DIR/vars
# 读取用户列表
while IFS= read -r username; do
    # 跳过空行
    [ -z "$username" ] && continue
    # 生成证书(不包含密码保护的密钥方便自动部署,生产环境建议使用 --days 和密码)
    cd $EASYRSA_DIR
    ./easyrsa --batch --req-cn="$username" gen-req "$username" nopass
    ./easyrsa --batch --req-cn="$username" sign-req client "$username" nopass
    # 创建客户端配置文件(假设模板 client-common.txt 已存在)
    $EASYRSA_DIR/easyrsa build-client-full "$username" nopass
    # 生成 .ovpn 文件
    mkdir -p $CLIENT_DIR/$username
    cp /etc/openvpn/client-common.txt $CLIENT_DIR/$username/$username.ovpn
    cat $EASYRSA_DIR/pki/issued/${username}.crt >> $CLIENT_DIR/$username/$username.ovpn
    cat $EASYRSA_DIR/pki/private/${username}.key >> $CLIENT_DIR/$username/$username.ovpn
    echo "" >> $CLIENT_DIR/$username/$username.ovpn
    echo "用户 $username 已添加,配置文件位于 $CLIENT_DIR/$username/$username.ovpn"
done < "$USER_LIST"

用户列表文件 users.txt 示例:

user1
user2
user3

基于 WireGuard(使用 wg set 或自动生成配置文件)

WireGuard需要为每个用户生成密钥对和独立的配置文件。

示例脚本 (bash):

#!/bin/bash
WG_CONF_DIR="/etc/wireguard"
SERVER_PUB_KEY=$(cat $WG_CONF_DIR/server_public.key)
USERS_FILE="users.txt"
OUTPUT_DIR="/path/to/client_configs"
# 读取用户列表
while IFS= read -r username; do
    [ -z "$username" ] && continue
    # 生成密钥对
    wg genkey | tee $WG_CONF_DIR/${username}_private.key | wg pubkey > $WG_CONF_DIR/${username}_public.key
    # 分配IP(需自行管理IP池,此处示例为10.0.0.x)
    IP_NUMBER=$(( $(wc -l < $USERS_FILE) + 10 ))  # 简单顺序分配
    CLIENT_IP="10.0.0.$IP_NUMBER"
    SERVER_ENDPOINT="你的服务器公网IP:51820"
    # 生成客户端配置
    cat > $OUTPUT_DIR/$username.conf <<EOF
[Interface]
PrivateKey = $(cat $WG_CONF_DIR/${username}_private.key)
Address = $CLIENT_IP/24
DNS = 8.8.8.8
[Peer]
PublicKey = $SERVER_PUB_KEY
Endpoint = $SERVER_ENDPOINT
AllowedIPs = 0.0.0.0/0
EOF
    # 添加用户到服务器配置
    echo -e "\n# $username\n[Peer]\nPublicKey = $(cat $WG_CONF_DIR/${username}_public.key)\nAllowedIPs = $CLIENT_IP/32" >> $WG_CONF_DIR/wg0.conf
    echo "用户 $username 已添加,配置文件:$OUTPUT_DIR/$username.conf"
done < "$USERS_FILE"
# 重载WireGuard
systemctl restart wg-quick@wg0

注意:需要预先创建好服务器公钥文件 server_public.key,并管理好IP分配自动化。


基于 SoftEther(使用 vpncmd 脚本)

SoftEther支持通过 vpncmd 命令行批量添加用户。

示例脚本 (bash):

#!/bin/bash
HUB_NAME="VPN"
USER_FILE="users.txt"
PASSWORD_FILE="passwords.txt"  # 若为简单方式,可使用同一文件
# 假设目录包含 vpncmd
VPNADMIN="/usr/local/vpnserver/vpncmd"
# 循环添加用户
while IFS= read -r user; do
    [ -z "$user" ] && continue
    # 随机生成8位密码(演示用,生产需更复杂)
    PASS=$(openssl rand -base64 6 | tr -d '=' | head -c 8)
    echo "添加用户: $user, 密码: $PASS"
    $VPNADMIN localhost /SERVER /CMD Hub "$HUB_NAME" UserCreate "$user" /GROUP:none /REALNAME:none /NOTE:"Auto created"
    $VPNADMIN localhost /SERVER /CMD Hub "$HUB_NAME" UserPasswordSet "$user" /PASSWORD:"$PASS"
    # 记录密码到日志
    echo "$user:$PASS" >> created_users.log
done < "$USER_FILE"
echo "用户添加完成,密码已记录到 created_users.log (请立即安全删除)"

通用方法:通过SSH循环执行

如果VPN服务运行在远程服务器,你可以使用本地脚本 + SSH密钥认证批量操作。

示例脚本 (bash):

#!/bin/bash
SERVER="your-vpn-server-ip"
SSH_KEY="/path/to/private_key"
USER_LIST="remote_users.txt"
# 注意:需要将VPN相关脚本复制到远程服务器
while IFS= read -r user; do
    ssh -i $SSH_KEY root@$SERVER "cd /opt/vpn-add-script && ./add_vpn_user.sh $user"
    # 传入单个用户给远程脚本处理
done < "$USER_LIST"

总结选择

  • 如果使用证书认证(如OpenVPN),推荐使用 easy-rsaopenssl 脚本。
  • 如果使用密钥对认证(如WireGuard),直接生成密钥并追加配置文件。
  • 如果使用用户名/密码认证(如SoftEther/PPTP/L2TP),直接调用管理命令。

建议先手动测试一次单个用户的创建流程,确保无误后再编写批量脚本,如果需要考虑高并发或错误处理(如重试、失败日志),可以在脚本中加入 trap 和重定向错误输出。

抱歉,评论功能暂时关闭!