李锋镝的博客

  • 首页
  • 时间轴
  • 评论区显眼包🔥
  • 左邻右舍
  • 博友圈
  • 关于我
    • 关于我
    • 另一个网站
    • 我的导航站
    • 网站地图
    • 赞助
  • 留言
  • 🚇开往
Destiny
自是人生长恨水长东
  1. 首页
  2. 运维
  3. 正文

使用WireGuard在Ubuntu 24.04系统搭建VPN

2025年6月24日 953点热度 1人点赞 8条评论

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
除非注明,否则均为李锋镝的博客原创文章,转载必须以链接形式标明本文链接

本文链接:https://www.lifengdi.com/yun-wei/4475

相关文章

  • Linux临时启用swap交换空间
  • 什么是Helm?
  • 精通Linux根目录:核心文件夹深度解析与实战指南
  • NLB和ALB结合的场景和优缺点
  • 服务器差点被一群垃圾爬虫搞挂了
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: Linux Ubuntu VPN WireGuard
最后更新:2025年11月5日

李锋镝

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

打赏 点赞
< 上一篇
下一篇 >

文章评论

  • azura黑铁

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

    Linux
    Firefox 144.0 中国-陕西-西安
    2025年11月4日
    回复
    • 李锋镝管理

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

      macOS
      Chrome 141.0.0.0 中国-北京
      2025年11月4日
      回复
      • azura黑铁

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

        Linux
        Firefox 144.0 中国
        2025年11月5日
        回复
        • 李锋镝管理

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

          macOS
          Chrome 141.0.0.0 中国-北京
          2025年11月5日
          回复
  • azura黑铁

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

    Android
    Chrome 141.0.0.0 中国
    2025年11月3日
    回复
    • 李锋镝管理

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

      macOS
      Chrome 141.0.0.0 中国-北京
      2025年11月3日
      回复
      • azura黑铁

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

        Linux
        Firefox 144.0 中国-陕西-西安
        2025年11月4日
        回复
        • 李锋镝管理

          @azura 检查下防火墙吧

          macOS
          Chrome 141.0.0.0 中国-北京
          2025年11月4日
          回复
  • 1 2 3 4 5 6 7 8 9 11 12 13 14 15 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 46 47 48 49 50 51 52 53 54 55 57 58 60 61 62 63 64 65 66 67 69 72 74 76 77 78 79 80 81 82 85 86 87 90 92 93 94 95 96 97 98 99
    取消回复

    秋天是倒放的春天,晚安是爱你的序篇。

    那年今日(02月10日)

    • 1953年:穆罕默德·纳吉布出任埃及总统
    • 1923年:德国物理学家、X射线发现者伦琴逝世
    • 1898年:德国戏剧家贝尔托·布莱希特出生
    • 1894年:英国政治家哈罗德·麦克米伦出生
    • 589年:杨坚灭陈朝,南北朝结束
    • 更多历史事件
    最新 热点 随机
    最新 热点 随机
    Apollo配置中心中的protalDB的作用是什么 org.apache.ibatis.plugin.Interceptor类详细介绍及使用 JDK25模块级导入深度解析:Java导入机制的革命性进化 AI时代,个人技术博客的出路在哪里? 什么是Meta Server? 千万级大表新增字段实战指南:告别锁表与业务中断
    玩博客的人是不是越来越少了?AI时代,个人技术博客的出路在哪里?准备入手个亚太的ECS,友友们有什么建议吗?使用WireGuard在Ubuntu 24.04系统搭建VPNWordPress实现用户评论等级排行榜插件WordPress网站换了个字体,差点儿把样式换崩了
    JWT、Cookie、Session、Token 区别与实战选型指南 Spring Boot 2.5.0重新设计的spring.sql.init 配置有啥用? 微服务的数据库设计 MySQL数据库详解——执行SQL更新时,其底层经历了哪些操作? AI重构开发者工作范式:从Anthropic内部调研看Claude对研发领域的深层影响 使用Spring MVC的websocket配置时 Tomcat启动报错
    标签聚合
    Spring K8s docker JAVA JVM 分布式 数据库 SpringBoot AI IDEA Redis 日常 AI编程 MySQL 多线程 SQL 设计模式 WordPress ElasticSearch 架构
    友情链接
    • Blogs·CN
    • Honesty
    • Mr.Sun的博客
    • 临窗旋墨
    • 哥斯拉
    • 彬红茶日记
    • 志文工作室
    • 懋和道人
    • 搬砖日记
    • 旧时繁华
    • 林羽凡
    • 瓦匠个人小站
    • 皮皮社
    • 知向前端
    • 蜗牛工作室
    • 韩小韩博客
    • 风渡言

    COPYRIGHT © 2026 lifengdi.com. ALL RIGHTS RESERVED.

    域名年龄

    Theme Kratos Made By Dylan

    津ICP备2024022503号-3

    京公网安备11011502039375号