WireGuard 多节点集群的Shell 半自动化配置脚本

要将上述 WireGuard 配置脚本扩展为支持 多节点集群(即多个服务器和客户端节点的配置),我们需要做出一些修改:

  1. 支持多个 服务器 和 客户端 配置。
  2. 自动为每个节点生成独特的配置文件,并确保它们能够互相通信。
  3. 支持集群模式,配置多个 服务器端 和 客户端 节点之间的连接。

以下是基于原始脚本的扩展版本,能够生成多个服务器和客户端节点的 WireGuard 配置文件。

扩展的脚本:setup-wireguard-cluster.sh

#!/bin/bash

# 检查 WireGuard 是否已安装
check_wireguard() {
  if ! command -v wg &> /dev/null; then
    echo "WireGuard 未安装,正在安装 WireGuard..."
    if [ -f /etc/debian_version ]; then
      sudo apt update && sudo apt install -y wireguard
    elif [ -f /etc/redhat-release ]; then
      sudo yum install -y epel-release
      sudo yum install -y wireguard-tools
    else
      echo "不支持的操作系统"
      exit 1
    fi
  else
    echo "WireGuard 已安装"
  fi
}

# 生成每个服务器节点和客户端节点的配置
generate_cluster_config() {
  echo "请输入集群中服务器的数量: "
  read SERVER_COUNT

  echo "请输入每个服务器的端口 (默认51820): "
  read SERVER_PORT
  SERVER_PORT=${SERVER_PORT:-51820}

  echo "请输入客户端的数量: "
  read CLIENT_COUNT

  # 生成每个服务器和客户端的配置
  SERVER_CONFIG_DIR="/etc/wireguard/servers"
  CLIENT_CONFIG_DIR="/etc/wireguard/clients"
  mkdir -p $SERVER_CONFIG_DIR $CLIENT_CONFIG_DIR

  SERVER_PRIVATE_KEYS=()
  SERVER_PUBLIC_KEYS=()
  CLIENT_PRIVATE_KEYS=()
  CLIENT_PUBLIC_KEYS=()

  # 生成每个服务器节点的私钥和公钥
  for ((i=1; i<=$SERVER_COUNT; i++)); do
    SERVER_PRIVATE_KEY=$(wg genkey)
    SERVER_PUBLIC_KEY=$(echo $SERVER_PRIVATE_KEY | wg pubkey)
    SERVER_PRIVATE_KEYS+=("$SERVER_PRIVATE_KEY")
    SERVER_PUBLIC_KEYS+=("$SERVER_PUBLIC_KEY")
  done

  # 生成每个客户端的私钥和公钥
  for ((i=1; i<=$CLIENT_COUNT; i++)); do
    CLIENT_PRIVATE_KEY=$(wg genkey)
    CLIENT_PUBLIC_KEY=$(echo $CLIENT_PRIVATE_KEY | wg pubkey)
    CLIENT_PRIVATE_KEYS+=("$CLIENT_PRIVATE_KEY")
    CLIENT_PUBLIC_KEYS+=("$CLIENT_PUBLIC_KEY")
  done

  # 生成每个服务器的配置文件
  for ((i=1; i<=$SERVER_COUNT; i++)); do
    SERVER_CONFIG_FILE="$SERVER_CONFIG_DIR/wg${i}.conf"
    echo "[Interface]" > $SERVER_CONFIG_FILE
    echo "Address = 10.0.0.$((i+1))/24" >> $SERVER_CONFIG_FILE
    echo "PrivateKey = ${SERVER_PRIVATE_KEYS[$i-1]}" >> $SERVER_CONFIG_FILE
    echo "ListenPort = $SERVER_PORT" >> $SERVER_CONFIG_FILE

    # 添加客户端的配置到每个服务器
    for ((j=1; j<=$CLIENT_COUNT; j++)); do
      echo "[Peer]" >> $SERVER_CONFIG_FILE
      echo "PublicKey = ${CLIENT_PUBLIC_KEYS[$j-1]}" >> $SERVER_CONFIG_FILE
      echo "AllowedIPs = 10.0.0.$((j+1))/32" >> $SERVER_CONFIG_FILE
    done
  done

  # 生成每个客户端的配置文件
  for ((i=1; i<=$CLIENT_COUNT; i++)); do
    CLIENT_CONFIG_FILE="$CLIENT_CONFIG_DIR/client${i}.conf"
    echo "[Interface]" > $CLIENT_CONFIG_FILE
    echo "Address = 10.0.0.$((i+1))/32" >> $CLIENT_CONFIG_FILE
    echo "PrivateKey = ${CLIENT_PRIVATE_KEYS[$i-1]}" >> $CLIENT_CONFIG_FILE

    # 添加服务器的配置到每个客户端
    for ((j=1; j<=$SERVER_COUNT; j++)); do
      echo "[Peer]" >> $CLIENT_CONFIG_FILE
      echo "PublicKey = ${SERVER_PUBLIC_KEYS[$j-1]}" >> $CLIENT_CONFIG_FILE
      echo "Endpoint = 服务器${j}_IP:$SERVER_PORT" >> $CLIENT_CONFIG_FILE
      echo "AllowedIPs = 0.0.0.0/0" >> $CLIENT_CONFIG_FILE
    done
  done

  echo "多节点集群配置文件已生成:"
  echo "服务器配置文件目录: $SERVER_CONFIG_DIR"
  echo "客户端配置文件目录: $CLIENT_CONFIG_DIR"
}

