李锋镝的博客

  • 首页
  • 时间轴
  • 说说
  • 读书观影
  • 系列
  • AI工具集
  • 论坛
  • 友圈
    • 友链
    • 朋友圈
    • 游客中心
  • 留言
    • 留言
    • 走心评论
  • 关于
    • 关于本站
    • Now
    • 每日心情
    • 网站地图
    • 网站统计
    • 赞助
  • 星球穿梭
  • 🚇开往
静亦定 动亦定
惟坚韧者始能遂其志
  1. 首页
  2. 运维
  3. 正文

使用WireGuard在Ubuntu 24.04系统搭建VPN

2025年6月24日 373 1 8
本文最后更新于 2025年11月5日,距今已 362 天,其中的信息可能已经发生变化,请注意甄别。

WireGuard是什么?

维基百科是这样描述的:

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

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

安装前提条件

  1. 需要有公网的ip地址(这些地址可以直接在腾讯云、阿里云等厂商购买);
  2. 如果Linux内核版本<5.6,可能需要首先更新内核(本文下面有内核升级教程);
  3. 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.8.0.0/24 -o enp1s0 -j MASQUERADE

注意将enp1s0改成自己的网卡。

保存规则:

iptables-save | sudo tee /etc/iptables/rules.v4
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
分享到

使用WireGuard在Ubuntu 24.04系统搭建VPN

也可使用浏览器菜单中的「分享」功能

微信扫一扫分享

标签: Linux Ubuntu VPN WireGuard
最后更新:2025年11月5日
相关文章
  • 什么是Helm?2025年6月4日
  • Linux开启FTP2022年8月10日
  • 查看占用 CPU 最高的线程(Java)2021年5月27日
  • Linux临时启用swap交换空间2025年8月29日
  • Linux服务器查看日志命令总结12019年11月4日

李锋镝

既然选择了远方,便只顾风雨兼程。

打赏 点赞
< 上一篇
下一篇 >
1234567891112131415161718192021222324252627282930313233343536373839404142434446474849505152535455575859606162636465666769727476777879808182858687909293949596979899
取消回复
…

文章评论

  • azuraLv 1

    iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o enp1s0 -j MASQUERADE这条语句为什么是10.0.0.0而不是10.8.0.0你写错了马?

    LinuxLinuxFirefox 144.0Firefox 144.0中国中国-陕西-西安
    2025年11月4日
    00 回复
    • 李锋镝博主

      @azura 10.8.0.0是你自己的IP段吧?

      macOSmacOSChrome 141.0.0.0Chrome 141.0.0.0中国中国-北京
      2025年11月4日
      00 回复
      • azuraLv 1

        @李锋镝 我是在问你,你为什么前面都是10.8.0.0 后面net就变成10.0.0.0了????

        LinuxLinuxFirefox 144.0Firefox 144.0中国中国-陕西-咸阳
        2025年11月5日
        00 回复
        • 李锋镝博主

          @azura 这个是后续补充的修改iptables的命令,里面的IP地址按照你自己的实际情况替换

          macOSmacOSChrome 141.0.0.0Chrome 141.0.0.0中国中国-北京
          2025年11月5日
          00 回复
  • azuraLv 1

    我不明白的一点是 你是把电脑配成一个服务器 还是让电脑是客户端 服务器配置的时候 你要远程ssh连接服务端吗?

    AndroidAndroidChrome 141.0.0.0Chrome 141.0.0.0中国中国-陕西-咸阳
    2025年11月3日
    00 回复
    • 李锋镝博主

      @azura 可以理解为一个客户端,一个服务端,需要配对使用

      macOSmacOSChrome 141.0.0.0Chrome 141.0.0.0中国中国-北京
      2025年11月3日
      00 回复
      • azuraLv 1

        @李锋镝 我的客户端总是收不到数据,能发送数据,端口也是连通的,服务端可以发送数据也可以接受数据,只要客户端一打开就直接断网了,什么都打不开,这可能是哪里出问题?

        LinuxLinuxFirefox 144.0Firefox 144.0中国中国-陕西-西安
        2025年11月4日
        00 回复
        • 李锋镝博主

          @azura 检查下防火墙吧

          macOSmacOSChrome 141.0.0.0Chrome 141.0.0.0中国中国-北京
          2025年11月4日
          00 回复
  • 我思故我在。

    听点儿音乐吧 朋友~
    文章目录
    最新 热点 随机
    最新 热点 随机
    又一个逆天改命的人:小小徐 AI的生成能力等于生产力吗? NGINX严重漏洞(CVE-2026-15176、CVE-2026-93479、CVE-2026-97205) Kratos-plus v1.1.27更新说明 php2shell远程执行漏洞修复(CVE-2026-109618 和 CVE-2026-109619) 聊一聊DeepSeek开放自研搜索API这事
    给主题增加了游客中心功能心气没了,干什么都不得劲我觉得是时候公布我的导航网站了游本昌去世关于主题加载速度优化的一点儿小演进给主题增加了Now、每日心情、年度回顾、岁月同一天、随机漫步等功能
    几款Java开发者必备常用的工具,准点下班不在话下 你好,2023 博客有logo啦 Spring Boot 配置加载优先级总结 又一个逆天改命的人:小小徐 RAG太难学?LLM Wiki了解一下
    最近评论
    李锋镝 发布于 5 小时前(11月02日) 良田是啥?
    李锋镝 发布于 5 小时前(11月02日) 哈哈哈,我也希望
    李锋镝 发布于 5 小时前(11月02日) 看最新的说是骗流量的,哎
    女装品牌前十名 发布于 17 小时前(11月01日) 文章不错非常喜欢,支持一下
    彬红茶 发布于 22 小时前(11月01日) 我也刷到这个了,不知道你有没有刷过良田
    标签聚合
    WordPress AI Theme SpringBoot 分布式 日常 架构 K8s JVM ElasticSearch 多线程 JAVA Spring AI编程 SQL MySQL Claude Redis 数据库 IDEA
    友情链接
    • 志文工作室
    • lijie blog
    • 九仞之行
    • 瓦匠个人小站
    • 皮皮社
    • 韩小韩博客
    • 林羽凡
    • 知向前端
    • Honesty
    • sssr7844的博客
    • 刘永博客
    • Serendipity
    • 彬红茶日记
    • 韩情脉脉
    • 哥斯拉
    • 老张博客
    • Mr.Sun的博客
    • 懋和道人
    • 搬砖日记

    COPYRIGHT © 2016-2026 lifengdi.com. ALL RIGHTS RESERVED.

    lifengdi.com 十年之约虫洞

    Domain age badge for lifengdi.com

    Theme Kratos-plus By Dylan Li

    津ICP备2024022503号-3

    京公网安备11011502039375号