缘起
自己的网络服务正在越来越多. 私有网盘, 札记, Todolist, 相册, 邮箱…甚至有账本, 密码管理工具等等.
如此多的私密服务让我感到十分不安, 因为之前他们中的一部分曾经被我映射到公网上进行使用. 而公网危机四伏. 当你读到这句话的时候, 这台服务器很可能就在被各种扫描器从各种角度”视奸”. 而我的SMTP服务正在一刻不停的受到来自全球IP的暴力破解. 也就是说, 随着服务的增多, 攻击面的扩大, 我的个人信息越来越不安全. 并且, 我的服务器运行在我自己的住处, 被入侵后直接可以进入我日常生活的网络, 就像房间有陌生人能随意出入一样.
于是我使用了wireguard来保护我的通信. 我不再把内网服务暴露出来, 而是我在需要的时候自己进入内网.
但是随着设备的增加, 每次生成秘钥, Copy秘钥, 重复且繁琐的机械工作并不是一件愉快的事情. 于是我决定试着使用一下Wireguard管理面板:
Github: Wireguard-easy

功能
就我用下来的体会, 这并不是一个成熟完善的项目, 而只是一个精巧的小工具.
这个项目依旧存在一些问题, 功能并不完善. 我是在后面进行了一些修改后才达到了预期
所以, 这并非开箱即用, 各位读者请多考虑.
- 提供密码保护的web UI, UI设计美观.
- 自动创建带有preshared-key的配置文件, 可以使用二维码扫描或者下载配置文件的方式获取配置信息.
- 可以随时启用禁用某个客户端.

其缺点:
- 功能就以上那些了, 没了, 对.
- 不能在配置文件中轻松配置访问来源, 也就是说, 这个web UI默认也是面向公网. 防护仅靠你设置的密码. 那么你必须需要一个相当长,复杂且无规律的密码. (其实可以解决, 看后文)
- udp端口配置依旧存在缺陷, docker-compose.yml中修改后并没有什么作用. WEB UI端口实际上在
config.js
留了参数但是并没有在文档中公开.(有没有用不知道, 希望这里我没弄错. 但是也有别的方法可以解决这个问题.) - 创建客户端后无法在其UI编辑任何信息, 包括tag.
- 无法在WebUI中手动指定其静态IP, 此外, 除非下载, 或者你可以直接阅读二维码, 那么你甚至不知道其生成的IP到底是什么. 这点对于内网组网相当的不友好.
综上, 和Subspace比起来, 读者, 就是你, 安装哪个请自行考量. 对于我嘛, 又不是不能用
安装
如果你已经安装好了 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"
解决的这个问题.
Wireguard: Address unreachable 问题
这个被我遗忘了, 不得不提一下, 在服务器上需要设置一下PersistentKeepalive
这一项.
Wireguard-easy居然也没有生成这个. (懒得吐槽了)
因为我的服务器在我自己房间里, 在NAT和防火墙之后. 因为长时间没有流量的时候会被NAT”遗忘”而造成Address unreachable, 导致服务器”消失了”. 不过别的终端这点无所谓.
请参见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的, 所以只能进入内网才能访问WebUI.
此时你甚至可以在宿主机屏蔽掉所有端口, 仅仅暴露一个不起眼的, 随意的UDP端口.
到这里, 我的目的已经达到了. 现在我们可以把分布在异地的服务都保护在了自己的内网之中. 把一扇扇门堵上, 指留一扇小小的UDP防盗门.
嗯,
“又不是不能用”
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)