使用 WireGuard 配置虚拟专用网络

Configuring a Virtual Private Network with WireGuard

Posted by alovn on April 7, 2025

一、WireGuard 简介

在网络技术飞速发展的今天,虚拟专用网络(VPN)成为许多人保障网络安全、突破网络限制的重要工具。WireGuard 作为一种新兴的 VPN 技术,凭借其高效、轻量、安全等特点,逐渐受到广泛关注。WireGuard 是一款基于 UDP 协议的开源 VPN 工具,采用了现代密码学技术,如 Curve25519 椭圆曲线算法、ChaCha20 对称加密算法和 Poly1305 消息认证码算法等,提供了强大的安全性和性能表现。它的代码简洁,易于理解和维护,并且在多种操作系统上都能稳定运行。本文将介绍 WireGuard 的使用方式,帮助你快速上手。

现假设客户端IP为192.168.0.101,需要连接的服务器的内网IP为 10.0.0.103。WireGuard通过在服务器、客户端上创建的虚拟网络接口(如wg0)并分配IP地址进行通信。 这个虚拟接口,是专门用于在 WireGuard 网络内部进行通信的,我们需要为这个虚拟网络接口指定一个网段,比如 10.0.10.0/16, 这样可以要确保所选择的 IP 地址范围不会和服务器所在的物理网络或其他网络的 IP 地址范围冲突,合理规划子网,为不同的客户端分配不同的 IP 地址,这样有助于管理和维护。

二、安装 WireGuard

WireGuard 软件并不区分服务器端和客户端软件,WireGuard 软件在不同配置下既可以充当服务器端,也可以充当客户端。

Linux 系统:以 Ubuntu 为例,打开终端,执行以下命令安装 WireGuard:

sudo apt update sudo apt install wireguard

macOS 系统:可以通过 Mac App Store 搜索 WireGuard 进行安装,或者使用 Homebrew 命令安装:

brew install wireguard-tools

更多客户端可以访问官网 https://www.wireguard.com/install/

WireGuard 客户端和服务器通过交换公钥来建立安全通道加密技术,通过WireGuard可以快速创建简单且安全的 VPN 网络。

三、生成密钥对

打开终端(对于 Linux 和 macOS 系统),或者在 Windows 上打开 WireGuard 安装目录下的命令行工具。 创建一个可以存储 WireGuard 密钥对的目录,例如:

mkdir ~/.wireguard cd ~/.wireguard umask 077

在创建的目录中,执行以下命令生成 WireGuard 加密公私钥对。并将其保存到文件:

wg genkeytee privatekeywg pubkey > publickey

查看生成的公私钥

cat ~/.wireguard/privatekey cat ~/.wireguard/publickey

客户端、服务器端需要各生成自己的公私钥对。私钥需要各端自己保留,公钥给对端配置。

四、配置服务器端

在服务器上创建编辑 /etc/wireguard/wg0.conf 文件,内容如下:

[Interface] Address = 10.0.10.1/24 # 服务器在 WireGuard 网络中的 IP 地址和子网掩码 ListenPort = 51820 # 监听的UDP端口 PrivateKey = 服务器私钥 # 替换为服务器端实际生成的私钥 PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer] PublicKey = 客户端公钥 # 替换为客户端的公钥 AllowedIPs = 10.0.0.0/16 # 客户端在 WireGuard 网络中的 IP 地址

编辑 /etc/sysctl.conf 文件, 启用 IP 转发:

net.ipv4.ip_forward = 1 net.ipv6.conf.all.forwarding = 1

运行sysctl命令重新读取 /etc/sysctl.conf文件, 使更改生效。

sudo sysctl -p

启动 WireGuard 服务:

sudo wg-quick up wg0

如果启动后重新修改了 /etc/wireguard/wg0.conf 配置,需要执行:

sudo wg-quick down wg0 sudo wg-quick up wg0

查看服务器中WireGuard隧道的状态:

sudo wg

PostUp

PostUp 配置项后面跟着的命令会在 WireGuard 接口成功启动之后立即执行。借助这个配置项,你能够执行一些额外的操作,像设置防火墙规则、路由规则或者执行自定义脚本等

iptables -A FORWARD -i wg0 -j ACCEPT

