开源VPN-WireGuard

WireGuard ®是一种极其简单但快速的现代 VPN,它使用最先进的加密技术。它旨在比 IPsec更快、更简单、更精简和更有用,同时避免令人头疼的问题。它旨在比 OpenVPN 具有更高的性能。

官网地址:https://www.wireguard.com/
docker源码:https://github.com/linuxserver/docker-wireguard

介绍

WireGuard是一种开源的VPN(虚拟专用网络)协议,它旨在提供更快速、更安全和更简单的VPN连接。WireGuard利用现代加密协议,如ChaCha20和Curve25519,以保护数据传输的隐私和安全性。与其他VPN协议相比,WireGuard具有更少的代码和更少的复杂性,这使得它易于部署和使用。WireGuard已经被广泛使用并受到了积极的评价。

搭建WireGuard服务器

搭建WireGuard服务器的步骤如下:

  1. 选择服务器操作系统:WireGuard可以在各种操作系统上运行,包括Linux、Windows、macOS、FreeBSD等。您可以选择自己熟悉的操作系统,但是在本文中,我们将使用Linux服务器作为示例。

  2. 安装WireGuard:您可以按照WireGuard官方文档中提供的安装指南,在您选择的操作系统上安装WireGuard。

  3. 生成公钥和私钥:在您的服务器上生成一个私钥和一个公钥,您可以使用wg命令来完成此操作。例如,输入以下命令生成一个新的私钥和公钥:

    wg genkey | tee privatekey | wg pubkey > publickey

    这将生成一个名为privatekey的文件,其中包含私钥,以及一个名为publickey的文件,其中包含公钥。

  4. 配置WireGuard:您需要创建一个配置文件来配置WireGuard,以指定VPN客户端将使用的IP地址、端口和密钥等信息。您可以使用wg-quick工具来创建并启动WireGuard配置。例如,您可以创建一个名为wg0.conf的文件,并添加以下内容:

    [Interface]
    PrivateKey = <your server private key>
    Address = 10.0.0.1/24
    ListenPort = 51820
    
    [Peer]
    PublicKey = <your client public key>
    AllowedIPs = 10.0.0.2/32

    其中,<your server private key>是您在步骤3中生成的私钥,10.0.0.1/24是服务器的IP地址,51820是服务器监听的端口号,<your client public key>是客户端的公钥,10.0.0.2/32是客户端的IP地址。

  5. 启动WireGuard:您可以使用以下命令来启动WireGuard:

    sudo wg-quick up wg0

    这将启动WireGuard服务并加载您在配置文件中指定的配置。您可以使用以下命令来验证是否成功启动:

    sudo wg show

    如果一切正常,您应该能够看到WireGuard服务器的配置信息。

  6. 客户端连接:现在您可以在客户端上安装WireGuard,并将客户端公钥添加到服务器的配置文件中。客户端应该使用您在配置文件中指定的IP地址和端口号连接到服务器。

使用Docker搭建服务器环境

如果您想使用Docker来搭建WireGuard服务器环境,可以按照以下步骤操作:

  1. 安装Docker和Docker Compose:您需要先在您的服务器上安装Docker和Docker Compose。您可以按照Docker官方文档提供的安装指南在您选择的操作系统上安装。

  2. 创建Docker Compose文件:您可以创建一个名为docker-compose.yml的文件,并添加以下内容:

    version: '3'
    services:
      wireguard:
        image: linuxserver/wireguard
        container_name: wireguard
        cap_add:
          - NET_ADMIN
        environment:
          - PUID=<your user id>
          - PGID=<your group id>
          - TZ=<your timezone>
        volumes:
          - /path/to/config:/config
        ports:
          - 51820:51820/udp
        restart: always

    其中,<your user id>是您的用户ID,<your group id>是您的用户组ID,<your timezone>是您的时区,/path/to/config是您的配置文件目录,51820是WireGuard使用的端口号。

  3. 创建配置文件:在您的配置文件目录中创建一个名为wg0.conf的文件,并添加以下内容:

    [Interface]
    PrivateKey = <your server private key>
    Address = 10.0.0.1/24
    ListenPort = 51820
    
    [Peer]
    PublicKey = <your client public key>
    AllowedIPs = 10.0.0.2/32

    其中,<your server private key>是您在步骤3中生成的私钥,10.0.0.1/24是服务器的IP地址,51820是服务器监听的端口号,<your client public key>是客户端的公钥,10.0.0.2/32是客户端的IP地址。

  4. 启动容器:您可以使用以下命令启动容器:

    docker-compose up -d

    这将启动WireGuard容器并加载您在配置文件中指定的配置。

  5. 客户端连接:现在您可以在客户端上安装WireGuard,并将客户端公钥添加到服务器的配置文件中。客户端应该使用您在配置文件中指定的IP地址和端口号连接到服务器。

