WireGuard 低成本异地组网

附:好用的 WireGuard Web Interface

https://github.com/ngoduykhanh/wireguard-ui

来自我的突发奇想

某天训练时没有事干,看着树莓派,逛着淘宝,想买一个 M.2 拓展板,随后看了看银行卡,笑死,根本没有钱。

于是放弃了。

接着想了又想,突然想起个几年前自己多人联机(指游戏)时用过的蒲公英,所以想搞个和蒲公英差不多的。

解决方案:WireGuard

为什么选 WireGuard 呢?

听说很好用,所以我也选了,结果真的好用。

总之,是简单,真的简单,真的真的非常简单(没 ZeroTier 简单)

只不过 WireGuard 是通过 UDP 通信的,可能会被运营商 QoS 限速。(不过是基于 UDP 的那是不是改个端口也能绕过校园网呢?)

本文章的所有资料收集于互联网并整合本人经验撰写而成,且不会提供客户端的下载直链。

服务器配置

安装相关软件

我这里选择 Ubuntu 20.04 的服务器,直接apt安装即可

apt install wireguard wireguard-tools resolvconf -y
modprobe wireguard

如果你安装时在dkms那边报错了,试试升级系统或者内核吧。

公私钥生成

先执行一段命令,生成公私钥。From Github Gist

// 生成私钥
wg genkey
// 生成后复制它,然后生成公钥
echo '你的私钥' | wg pubkey

// 随后保存私钥和公钥

撰写配置文件

随后,切换到 WireGuard 目录 (/etc/wireguard),创建一个配置文件,这里我命名为:wg0.conf

[Interface]
PrivateKey = 你的私钥
Address = 10.0.0.1/24 # 本机IP,24代表着255.255.255.0,当然这IP不能乱填哈
PostUp   = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 2083
# 监听端口

[Peer]
# 这是客户端的配置
PublicKey = 客户端公钥
AllowedIPs = 10.0.0.2/32 # 客户端的IP,不要冲突。我不是很理解/32是什么意思

打开内核IP转发

为什么要这步呢?这东西不开 Peer 之间是不能互通的。

来源:Linux下启用IP转发功能(主要针对Ubuntu的使用)

echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
sysctl -p /etc/sysctl.conf
/etc/init.d/procps restart

设置开启启动

如果你不需要开机自启,可以忽略这一步。

systemctl enable wg-quick@wg0 // wg0是你的配置文件名称,本文中是wg0

启动WireGuard

systemctl start wg-quick@wg0 // wg0是你的配置文件名称,本文中是wg0

顺便一提,WireGuard 要热加载的话,貌似不能直接 reload,得通过 wg 命令修改参数,之后还可以 save 到配置文件,但是 save 后,配置文件中会记录每个客户端的 IP。

客户端配置

生成公私钥

客户端生成公私钥也可以执行下面的命令。Windows 客户端会自动生成公私钥,其余客户端没有试过。

// 生成私钥
wp genkey
// 生成后复制它,然后生成公钥
echo '你的私钥' | wg pubkey

// 随后保存私钥和公钥

配置文件

创建一个 conf 文件,名称随意,这里我用 Windows 当作客户端。你可以在客户端内新建空白配置文件(隧道)。

WireGuard客户端

Public key 是公钥,需要填到服务器的 Peer 中,Private key 是私钥,不用给任何人,也不要修改。

然后参考一下格式修补配置文件

[Interface]
PrivateKey = 4ML2bxeApulYMfV24DFVr+vivh6ZCZokQSzO5fCBzmU= # 你的私钥
Address = 10.0.0.2/24 # 客户端IP,和在服务端Peer中的IP保持一致
DNS = 114.114.114.114 # 如果你要绕过校园网的话,可能还要再指定一个上游DNS

[Peer] 
PublicKey = 1fCduxAW1ilmeQqNzMF13qudRPjbc1aDpOG8GrJ2Bmc= # 服务器的公钥
AllowedIPs = 10.0.0.0/24, ::/1, 8000::/1 # 允许的IP,这里10.0.0.0/24是只允许这个网段的 IP 走 WireGuard ,其余的直连。
Endpoint = 服务器IP:端口

多客户端

如果要创建多客户端,则每个客户端公私钥,IP不能相同,然后在服务端上增加 Peer 即可。只需要修改Public key。

下面是服务器端多 Peer 例子

[Interface]
PrivateKey = 你的私钥
Address = 10.0.0.1/24 # 本机IP,24 代表着 255.255.255.0
PostUp   = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 2083
# 监听端口

[Peer]
# 这是客户端的配置
PublicKey = 客户端公钥
AllowedIPs = 10.0.0.2/32 # 客户端的 IP ,不要冲突。

[Peer]
# 这是客户端 2 的配置
PublicKey = 客户端 2 的公钥
AllowedIPs = 10.0.0.3/32 # 客户端的 IP,不要冲突。

可以看到,只需要增加一个 Peer 即可。增加客户端不需要修改原有客户端的配置。

完成后,重启 WireGuard,不过可能会造成其余客户端的几秒钟连接中断。

systemctl restart wg-quick@wg0

Cheers!

成功异地组网

此时,多增加一些客户端,来试试能否互相 ping 通。如果还有一些疑问,欢迎评论。

评论

  1. 夏日星沉
    Windows Chrome 108.0.0.0
    1年前
    2022-12-23 17:18:54

    组网是没毛病,主要的问题是游戏组网的问题,由于udp报文没法跨网段广播,所以进游戏2边都搜不到房间

    • 博主
      夏日星沉
      iPhone Safari 16.1
      1年前
      2022-12-24 13:35:10

      如何可以的话,试试手动指定IP

  2. Houiin
    2年前
    2022-1-10 9:27:32

    博主大大我目前遇到的问题是..不同NAT下的机器能用wireguard的私有IP ping通,但是什么服务都无法访问,已经把双方的防火墙全部关掉了,但是只能ping通,别的啥也干不了

    • 博主
      Houiin
      2年前
      2022-1-10 9:31:11

      IP转发开了吗,还是应用没有绑定WireGuard的私有IP

  3. xiao
    2年前
    2021-11-25 15:22:52

    目前我网关可以分别连接到两个nat下的设备,nat1可以ping通nat2,但是不能从nat1ssh到nat2,不清楚网关哪里的路由错误。网关的路由为iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens192 -j MASQUERADE

    • 博主
      xiao
      2年前
      2021-11-25 15:35:00

      试试关闭防火墙或者放行防火墙

  4. 3vilive
    2年前
    2021-11-23 16:49:57

    成功了!十分感谢!

    • 博主
      3vilive
      2年前
      2021-11-23 16:55:56

      嗯呐

      • 3vilive
        iVampireSP.com
        2年前
        2021-11-23 18:01:59

        已经连了好多个节点啦~ 建议 PO 主有时间的话可以补充一下没有 GUI 的客户端(Linux)配置教程。再次感谢 ~

        • 博主
          3vilive
          2年前
          2021-11-23 18:08:14

          嗯嗯,这部分我写的不是很清楚,后面有时间会改一下的。Linux部分和win那边一样用就行

  5. 119977
    3年前
    2021-7-17 21:42:46

    搞了很久也没能实现隧道互通,总是打不通子机

    • 博主
      119977
      3年前
      2021-7-23 23:14:02

      可能是ip转发没开吧

    • 博主
      119977
      3年前
      2021-7-23 23:14:08

      有日志吗?

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