#> RESTKHZ _

休止千鹤 | 我依旧是一名平凡的学生

Wireguard-easy: 一个基于docker的wireguard管理面板的上手

  休止千鹤  |    18/06/2021

缘起

自己的网络服务正在越来越多. 私有网盘, 札记, Todolist, 相册, 邮箱…甚至有账本, 密码管理工具等等.

如此多的私密服务让我感到十分不安, 因为这些服务我不得不远程使用,不得不跨越公网。而公网并不安全。

你或许听说过各种服务比如NextCloud, 某些管理软件, 摄像头等存在安全问题.当你读到这句话的时候, 这台服务器很可能就在被各种bot扫描. 而我的SMTP服务和ssh正在一刻不停的受到来自全球IP的暴力破解. 也就是说, 随着服务的增多, 暴露出的攻击面就越大, 我的个人信息越来越不安全. 并且, 我的服务器运行在我自己的住处, 被入侵后直接可以进入我日常生活的网络, 就像房间有陌生人能随意出入一样.

于是我使用了wireguard来保护我的通信. 我不再把内网服务暴露出来, 而是我在需要的时候自己进入内网.

但是随着设备的增加, 每次都需要生成秘钥, Copy秘钥到服务器, 写配置文件。 重复且繁琐的机械工作并不是一件愉快的事情. 于是我决定试着使用一下Wireguard管理面板:

Github: Wireguard-easy

(来自github项目Readme)

功能

就我用下来的体会, 这并不是一个能把wg功能完全发挥出来开的项目, 而只是一个精巧的小工具. 对于日常组网来说够用。
这个项目依旧存在一些问题, UI功能并不完善. 我是在后面进行了一些修改后才达到了预期
所以, 某些场合这并非完全开箱即用, 各位读者请多考虑.

  1. 提供密码保护的web UI, UI设计美观.
  2. 自动创建带有preshared-key的配置文件, 可以使用二维码扫描或者下载配置文件的方式获取配置信息.
  3. 可以随时启用禁用某个客户端.

wg-easy密码验证

其缺点:

  1. 功能就以上那些了, 没了, 对.
  2. 不能在配置文件中轻松配置访问来源, 也就是说, 这个web UI默认也是面向公网. 防护仅靠你设置的密码. 没有2FA. 那么你必须需要一个相当长,复杂且无规律的密码. (其实可以解决, 看后文)
  3. udp端口配置依旧存在缺陷, docker-compose.yml中修改后并没有什么作用. WEB UI端口实际上在config.js留了参数但是并没有在文档中公开.(有没有用不知道, 希望这里我没弄错. 但是也有别的方法可以解决这个问题.)
  4. 创建客户端后无法在其UI编辑任何信息, 包括tag.
  5. 无法在WebUI中手动指定其静态IP, 此外, 除非下载, 或者你可以直接阅读二维码, 那么你甚至不知道其生成的IP到底是什么. 其他配置选项也比较缺乏,这点对于内网组网相当的不友好.

综上, 和Subspace, NetMaker比起来, 安装哪个请自行考量. 对于我嘛, 又不是不能用

安装

如果你已经安装好了 Docker, 那么安装过程非常简单. 以下命令来自其项目readme.md

$ mkdir ~/.wg-easy
$ cd ~/.wg-easy
$ wget https://raw.githubusercontent.com/WeeJeWel/wg-easy/master/docker-compose.yml
$ vim docker-compose.yml

然后我们来运行它

sudo docker-compose up --detach

至于docker-compose.yml的内容, env参数的使用, 请去阅读其项目readme. 对, 我懒, 懒得抄XD.

适配&&一些问题

wg-easy

(第一个用于测试的wg配置)

迁移,导入原来的密钥

想用起来的过程并不是非常顺利. 由于我UDP端口已经有指定, 秘钥也在多个服务器已经有了部署, 所以我不能接受其自己生成的新的秘钥.

我需要将其生成的秘钥替换成我自己已经有了的秘钥对. 可惜这个工具不支持上传.

如果你是按照其Readme.md文档配置的, 那么其配置文件就在~/.wg-easy之下的wg0.json中. 修改wg0.conf无效, 它是被自动生成的文件.

哦, 对了, 如果你要修改Tag等等也是在wg0.json中进行更改.