配置Windows客户端

要在Windows上配置WireGuard客户端以连接到您的Docker搭建的WireGuard服务器,您可以按照以下步骤进行操作:

  1. 在Windows上安装WireGuard客户端:您可以从WireGuard官方网站下载和安装Windows版的WireGuard客户端。

  2. 生成客户端密钥对:您需要在客户端上生成一个密钥对,以便连接到服务器。您可以使用WireGuard客户端生成一个新的密钥对。

  3. 向服务器添加客户端公钥:将客户端的公钥添加到服务器的配置文件中,这样服务器就能够识别并允许客户端连接。您可以将客户端的公钥复制到服务器配置文件的[Peer]部分中,并设置允许的IP地址(例如,AllowedIPs = 10.0.0.2/32)。

  4. 配置WireGuard客户端:打开WireGuard客户端,并点击“添加配置文件”。在新窗口中,选择“从文件加载”并导入您在步骤3中生成的客户端私钥和服务器配置文件。然后,点击“添加隧道”并连接到服务器。

  5. 测试连接:完成以上步骤后,您应该能够连接到服务器。您可以测试连接是否成功,例如,使用ping命令测试是否能够访问服务器上的资源。

以上是在Windows上配置WireGuard客户端以连接到Docker搭建的WireGuard服务器的基本步骤。

配置Linux客户端

要在Linux上配置WireGuard客户端以连接到您的Docker搭建的WireGuard服务器,您可以按照以下步骤进行操作:

  1. 在Linux上安装WireGuard客户端:您可以在Linux上安装WireGuard客户端。具体的安装方法因Linux发行版而异,您可以在WireGuard官方文档中找到相关说明。

  2. 生成客户端密钥对:您需要在客户端上生成一个密钥对,以便连接到服务器。您可以使用WireGuard客户端生成一个新的密钥对。

  3. 向服务器添加客户端公钥:将客户端的公钥添加到服务器的配置文件中,这样服务器就能够识别并允许客户端连接。您可以将客户端的公钥复制到服务器配置文件的[Peer]部分中,并设置允许的IP地址(例如,AllowedIPs = 10.0.0.2/32)。

  4. 配置WireGuard客户端:您可以在Linux上通过命令行配置WireGuard客户端。您需要创建一个名为wg0.conf的配置文件,并添加以下内容:

    [Interface]
    PrivateKey = <your client private key>
    Address = 10.0.0.2/24
    DNS = 1.1.1.1
    
    [Peer]
    PublicKey = <your server public key>
    Endpoint = <your server IP address>:51820
    AllowedIPs = 0.0.0.0/0

    其中,<your client private key>是您在步骤2中生成的私钥,10.0.0.2/24是客户端的IP地址,1.1.1.1是您希望使用的DNS服务器,<your server public key>是服务器的公钥,<your server IP address>是服务器的IP地址,51820是服务器监听的端口号。

  5. 启动WireGuard客户端:使用以下命令启动WireGuard客户端:

    sudo wg-quick up wg0

    这将启动WireGuard客户端并加载您在配置文件中指定的配置。

  6. 测试连接:完成以上步骤后,您应该能够连接到服务器。您可以测试连接是否成功,例如,使用ping命令测试是否能够访问服务器上的资源。

以上是在Linux上配置WireGuard客户端以连接到Docker搭建的WireGuard服务器的基本步骤。

WireGuard可用配置项

WireGuard是一种快速且现代的VPN协议,它提供了各种配置选项来优化连接和安全性。以下是一些常用的WireGuard配置选项:

  1. [Interface]:指定本地网络接口的设置,包括私钥、地址、DNS服务器和MTU等。
  • PrivateKey:本地网络接口的私钥。
  • Address:本地网络接口的IP地址,可以是单个地址或CIDR块。
  • DNS:指定DNS服务器的IP地址。
  • MTU:设置网络接口的最大传输单元。
  1. [Peer]:指定连接到的对等端的设置,包括公钥、IP地址、端点和允许IP地址等。
  • PublicKey:对等端的公钥。
  • Endpoint:对等端的IP地址和端口号,用于建立连接。
  • AllowedIPs:指定可以通过VPN访问的IP地址范围,可以是单个地址或CIDR块。
  1. [Interface]或[Peer]的PreUp、PostUp、PreDown和PostDown:指定在启动或停止WireGuard接口时执行的脚本。
  • PreUp:在启动WireGuard接口之前执行的脚本。
  • PostUp:在启动WireGuard接口之后执行的脚本。
  • PreDown:在停止WireGuard接口之前执行的脚本。
  • PostDown:在停止WireGuard接口之后执行的脚本。
  1. PersistentKeepalive:指定在网络空闲时发送keepalive消息以避免连接中断。
  • PersistentKeepalive:设置keepalive消息发送的时间间隔(以秒为单位)。
  1. ListenPort:指定WireGuard服务监听的端口号。
  • ListenPort:设置WireGuard服务监听的端口号。
  1. PeerDNS:指定是否将DNS查询路由到远程VPN服务器。
  • PeerDNS:设置是否将DNS查询路由到远程VPN服务器。

