WireGuard是什么?

维基百科是这样描述的:

  • WireGuard是一种实现加密虚拟专用网络(VPN) 的通信协议和免费开源软件,其设计目标是易于使用、高速性能和低攻击面;
  • 它旨在比IPsec和OpenVPN这两种常见的隧道协议具有更好的性能和更强大的功能;
    WireGuard 协议通过UDP传递流量。

通过描述,我们知道了wireguard其实就是一个FAST(速度快)、MODERN(流行)、SECURE (安全)的VPN TUNNEL(VPN隧道)。

安装前提条件

  1. 需要有公网的ip地址(这些地址可以直接在腾讯云、阿里云等厂商购买);
  2. 如果Linux内核版本<5.6,可能需要首先更新内核(本文下面有内核升级教程);
  3. WireGuard 的安装和使用条件非常苛刻,对内核版本要求极高,不仅如此,在不同的系统中,内核,内核源码包,内核头文件必须存在且这三者版本要一致。所以一般不建议在生成环境中安装,除非你对自己的操作很有把握。Red HatCentOSFedora 等系统的内核,内核源码包,内核头文件包名分别为 kernelkernel-develkernel-headersDebianUbuntu 等系统的内核,内核源码包,内核头文件包名分别为 kernellinux-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.161WireGuard通过主公网接口将网络请求转换并转发到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 FirewallUFW)在Ubuntu 24.04服务器上是激活的。这时需要配置防火墙允许在配置中指定的51820端口上进行网络连接。此外,还需要在服务器上开启端口转发功能,以便通过NATNetwork 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/

“觉得文章还不错?微信扫一扫,赏作者一杯咖啡吧~”
分类
guest

0 评论
最旧
最新 最多投票
内联反馈
查看所有评论

相关文章

JAVA对接MFA多因子认证

背景 什么是MFA? MFA:多因素认证(M...

Dockerfile 指令详解之COPY和ADD

COPY 复制文件 格式: COPY &lt...

Java设计模式总结

概念 软件设计模式(Software Des...

微服务架构中服务拆分粒度决策

在设计和实施微服务架构时,拆分粒度的决策非常...

Dubbo和Feign的区别

Feign与Dubbo性能对比及区别分析 随...