该命令的作用是在 FORWARD 链的末尾添加一条规则,该规则规定:允许所有从 wg0 网络接口进入系统的数据包允许通过防火墙。

  • -A:是 –append 的缩写,表示将规则添加到指定链的末尾。这里指定的链是 FORWARD。
  • FORWARD:是 iptables 中的一个内置链,用于处理那些既不是本地产生也不是发往本地的数据包,也就是需要转发的数据包。
  • -i:是 –in-interface 的缩写,用于指定数据包进入的网络接口。
  • wg0:是 WireGuard 虚拟网络接口的名称,通常在配置 WireGuard 时会创建这个接口。
  • -j:是 –jump 的缩写,用于指定当数据包匹配规则时要执行的动作。
  • ACCEPT:表示接受(允许)匹配规则的数据包通过。

    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

该命令允许进入的数据包被转发到 eth0 网络接口。

  • -t:即 –table 的缩写,用于指定要操作的 iptables 表。nat 是网络地址转换表,用于处理网络地址转换相关的规则。
  • nat:是 iptables 中的一个表,主要用于修改数据包的源地址或目的地址。
  • -D:同样表示从指定链中删除一条规则,这里指定的链是 POSTROUTING。
  • POSTROUTING:是 nat 表中的一个链,用于在数据包即将离开系统时对其进行处理。
  • -o:即 –out-interface 的缩写,用于指定数据包离开的网络接口。
  • eth0:通常是系统的物理以太网接口,用于连接到外部网络。
  • -j:指定匹配规则时要执行的动作。
  • MASQUERADE:是一种特殊的网络地址转换方式,它会动态地将数据包的源 IP 地址替换为系统出口网络接口(这里是 eth0)的 IP 地址。

这两条命令实现客户端通过 WireGuard 服务器访问外部网络的功能, 实现了类似 VPN 服务器的功能。否则只能连服务器上的内部IP,不能连接到互联网。注意这里需要将 eth0 修改为自己服务器上网口名称。如果不需要访问外部网络也可以不设置。

PostDown

PostDown 当你不再使用 WireGuard 服务时,可执行此命令来清理相关的防火墙规则,避免规则残留影响系统网络安全和性能。配置项后面跟着的命令会在 WireGuard 接口关闭之后立即执行。其用途是撤销在 PostUp 阶段所做的配置更改,保证系统在接口关闭后恢复到初始状态。

iptables -D FORWARD -i wg0 -j ACCEPT

该命令会从 FORWARD 链中删除允许从 wg0 接口进入的数据包进行转发的规则。也就是说,删除该规则后,通过 WireGuard 隧道进入的流量将不再被允许转发到其他网络接口。

iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

该命令会从 nat 表的 POSTROUTING 链中删除对从 eth0 接口出去的数据包进行地址伪装的规则。删除后,WireGuard 客户端将无法通过服务器的公网 IP 访问外部网络,因为不再对客户端流量进行地址伪装。

客户端配置

在客户端设备上创建一个 WireGuard 配置文件,我这里使用的Mac的WireGuard客户端,添加以下配置后点击 Activate 进行连接:

[Interface] PrivateKey = 客户端私钥 # 客户端的私钥 Address = 10.0.10.100/16 # 客户端使用虚拟网口IP,这里为客户端分配一个虚拟IP 10.0.10.100 DNS = 1.1.1.1

[Peer] PublicKey = 服务器公钥 # 服务器的公钥 AllowedIPs = 0.0.0.0/0 Endpoint = 公网IP:51820 # 服务器的公网 IP 地址和端口 PersistentKeepalive = 25 # 保持连接的时间间隔(秒)

测试连接

如果使用的公有云有防火墙,需要在对应的公有云上设置放行 UDP 端口:51820。

在客户端设备上打开终端, 测试连接虚拟网口

ping 10.0.10.1 # 服务器虚拟网口IP ping 10.0.0.103 # 服务器内网IP

如果能够收到响应,说明连接成功。

注意事项

安全问题:确保你的私钥不被泄露,否则可能导致安全风险。 法律法规:在使用时,请遵守当地的法律法规,不要用于非法活动。 网络环境:如果在使用过程中遇到连接问题,检查网络环境,如防火墙设置、路由器配置等。

通过以上步骤,你应该能够成功安装和配置 WireGuard,并实现安全的网络连接。WireGuard 的高效和轻量特性使其成为现代网络环境中理想的 VPN 选择。希望本文对你有所帮助,祝使用愉快!