你可以复制之前的秘钥, 粘贴进wg0.json进行覆盖. preshared key可以不管.

UDP节点监听端口无法修改的问题

另一个就是监听UDP端口的问题. wg-easy默认监听51820, 在docker-compose.yml中WG_PORT这一配置修改后依旧无效. 你甚至能在其项目文件中找到被硬编码的51820这个数字.

我的解决方法是直接在docker-compose.yml中的ports把映射写成:"<port>:51820/udp"解决的这个问题.

当然了,这个功能本身通过webUI也不好实现。可能本身设计意图就是改docker-compose.yml所以无伤大雅。

Wireguard: Address unreachable 问题

这个被我遗忘了, 不得不提一下, 在服务器上需要设置一下PersistentKeepalive这一项.
Wireguard-easy居然也没有生成这个. (懒得吐槽了)
因为我的服务器在我自己房间里, 在NAT和防火墙之后. 因为长时间没有流量的时候会被NAT”遗忘”而造成Address unreachable, 导致服务器”消失了”, 你用其他设备连不上你在wg内网的服务. 不过别的不提供服务的peer这点也无所谓.

请参见Wireguard: Quick start
或者Archlinux wiki: Unable to establish a persistent connection behind NAT / firewall

屏蔽公网访问Web UI

这个着实有点tricky了, 因为Wireguard转发后流量是从容器内的UDP端口出来, 而不是从宿主机进入.

什么意思呢? 你看了我怎么做就懂了.

所以我直接在docker-compose.yml中修改了管理界面的映射: <port>:51821/tcp(把容器的51821端口映射到<port>) , 然后用宿主机的防火墙Block了<port>端口, 也就是说, 不可能从公网通过宿主机访问这个WebUI了. 然而你在内网的时候, 流量是从UDP端口直接进入容器访问其51821的, 所以只能进入wg内网才能访问WebUI.

此时你甚至可以在宿主机屏蔽掉所有端口, 仅仅暴露一个不起眼的, 随意的UDP端口.

到这里, 我的目的已经达到了. 现在我们可以把分布在异地的服务都保护在了自己的内网之中. 把一扇扇门堵上, 指留一扇小小的UDP防盗门.

嗯,
“又不是不能用”

(根据评论区ous50:可以设置 docker port forwarding 为 127.0.0.1:xxxx,只填端口的话会默认变成0.0.0.0:xxxx 这个听上去也是一个方法,而且更简单。)

一些问答:
Q:我想用wg科学, 可以吗?
A:可以但是不推荐,但由于存在明显的协议特征,容易发送进亚空间,不推荐。

Q:可以用来联机游戏吗?
A:可以但是不推荐,因为这是layer3。如果游戏可以输入IP直连,那么能用。但是如果游戏是内网发现的那种layer3的就做不到了。建议用n2n或者一些商业解决方案。

Q:我有更加复杂的网络需求…
A:可以试试NetMaker。


Views:

 Comments


站元素主机:

赞一个 感谢分享

 Reply


severus:

赞一个

 Reply


help:

感谢大佬教程, 我在pve下的一个虚拟机(ip:192.168.10.22)中建了这个weejewel/wg-easy服务器,手机扫码后可以访问局域网中其他地址,如192.168.10.1、192.168.10.11等,但是不能访问192.168.10.22这台主机,是什么原因啊

 Reply


restkhz:(admin)

help said : 感谢大佬教程, 我在pve下的一个虚拟机(ip:192.168.10.22)中建了这个weejewel/wg-easy服务器,手机扫码后可以访问局域网中其他地址,如192.168.10.1、192.168.10.11等,但是不能访问192.168.10.22这台主机,是什么原因啊
昂...不好意思,我没搞懂你说的,而且你提供的信息太少了。我不瞎猜,如果您可以补充说明说不定我可以帮上什么。我想知道,你说的192.168.10.x是不是wg虚拟网卡的地址?还有“不能访问”,怎么访问的?是ping不通?TCP是超时还是拒绝?

 Reply


ereal:

感谢大佬教程。请问,在管理页面设置了用户xyz之后,生成的xyz.conf,直接下载使用,但很想知道xyz.conf的存放位置,我找了很久也没有找到。先谢谢大佬!

 Reply


restkhz:(admin)