以上是一些常用的WireGuard配置选项。

示例使用

以下是一个基本的WireGuard配置文件示例,包括[Interface]和[Peer]配置段:

[Interface]
PrivateKey = [Private Key]
Address = 10.0.0.1/24
ListenPort = 51820
DNS = 8.8.8.8

[Peer]
PublicKey = [Public Key]
AllowedIPs = 10.0.0.2/32
Endpoint = [Remote Server IP]:51820
PersistentKeepalive = 25

请将上述配置文件保存为名为wg0.conf的文件,并将其中的私钥、公钥和远程服务器IP地址替换为您自己的值。

此示例配置文件包含一个[Interface]段和一个[Peer]段。[Interface]定义了本地WireGuard接口的设置,包括私钥、IP地址、监听端口和DNS服务器。[Peer]定义了要连接的远程对等端的设置,包括公钥、允许IP地址、端点和持久keepalive设置。

要在Linux系统上使用此配置文件,可以执行以下命令启动WireGuard接口:

sudo wg-quick up wg0

要停止接口,请使用以下命令:

sudo wg-quick down wg0

请注意,这只是一个基本示例,您可以根据自己的需求调整配置文件中的各个选项。

注:如需开启自启服务可使用如下指令:

sudo systemctl enable wg-quick@wg0 --now

快捷方式

服务端:

#!/bin/bash
#!/bin/bash

# 检查操作系统
OS=$(uname -s)

# 检查WireGuard是否已安装
if [ "$OS" = "Linux" ]; then
    if ! command -v wg >/dev/null; then
        echo "正在安装WireGuard..."
        # 根据不同的Linux发行版使用相应的包管理器进行安装
        if command -v apt-get >/dev/null; then
            sudo apt-get update
            sudo apt-get install -y wireguard resolvconf
            sudo modprobe wireguard
        elif command -v dnf >/dev/null; then
            sudo dnf install -y wireguard-tools
        elif command -v yum >/dev/null; then
            sudo yum install -y elrepo-release epel-release
            sudo yum install -y kmod-wireguard wireguard-tools
            sudo modprobe wireguard
        else
            echo "无法自动安装WireGuard,请手动安装。"
            exit 1
        fi
    fi
elif [ "$OS" = "Darwin" ]; then
    if ! command -v wg >/dev/null; then
        echo "正在安装WireGuard..."
        brew install wireguard-tools
    fi
else
    echo "不支持的操作系统。"
    exit 1
fi

# 启用IP转发
echo "启用IP转发..."

# 检查是否已经设置IP转发
ip_forward=$(cat /proc/sys/net/ipv4/ip_forward)
if [ "$ip_forward" -eq 1 ]; then
  echo "IP转发已经启用,无需进行设置。"
fi

echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

echo "IP转发已成功启用。"

echo "WireGuard已安装,清除原有配置并重新生成新配置..."

# 停止WireGuard服务
sudo wg-quick down wg0

# 移除WireGuard配置文件
sudo rm /etc/wireguard/wg0.conf

# 清除WireGuard相关的iptables规则
# sudo iptables -D FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# sudo iptables -D FORWARD -i wg0 -o eth0 -j ACCEPT
# sudo iptables -D FORWARD -i eth0 -o wg0 -j ACCEPT
# sudo iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

# 重新生成WireGuard配置文件
echo "请输入服务器的IP地址:"
read -r server_ip

echo "请输入服务器的监听端口:"
read -r server_port

sudo mkdir -p /etc/wireguard
sudo chmod 700 /etc/wireguard

wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey
server_privatekey=$(sudo cat /etc/wireguard/privatekey)
server_publickey=$(sudo cat /etc/wireguard/publickey)

wg_config="/etc/wireguard/wg0.conf"

