- 0
- 13 浏览
WireGuard是什么?
维基百科是这样描述的:
- WireGuard是一种实现加密虚拟专用网络(VPN) 的通信协议和免费开源软件,其设计目标是易于使用、高速性能和低攻击面;
- 它旨在比IPsec和OpenVPN这两种常见的隧道协议具有更好的性能和更强大的功能;
WireGuard 协议通过UDP传递流量。
通过描述,我们知道了wireguard其实就是一个FAST(速度快)、MODERN(流行)、SECURE (安全)的VPN TUNNEL(VPN隧道)。
安装前提条件
- 需要有公网的ip地址(这些地址可以直接在腾讯云、阿里云等厂商购买);
- 如果Linux内核版本<5.6,可能需要首先更新内核(本文下面有内核升级教程);
WireGuard
的安装和使用条件非常苛刻,对内核版本要求极高,不仅如此,在不同的系统中,内核,内核源码包,内核头文件必须存在且这三者版本要一致。所以一般不建议在生成环境中安装,除非你对自己的操作很有把握。Red Hat
、CentOS
、Fedora
等系统的内核,内核源码包,内核头文件包名分别为kernel
、kernel-devel
、kernel-headers
,Debian
、Ubuntu
等系统的内核,内核源码包,内核头文件包名分别为kernel
、linux-headers
。
如果这三者任一条件不满足的话,则无法测试和安装 Wiregurad
!
目前 WireGuard
已经被合并到 Linux 5.6
内核中了,如果你的内核版本 >= 5.6
,就可以用上原生的 WireGuard
了,只需要安装 wireguard-tools
即可。例如,对于 Ubuntu 20.04
来说,它的内核版本是 5.4
,虽然小于 5.6
,但经过我的测试发现它已经将 WireGuard
合并到了内核中,我们只需要安装 wireguard-tools
即可。
安装WireGuard
教程中使用的系统为Ubuntu 24.04
。
第0步:切换到root用户
sudo su
第一步:开启内核转发:
echo 1 > /proc/sys/net/ipv4/ip_forward
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
第二步:安装WireGuard
apt update
apt install wireguard -y
apt install resolvconf -y
第三步:验证是否安装成功
wg --version
正常来说应该可以看到类似下面的输出:
wireguard-tools v1.0.20210914 - https://git.zx2c4.com/wireguard-tools/
另外一种验证方式:
modprobe wireguard && lsmod | grep wireguard
输出如下:
wireguard 86016 0
curve25519_x86_64 36864 1 wireguard
libchacha20poly1305 16384 1 wireguard
libblake2s 16384 1 wireguard
ip6_udp_tunnel 16384 1 wireguard
udp_tunnel 24576 1 wireguard
libcurve25519_generic 49152 2 curve25519_x86_64,wireguard
配置WireGuard
cd /etc/wireguard
服务端配置
1、生成服务器私钥并将其保存在/etc/wireguard/server_private.key
:
wg genkey | sudo tee /etc/wireguard/server_private.key
输出如下:
UOO//MO2GCC+5hHOz91YCP60/Zv/cnSskEH2j4eRPXo=
2、生成服务器公钥并将其保存在/etc/wireguard/server_public.key
:
cat /etc/wireguard/server_private.key | wg pubkey | sudo tee /etc/wireguard/server_public.key
输出如下:
W+l7Uapd98bsNhN1g3Hs4iTCfKzcV03KNwhDPFgzqR4=
3、查看可用的服务器网络接口并验证主接口的详细信息
ip a
输出如下:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 56:00:04:f8:7f:67 brd ff:ff:ff:ff:ff:ff
inet 192.0.2.161/24 metric 100 brd 192.0.2.255 scope global dynamic enp1s0
valid_lft 56853sec preferred_lft 56853sec
inet6 2a05:0000:0000:000:5400:4ff:0000:7f67/64 scope global dynamic mngtmpaddr noprefixroute
valid_lft 2591775sec preferred_lft 604575sec
inet6 2a05:0000:0000:000:5400:4ff:0000:7f67/64 scope link
valid_lft forever preferred_lft forever
根据描述信息可知道enp1s0
是主公网接口,IP地址为192.0.2.161
。WireGuard
通过主公网接口将网络请求转换并转发到Internet。
4、生成服务端配置文件
echo "[Interface]
PrivateKey = $(cat server_private.key)
Address = 10.8.0.1/24
#如果你的服务器主网卡名称不是 enp1s0 ,那么请修改下面防火墙规则中最后的 enp1s0 为你的主网卡名称。
PostUp = ufw route allow in on wg0 out on enp1s0
PostUp = iptables -t nat -I POSTROUTING -o enp1s0 -j MASQUERADE
PreDown = ufw route delete allow in on wg0 out on enp1s0
PreDown = iptables -t nat -D POSTROUTING -o enp1s0 -j MASQUERADE
ListenPort = 51820
DNS = 8.8.8.8
MTU = 1420
"|sed '/^#/d;/^\s*$/d' > wg0.conf
ListenPort
为端口号,可以设置成自己想使用的端口。
客户端配置(如需增加客户端,重复以下步骤即可)
1、生成客户端私钥:
wg genkey | sudo tee /etc/wireguard/client1_private.key
输出如下:
KBUxCUqNEJqN3DBO5xu2kiBQFT8Gv46Kkqu6OIKZu3Q=
2、生成客户端公钥:
cat /etc/wireguard/client1_private.key | wg pubkey | sudo tee /etc/wireguard/client1_public.key
输出如下:
xZB9I6953ebGqWVLCR7L6yJw7YJi0shJ+Sub9gfUFVU=
3、生成客户端配置文件:
echo "[Interface]
PrivateKey = $(cat client1_private.key)
Address = 10.8.0.2/24
DNS = 8.8.8.8
MTU = 1420
[Peer]
PublicKey = $(cat server_public.key)
# 服务器地址和端口,下面的 X.X.X.X 记得更换为你的服务器公网IP,端口请填写服务端配置时的监听端口
Endpoint = X.X.X.X:51820
AllowedIPs = 0.0.0.0/0, ::0/0
PersistentKeepalive = 25"|sed '/^#/d;/^\s*$/d' > client1.conf
通过上述配置,客户端设备可以与WireGuard
服务器建立新的VPN隧道,并通过隧道IP地址10.8.0.2
访问internet。
4、打开WireGuard
服务器配置,添加新的客户端
将xZB9I6953ebGqWVLCR7L6yJw7YJi0shJ+Sub9gfUFVU=
替换为客户端公钥:
[Peer]
PublicKey = xZB9I6953ebGqWVLCR7L6yJw7YJi0shJ+Sub9gfUFVU=
AllowedIPs = 10.8.0.2/32
管理WireGuard
服务(服务端、客户端命令相同)
1、启动WireGuard
:
systemctl start wg-quick@wg0.service
或者
#启动
wg-quick up wg0
2、配置WireGuard
开机启动:
systemctl enable wg-quick@wg0.service
3、查看WireGuard
状态:
systemctl status wg-quick@wg0.service
正确输出如下:
● wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0
Loaded: loaded (/usr/lib/systemd/system/wg-quick@.service; disabled; preset: enabled)
Active: active (exited) since Wed 2024-06-12 04:47:53 UTC; 38s ago
Docs: man:wg-quick(8)
man:wg(8)
https://www.wireguard.com/
https://www.wireguard.com/quickstart/
https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8
https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8
Process: 2384 ExecStart=/usr/bin/wg-quick up wg0 (code=exited, status=0/SUCCESS)
Main PID: 2384 (code=exited, status=0/SUCCESS)
CPU: 125ms
4、查看WireGuard
虚拟网卡当前状态:
wg
或者
wg show wg0
输出如下:
interface: wg0
public key: W+l7Uapd98bsNhN1g3Hs4iTCfKzcV03KNwhDPFgzqR4=
private key: (hidden)
listening port: 51820
peer: xZB9I6953ebGqWVLCR7L6yJw7YJi0shJ+Sub9gfUFVU=
allowed ips: 10.8.0.2/32
5、停止WireGuard
服务
wg-quick down wg0
测试配置
多台机器互ping
即可:
ping -c 4 10.8.0.1
能ping通,说明WireGuard
安装成功。
输出如下:
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.
64 bytes from 10.8.0.1: icmp_seq=1 ttl=64 time=0.056 ms
64 bytes from 10.8.0.1: icmp_seq=2 ttl=64 time=0.076 ms
64 bytes from 10.8.0.1: icmp_seq=3 ttl=64 time=0.064 ms
64 bytes from 10.8.0.1: icmp_seq=4 ttl=64 time=0.065 ms
--- 10.8.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3049ms
rtt min/avg/max/mdev = 0.056/0.065/0.076/0.007 ms
防火墙配置
默认情况下,Uncomplicated Firewall
(UFW
)在Ubuntu 24.04
服务器上是激活的。这时需要配置防火墙允许在配置中指定的51820
端口上进行网络连接。此外,还需要在服务器上开启端口转发功能,以便通过NAT
(Network Address Translation
)将来自WireGuard
接口地址的网络请求转发到internet。
查看防火墙状态:
ufw status
当UFW
状态为inactive
时,执行如下命令允许SSH端口,并开启防火墙。
ufw allow 22 && sudo ufw enable
允许WireGuard
接口UDP
端口51820
通过防火墙:
ufw allow 51820/udp
重新加载UFW
ufw reload
再次查看UFW
状态:
ufw status
输出如下:
Status: active
To Action From
22/tcp ALLOW Anywhere
51820/udp ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)
51820/udp (v6) ALLOW Anywhere (v6)
Anywhere on enp1s0 ALLOW FWD Anywhere on wg0
Anywhere (v6) on enp1s0 ALLOW FWD Anywhere (v6) on wg0
配置iptables
规则:
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o enp1s0 -j MASQUERADE
注意将enp1s0
改成自己的网卡。
保存规则:
iptables-save | sudo tee /etc/iptables/rules.v4
本文链接:https://www.lifd.site/tech/shi-yong-wireguard-zai-ubuntu2404-xi-tong-da-jian-vpn/