# 启动 WireGuard 服务
start_wireguard() {
  echo "正在启动 WireGuard 服务..."
  for ((i=1; i<=$SERVER_COUNT; i++)); do
    sudo systemctl start wg-quick@wg$i
    sudo systemctl enable wg-quick@wg$i
  done
  echo "WireGuard 服务已启动"
}

# 主程序
main() {
  check_wireguard
  generate_cluster_config
  start_wireguard
}

main

主要更新点:

  1. 多服务器支持:脚本允许配置多个服务器节点,并为每个服务器生成独立的配置文件。
  2. 多客户端支持:脚本允许配置多个客户端,并为每个客户端生成独立的配置文件。
  3. 地址分配:每个节点(服务器和客户端)分配一个唯一的 IP 地址(根据服务器的数量和客户端数量动态计算)。
  4. 集群配置:服务器和客户端的配置文件都会包含集群中的所有节点的信息,确保它们能彼此通信。

使用方法:

  1. 保存脚本为 setup-wireguard-cluster.sh,并给它执行权限:

    chmod +x setup-wireguard-cluster.sh

     

  2. 执行脚本:

    sudo ./setup-wireguard-cluster.sh

     

  3. 按照提示输入服务器和客户端的数量等信息。

配置文件示例:

假设有两个服务器和两个客户端,生成的配置文件将如下所示:

服务器 1 (wg1.conf):

[Interface]
Address = 10.0.0.2/24
PrivateKey = SERVER1_PRIVATE_KEY
ListenPort = 51820

[Peer]
PublicKey = CLIENT1_PUBLIC_KEY
AllowedIPs = 10.0.0.3/32

[Peer]
PublicKey = CLIENT2_PUBLIC_KEY
AllowedIPs = 10.0.0.4/32

 

客户端 1 (client1.conf):

[Interface]
Address = 10.0.0.3/32
PrivateKey = CLIENT1_PRIVATE_KEY

[Peer]
PublicKey = SERVER1_PUBLIC_KEY
Endpoint = 服务器1_IP:51820
AllowedIPs = 0.0.0.0/0

 

客户端 2 (client2.conf):

[Interface]
Address = 10.0.0.4/32
PrivateKey = CLIENT2_PRIVATE_KEY

[Peer]
PublicKey = SERVER1_PUBLIC_KEY
Endpoint = 服务器1_IP:51820
AllowedIPs = 0.0.0.0/0

 

总结:

这个脚本适用于多节点 WireGuard 集群配置,可以根据需要扩展服务器和客户端数量,自动生成相应的配置文件,并启动 WireGuard 服务,帮助用户快速配置多节点的 WireGuard VPN 集群。

posted @ 2024-11-11 09:28  诺岚生  阅读(325)  评论(0)    收藏  举报