如何在Ubuntu 18.04上设置WireGuard VPN
WireGuard是具有最新加密技术的现代VPN(虚拟专用网)技术。
与IPsec和OpenVPN等其他类似解决方案相比,WireGuard更快,更易于配置且性能更高。
它是一个跨平台,几乎可以在任何地方运行,包括Linux,Windows,Android和macOS。
Wireguard是对等VPN。
它不使用客户端-服务器模型。
根据其配置,对等方可以充当传统的服务器或者客户端。
WireGuard通过在充当隧道的每个对等设备上创建网络接口来工作。
对等方通过交换和验证公共密钥来模仿彼此的身份,类似于SSH模型。
公钥与隧道中允许的IP地址列表进行映射。
VPN流量封装在UDP中。
在本教程中,我们将在充当VPN服务器的Ubuntu 18.04计算机上设置WireGuard。
我们还将向我们展示如何将WireGuard配置为客户端。
客户端的流量将通过Ubuntu 18.04服务器进行路由。
此设置可用于防御中间人攻击,匿名浏览网络,绕过受地域限制的内容或者在远程工作时允许同事安全连接到网络。
准备工作
我们需要一台Ubuntu 18.04服务器,我们可以使用root用户或者具有sudo特权的帐户进行访问。
设置WireGuard服务器
在本部分中,我们将在Ubuntu机器上安装WireGuard并将其设置为充当服务器。
我们还将配置该系统以通过它路由客户端的流量。
在Ubuntu 18.04上安装WireGuard
WireGuard包含在默认的Ubuntu存储库中。
要安装它,请运行以下命令:
sudo apt updatesudo apt install wireguard
WireGuard作为内核模块运行,该模块被编译为DKMS模块。
成功完成后,我们将看到以下输出:
wireguard: Running module version sanity check. - Original module - No original module exists within this kernel - Installation - Installing to /lib/modules/4.15.0-88-generic/updates/dkms/ depmod... DKMS: install completed.
更新内核时,将针对新内核编译WireGuard模块。
配置WireGuard
WireGuard随附了两个名为“ wg”和“ wg-quick”的命令行工具,可用于配置和管理WireGuard接口。
运行以下命令以生成公钥和私钥:
wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey
这些文件将在“/etc/wireguard”目录中生成。
我们可以使用'cat'或者'less'查看文件。
私钥绝对不能与任何人共享。
生成密钥后,我们需要配置将路由VPN流量的隧道设备。
可以使用“ ip”和“ wg”从命令行设置设备,也可以使用文本编辑器创建配置文件。
创建一个名为“ wg0.conf”的新文件,并添加以下内容:
sudo nano /etc/wireguard/wg0.conf
/etc/wireguard/wg0.conf
[Interface] Address = 10.0.0.1/24 SaveConfig = true ListenPort = 51820 PrivateKey = SERVER_PRIVATE_KEY PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE
该接口可以命名为任何名称,但是建议使用诸如include'wg0'或者'wgvpn0'之类的名称。
界面部分中的设置具有以下含义:
- 地址-“ wg0”接口的v4或者v6 IP地址的逗号分隔列表。使用专用于专用网络的范围内的IP(10.0.0.0/8、172.16.0.0/12或者192.168.0.0/16)。
- ListenPort-WireGuard接受传入连接的端口。
- PrivateKey-由“ wg genkey”命令生成的私钥。 (要查看文件的内容,请运行:'sudo cat/etc/wireguard/privatekey')
- SaveConfig-设置为true时,关闭时接口的当前状态将保存到配置文件中。
- PostUp-在启动界面之前执行的命令或者脚本。在此示例中,我们使用iptables启用伪装。这将允许流量离开服务器,使VPN客户端可以访问Internet。请确保在“ -A POSTROUTING”之后替换“ ens3”,以与公共网络接口的名称匹配。我们可以通过运行以下命令轻松找到该接口:
ip -o -4 route show to default | awk '{print }'
- PostDown-在关闭接口之前执行的命令或者脚本。接口关闭后,iptables规则将被删除。
普通用户不应读取“ wg0.conf”和“ privatekey”文件。
使用“ chmod”将权限设置为“ 600”:
sudo chmod 600 /etc/wireguard/{privatekey,wg0.conf}
完成后,使用配置文件中指定的属性打开“ wg0”界面:
sudo wg-quick up wg0
该命令将产生类似于以下内容的输出:
[#] ip link add wg0 type wireguard [#] wg setconf wg0 /dev/fd/63 [#] ip -4 address add 10.0.0.1/24 dev wg0 [#] ip link set mtu 1420 up dev wg0 [#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
运行“ wg show wg0”以检查接口状态和配置:
sudo wg show wg0
interface: wg0 public key: r3imyh3MCYggaZACmkx+CxlD6uAmICI8pe/PGq8+qCg= private key: (hidden) listening port: 51820
我们也可以运行“ ip a show wg0”来验证接口状态:
ip a show wg0
4: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000 link/none inet 10.0.0.1/24 scope global wg0 valid_lft forever preferred_lft forever
要在启动时启用WireGuard接口,请运行以下命令:
sudo systemctl enable wg-quick@wg0
服务器网络和防火墙配置
为了使NAT正常工作,我们需要启用IP转发。
打开“ /etc/sysctl.conf”文件,并添加或者取消注释以下行:
sudo nano /etc/sysctl.conf
/etc/sysctl.conf
net.ipv4.ip_forward=1
保存文件并应用更改:
sudo sysctl -p
net.ipv4.ip_forward = 1
如果使用UFW管理防火墙,则需要在端口“ 51820”上打开UDP通信:
sudo ufw allow 51820/udp
已经设置了将充当服务器的Ubuntu对等体。
Linux和macOS客户端设置
有关所有受支持平台的安装说明,请访问https://wireguard.com/install/。
在Linux系统上,我们可以使用分发软件包管理器来安装软件包,而在具有'brew'的macOS上也可以安装该软件包。
安装WireGuard后,请按照以下步骤配置客户端设备。
设置Linux和macOS客户端的过程几乎与服务器相同。
首先生成公钥和私钥:
wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey
创建文件“ wg0.conf”并添加以下内容:
sudo nano /etc/wireguard/wg0.conf
/etc/wireguard/wg0.conf
[Interface] PrivateKey = CLIENT_PRIVATE_KEY Address = 10.0.0.2/24 [Peer] PublicKey = SERVER_PUBLIC_KEY Endpoint = SERVER_IP_ADDRESS:51820 AllowedIPs = 0.0.0.0/0
接口部分中的设置与设置服务器时的含义相同:
- 地址-“ wg0”接口的v4或者v6 IP地址的逗号分隔列表。
- PrivateKey-要在客户端计算机上查看文件的内容,请运行:'sudo cat/etc/wireguard/privatekey'
对等部分包含以下字段:
- PublicKey-我们要连接的对等方的公共密钥。 (服务器的“/etc/wireguard/publickey”文件的内容)。
- 端点-我们要连接的对等方的IP或者主机名,后跟冒号,然后是远程对等方侦听的端口号。
- AllowedIPs-v4或者v6 IP地址的逗号分隔列表,从该列表允许对等方的传入流量,并定向到该对等方的传出流量。我们使用0.0.0.0/0是因为我们正在路由流量,并希望服务器对等方发送具有任何源IP的数据包。
如果需要配置其他客户端,只需使用其他专用IP地址重复相同的步骤即可。
Windows客户端安装程序
从WireGuard下载并安装Windows msi软件包。
安装后,打开WireGuard应用程序,然后单击“添加隧道”->“添加空隧道…”,如下图所示:
将自动创建一个公钥对,并将其显示在屏幕上。
输入隧道的名称并按如下所示编辑配置:
[Interface] PrivateKey = CLIENT_PRIVATE_KEY Address = 10.0.0.2/24 [Peer] PublicKey = SERVER_PUBLIC_KEY Endpoint = SERVER_IP_ADDRESS:51820 AllowedIPs = 0.0.0.0/0
在接口部分中,添加新行以定义客户端隧道地址。
在对等部分中,添加以下字段:
- PublicKey-Ubuntu服务器的公共密钥(“/etc/wireguard/publickey”文件)。
- 端点-Ubuntu服务器的IP地址,后跟冒号和WireGuard端口(51820)。
- 允许的IP-0.0.0.0/0
完成后,单击“保存”按钮。
将客户端对等方添加到服务器
最后一步是将客户端公钥和IP地址添加到服务器:
sudo wg set wg0 peer CLIENT_PUBLIC_KEY allowed-ips 10.0.0.2
确保使用在客户端计算机上生成的公共密钥(“ sudo cat/etc/wireguard/publickey”)更改“ CLIENT_PUBLIC_KEY”,并调整客户端IP地址(如果不同)。
Windows用户可以从WireGuard应用程序复制公钥。
完成后,返回客户端计算机并打开隧道接口。
Linux和macOS客户端
在Linux客户端上,运行以下命令以打开界面:
sudo wg-quick up wg0
现在,我们应该已连接到Ubuntu服务器,并且来自客户端计算机的流量应通过该服务器进行路由。
我们可以使用以下方法检查连接:
sudo wg
interface: wg0 public key: sZThYo/0oECwzUsIKTa6LYXLhk+Jb/nqK4kCCP2pyFg= private key: (hidden) listening port: 48052 fwmark: 0xca6c peer: r3imyh3MCYggaZACmkx+CxlD6uAmICI8pe/PGq8+qCg= endpoint: XXX.XXX.XXX.XXX:51820 allowed ips: 0.0.0.0/0 latest handshake: 1 minute, 22 seconds ago transfer: 58.43 KiB received, 70.82 KiB sent
我们还可以打开浏览器,键入“ what is my ip”,然后我们应该会看到Ubuntu服务器IP地址。
要停止隧道,请关闭“ wg0”接口:
sudo wg-quick down wg0
Windows客户端
如果我们在Windows上安装了WireGuard,请单击“激活”按钮。
连接对等体后,隧道状态将更改为“活动”。