echo "[Interface]" | sudo tee "$wg_config"
echo "Address = 10.13.13.1/24" | sudo tee -a "$wg_config"
echo "ListenPort = $server_port" | sudo tee -a "$wg_config"
echo "PrivateKey = $server_privatekey" | sudo tee -a "$wg_config"
echo "" | sudo tee -a "$wg_config"

echo "WireGuard服务端配置文件已创建:$wg_config"

# 重新生成WireGuard配置文件
echo "请输入生成的客户端数量:"
read -r client_count

for ((i=1; i<=client_count; i++)); do
    wg genkey | sudo tee /etc/wireguard/privatekey$i | wg pubkey | sudo tee /etc/wireguard/publickey$i
    client_privatekey=$(sudo cat /etc/wireguard/privatekey$i)

    echo "[Peer]" | sudo tee -a "$wg_config"
    echo "PublicKey = $(sudo cat /etc/wireguard/publickey$i)" | sudo tee -a "$wg_config"
    echo "AllowedIPs = 10.13.13.$((i+1))/32" | sudo tee -a "$wg_config"

    client_config="/root/wireguard-clients/client$i.conf"
    sudo mkdir -p "$(dirname "$client_config")"
    sudo chmod 700 "$(dirname "$client_config")"

    echo "[Interface]" | sudo tee "$client_config"
    echo "PrivateKey = $client_privatekey" | sudo tee -a "$client_config"
    echo "Address = 10.13.13.$((i+1))/24" | sudo tee -a "$client_config"
    echo "DNS = 10.13.13.1" | sudo tee -a "$client_config"
    echo "" | sudo tee -a "$client_config"
    echo "[Peer]" | sudo tee -a "$client_config"
    echo "PublicKey = $server_publickey" | sudo tee -a "$client_config"
    echo "Endpoint = $server_ip:$server_port" | sudo tee -a "$client_config"
    echo "AllowedIPs = 10.13.13.0/24" | sudo tee -a "$client_config"
    echo "PersistentKeepalive = 25" | sudo tee -a "$client_config"
    echo "" | sudo tee -a "$client_config"

    echo "客户端$i的配置文件已创建:$client_config"
done

# 启动WireGuard服务
sudo systemctl enable --now wg-quick@wg0

echo "WireGuard已配置完毕"

exit 0

客户端:

#!/bin/bash

# 检查操作系统
OS=$(uname -s)

# 检查WireGuard是否已安装
if [ "$OS" = "Linux" ]; then
    if ! command -v wg >/dev/null; then
        echo "正在安装WireGuard..."
        # 根据不同的Linux发行版使用相应的包管理器进行安装
        if command -v apt-get >/dev/null; then
            sudo apt-get update
            sudo apt-get install -y wireguard resolvconf
        elif command -v yum >/dev/null; then
            sudo yum install -y wireguard-tools resolvconf
        elif command -v pacman >/dev/null; then
            sudo pacman -S --noconfirm wireguard-tools openresolv
        elif command -v dnf >/dev/null; then
            sudo dnf install -y wireguard-tools resolvconf
        else
            echo "无法自动安装WireGuard,请手动安装。"
            exit 1
        fi
    fi
elif [ "$OS" = "Darwin" ]; then
    if ! command -v wg >/dev/null; then
        echo "正在安装WireGuard..."
        brew install wireguard-tools
    fi
else
    echo "不支持的操作系统。"
    exit 1
fi

# 检查WireGuard配置文件是否已存在
if [ -f /etc/wireguard/wg0.conf ]; then
    echo "已存在WireGuard配置文件。"
    read -p "是否替换现有配置?(y/n): " replace_config
    if [ "$replace_config" != "y" ]; then
        echo "使用现有配置文件。"
        exit 0
    fi
fi

# 用户编辑WireGuard配置文件
echo "请在vi或vim中编辑WireGuard配置文件。"
read -p "按Enter键继续..." enter_key
if command -v vi >/dev/null; then
    sudo vi /etc/wireguard/wg0.conf
elif command -v vim >/dev/null; then
    sudo vim /etc/wireguard/wg0.conf
else
    echo "未找到合适的编辑工具,请手动编辑 /etc/wireguard/wg0.conf 并保存。"
fi

# 启动WireGuard服务
sudo systemctl start wg-quick@wg0

# 设置开机自启
sudo systemctl enable wg-quick@wg0

echo "WireGuard客户端已成功配置并连接。"
exit 0

开源VPN-WireGuard
https://blog.cikaros.top/doc/a1064baf.html
作者
Cikaros
发布于
2023年3月10日
许可协议