缘起
自己的网络服务正在越来越多. 私有网盘, 札记, Todolist, 相册, 邮箱…甚至有账本, 密码管理工具等等.
如此多的私密服务让我感到十分不安, 因为这些服务我不得不远程使用,不得不跨越公网。而公网并不安全。
你或许听说过各种服务比如NextCloud, 某些管理软件, 摄像头等存在安全问题.当你读到这句话的时候, 这台服务器很可能就在被各种bot扫描. 而我的SMTP服务和ssh正在一刻不停的受到来自全球IP的暴力破解. 也就是说, 随着服务的增多, 暴露出的攻击面就越大, 我的个人信息越来越不安全. 并且, 我的服务器运行在我自己的住处, 被入侵后直接可以进入我日常生活的网络, 就像房间有陌生人能随意出入一样.
于是我使用了wireguard来保护我的通信. 我不再把内网服务暴露出来, 而是我在需要的时候自己进入内网.
但是随着设备的增加, 每次都需要生成秘钥, Copy秘钥到服务器, 写配置文件。 重复且繁琐的机械工作并不是一件愉快的事情. 于是我决定试着使用一下Wireguard管理面板:
Github: Wireguard-easy
功能
就我用下来的体会, 这并不是一个能把wg功能完全发挥出来开的项目, 而只是一个精巧的小工具. 对于日常组网来说够用。
这个项目依旧存在一些问题, UI功能并不完善. 我是在后面进行了一些修改后才达到了预期
所以, 某些场合这并非完全开箱即用, 各位读者请多考虑.
- 提供密码保护的web UI, UI设计美观.
- 自动创建带有preshared-key的配置文件, 可以使用二维码扫描或者下载配置文件的方式获取配置信息.
- 可以随时启用禁用某个客户端.
其缺点:
- 功能就以上那些了, 没了, 对.
- 不能在配置文件中轻松配置访问来源, 也就是说, 这个web UI默认也是面向公网. 防护仅靠你设置的密码. 没有2FA. 那么你必须需要一个相当长,复杂且无规律的密码. (其实可以解决, 看后文)
- udp端口配置依旧存在缺陷, docker-compose.yml中修改后并没有什么作用. WEB UI端口实际上在
config.js
留了参数但是并没有在文档中公开.(有没有用不知道, 希望这里我没弄错. 但是也有别的方法可以解决这个问题.) - 创建客户端后无法在其UI编辑任何信息, 包括tag.
- 无法在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配置)
迁移,导入原来的密钥
想用起来的过程并不是非常顺利. 由于我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。
Comments
站元素主机:
赞一个 感谢分享
Replyseverus:
赞一个
Replyhelp:
感谢大佬教程, 我在pve下的一个虚拟机(ip:192.168.10.22)中建了这个weejewel/wg-easy服务器,手机扫码后可以访问局域网中其他地址,如192.168.10.1、192.168.10.11等,但是不能访问192.168.10.22这台主机,是什么原因啊
Replyrestkhz:(admin)
ereal:
感谢大佬教程。请问,在管理页面设置了用户xyz之后,生成的xyz.conf,直接下载使用,但很想知道xyz.conf的存放位置,我找了很久也没有找到。先谢谢大佬!
Replyrestkhz:(admin)
ereal:
restkhz:(admin)
xiaoyi:
restkhz:(admin)
ous50:
可以设置 docker port forwarding 为 127.0.0.1:xxxx,只填端口的话会默认变成0.0.0.0:xxxx
Replycheng:
请问下如何配置可以通过wireguard其中一台客户端访问到服务端这台(10.8.0.1)的webui 而不是通过公网
Reply说了一堆废话。 没有任何卵用。笑而不语。。。:
说了一堆废话。 没有任何卵用。笑而不语。。。
Replyarounyf:
我自己也用wireguard有一段时间了,之前是在路由器(openwrt系统)上面配置的,但是管理和维护起来真的很麻烦,然后wg-easy又不能直接装路由器里面,最近组了一台itx服务器装了pve,划分一部分资源用来搭建wg-easy。然后昨天遇到了一个问题就是我在路由器的家庭内网网络下面无法与wireguard的客户端进行访问,而wg客户端可以访问内网的设备,不过还是解决了。看了你的文章深有感触,同时也为你点个赞,感谢你的分享
Reply请问你是如何解决的?:
arounyf:
123:
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吗?应该怎么配置?谢谢!
Replyrestkhz:(admin)
suyuanhu:
大佬你好,我现在想使用WireGuard来实现我的一些功能,并且我希望我的客户端配置的通过接口写入,或者写入文件,页面不是主要方式。那么WireGuard Easy是否可以实现呢,有没有更好的方案呢?
Replysuifeng:
我在云服务上搭建的wg服务端,假如他的ip是192.168.1.1,wg内网ip是10.0.8.1,我用192.168.1.1可以访问所有的服务,但是用10.0.8.1就只能访问他的ui
Reply