ereal said : 感谢大佬教程。请问,在管理页面设置了用户xyz之后,生成的xyz.conf,直接下载使用,但很想知道xyz.conf的存放位置,我找了很久也没有找到。先谢谢大佬!
客户端和服务器都配置文件都是直接生成的。参考目前的wg-easy项目文件:wg-easy/src/lib/Server.js 的api定义:/api/wireguard/client/:clientId/configuration一路追踪到wg-easy/src/lib/WireGuard.js,我们可以看到这些配置都是由getConfig()读取的,来自wg0.json文件。 如果你是最近克隆的这个项目,可以去找你下载并启动docker-compose.yml的地方。其中有一句 .:/etc/wireguard, 就是把当前目录映射到容器/etc/wireguard文件夹。也就是说,所有的配置文件都在你放docker-compose.yml的地方。你应该能找到wg0.conf和wg0.json,前者是给服务器wg用的配置文件,是由软件根据后者json生成,直接编辑无效。后者json文件包含了客户端的详细信息。以上。

 Reply


ereal:

restkhz said :大佬好!请问,如果将vps的wg和openwrt里的wireguard VPN连通,是否能够实现直接科学呢?先谢谢大佬!

 Reply


restkhz:(admin)

ereal said : 大佬好!请问,如果将vps的wg和openwrt里的wireguard VPN连通,是否能够实现直接科学呢?先谢谢大佬!
把Allowips修改成0.0.0.0/0就可以了,但是不推荐这么做。 wg有很明显的流量特征,尽管使用了UDP但是封杀起来也很容易。另一方面是并没有那么多的用于科学的设置。

 Reply


xiaoyi:

restkhz said :
他的问题我也遇到了,就是只能连接了wireguard的设备之间互相可以ping通,但原来的内网就ping不通了(例如,我的主机打开了wireguardVPN,wireguard分配的ip为10.0.1.x,我去ping其他10.0.1.x没有问题,主机原来的内网是192.168.1.x,开启wireguardvpn后,192.168.1.x网段全部不通)

 Reply


restkhz:(admin)

xiaoyi said :
你可能遇到的问题和之前那个人不一样。我比较怀疑你设置的AllowedIPs有问题。你是不是直接设置成0.0.0.0/0了?这样的话你所有内网的请求也都会被转出去。我刚刚在自己安卓机上面试了一下,的确有这种问题。安卓客户端有一个Exclude Private IPs的选项,就在Allowed IPs下面。你可以选上。这样会排除内网地址的转发,并且所有去公网的流量都走wg. 如果没有代理所有公网流量这种需求,你的AllowedIPS直接写10.0.1.0/24就行了。如果还有问题,建议检查一下路由表。最后,因为你没有留下邮箱,这条回复你能不能看到就随缘了...

 Reply


ous50:

可以设置 docker port forwarding 为 127.0.0.1:xxxx,只填端口的话会默认变成0.0.0.0:xxxx

 Reply


cheng:

请问下如何配置可以通过wireguard其中一台客户端访问到服务端这台(10.8.0.1)的webui 而不是通过公网

 Reply


说了一堆废话。 没有任何卵用。笑而不语。。。:

说了一堆废话。 没有任何卵用。笑而不语。。。

 Reply


arounyf:

我自己也用wireguard有一段时间了,之前是在路由器(openwrt系统)上面配置的,但是管理和维护起来真的很麻烦,然后wg-easy又不能直接装路由器里面,最近组了一台itx服务器装了pve,划分一部分资源用来搭建wg-easy。然后昨天遇到了一个问题就是我在路由器的家庭内网网络下面无法与wireguard的客户端进行访问,而wg客户端可以访问内网的设备,不过还是解决了。看了你的文章深有感触,同时也为你点个赞,感谢你的分享

 Reply


请问你是如何解决的?:

arounyf said : 我自己也用wireguard有一段时间了,之前是在路由器(openwrt系统)上面配置的,但是管理和维护起来真的很麻烦,然后wg-easy又不能直接装路由器里面,最近组了一台itx服务器装了pve,划分一部分资源用来搭建wg-easy。然后昨天遇到了一个问题就是我在路由器的家庭内网网络下面无法与wireguard的客户端进行访问,而wg客户端可以访问内网的设备,不过还是解决了。看了你的文章深有感触,同时也为你点个赞,感谢你的分享

 Reply


arounyf:

arounyf said : 我自己也用wireguard有一段时间了,之前是在路由器(openwrt系统)上面配置的,但是管理和维护起来真的很麻烦,然后wg-easy又不能直接装路由器里面,最近组了一台itx服务器装了pve,划分一部分资源用来搭建wg-easy。然后昨天遇到了一个问题就是我在路由器的家庭内网网络下面无法与wireguard的客户端进行访问,而wg客户端可以访问内网的设备,不过还是解决了。看了你的文章深有感触,同时也为你点个赞,感谢你的分享
请问你是如何解决的? said :
请问你是如何解决的? said :
help said : 感谢大佬教程, 我在pve下的一个虚拟机(ip:192.168.10.22)中建了这个weejewel/wg-easy服务器,手机扫码后可以访问局域网中其他地址,如192.168.10.1、192.168.10.11等,但是不能访问192.168.10.22这台主机,是什么原因啊
怎么解决的

 Reply


123:

arounyf said : 我自己也用wireguard有一段时间了,之前是在路由器(openwrt系统)上面配置的,但是管理和维护起来真的很麻烦,然后wg-easy又不能直接装路由器里面,最近组了一台itx服务器装了pve,划分一部分资源用来搭建wg-easy。然后昨天遇到了一个问题就是我在路由器的家庭内网网络下面无法与wireguard的客户端进行访问,而wg客户端可以访问内网的设备,不过还是解决了。看了你的文章深有感触,同时也为你点个赞,感谢你的分享
大佬这个问题怎么解决的

 Reply


Json:

我的主路由是iKuai/ 192.168.1.1。开了192.168.1.2的12345端口(端口映射)给wireguard的udp用。然后wireguard-easy用docker装在PVE的LXC容器里面,ip地址是192.168.1.2。容器做了配置支持开启tun。然后手机端开局域网,使用数据扫描了二维码。死活握手不成功。手机客户端只有发送的很少的数据。接收数据是0。请问我还要在lxc容器里面做路由配置吗? 因为容器是debian12,它用的是nftables。然后我看到wireguard-easy自动配置的路由(PostUP)里面用的是iptables。是跟这个有关系吗?之后手动换成了iptables-nft,lxc的debian里面也装了iptables,可以使用iptables-nft。但还是不通。后来我又建了个alpine(因为它好像是用iptables的)安装了docker和docker-compose-plugin。再安装wireguard-easy。结果还是握手失败。请问我这个可能是啥问题?iKuai里面还需要做NAT吗?应该怎么配置?谢谢!

 Reply


restkhz:(admin)

Json said : 我的主路由是iKuai/ 192.168.1.1。开了192.168.1.2的12345端口(端口映射)给wireguard的udp用。然后wireguard-easy用docker装在PVE的LXC容器里面,ip地址是192.168.1.2。容器做了配置支持开启tun。然后手机端开局域网,使用数据扫描了二维码。死活握手不成功。手机客户端只有发送的很少的数据。接收数据是0。请问我还要在lxc容器里面做路由配置吗? 因为容器是debian12,它用的是nftables。然后我看到wireguard-easy自动配置的路由(PostUP)里面用的是iptables。是跟这个有关系吗?之后手动换成了iptables-nft,lxc的debian里面也装了iptables,可以使用iptables-nft。但还是不通。后来我又建了个alpine(因为它好像是用iptables的)安装了docker和docker-compose-plugin。再安装wireguard-easy。结果还是握手失败。请问我这个可能是啥问题?iKuai里面还需要做NAT吗?应该怎么配置?谢谢!
等等啊,那你手机在什么网络里呢?如果手机接收0字节那么基本确定没连上了。你是把1.2的udp:12345映射到了1.1上还是怎么?没懂。

 Reply


suyuanhu:

大佬你好,我现在想使用WireGuard来实现我的一些功能,并且我希望我的客户端配置的通过接口写入,或者写入文件,页面不是主要方式。那么WireGuard Easy是否可以实现呢,有没有更好的方案呢?

 Reply


suifeng:

我在云服务上搭建的wg服务端,假如他的ip是192.168.1.1,wg内网ip是10.0.8.1,我用192.168.1.1可以访问所有的服务,但是用10.0.8.1就只能访问他的ui

 Reply