前言
最近升级了 HomeLab 的 Unraid 系统到最新的 6.11.5
版本(之前的破解方法也失效了, 新方法自行搜索), 许多插件和 Docker 容器在运行了半年后已经需要升级. 可是最近 GitHub 的访问质量越来越差, 升级时的网络问题还是需要解决. 然而 Unraid 系统设置系统代理相对复杂, 所以将我目前的解决方案记录在此.
Docker 容器更新方法
Docker 其实只需要换国内源即可解决更新缓慢甚至卡死 WebUI 的情况. 但 Unraid 重启时不保留配置文件(配置文件保存在 ramfs 中), 启动后大量 Docker 服务随之启动, 修改配置需要重启 Docker 较为繁琐, 可以在 /boot/config/go
文件开头加上如下内容在开机时换源.
1 | mkdir -p /etc/docker |
之后基于 Docker 的 App 或者自己添加的 Docker Image 更新时都不会遇到问题.
其他插件更新方式
现在很大一部分插件都是在 raw.githubusercontent.com
上下载的, 现在网上有的代理方法多为设置网关代理或修改 /boot/config/go
下 emhttp
的启动指令, 添加 HTTP_PROXY
的环境变量.
这种方法的缺陷是修改网络设置和 HTTP_PROXY
的环境变量都十分繁琐且不灵活, 至少需要关闭虚拟机和所有 Docker 容器, 且对系统侵入性强.
之前还能使用修改 hosts 的方法连接到 raw.githubusercontent.com
, 但现在修改 hosts 都不行了.
不过受到修改 hosts 的方法启发, 我想到了一种更好地代理特定网站的方法.
在任何一台 Unraid 能访问到的 Linux 主机上(无论是公网还是局域网), 运行如下 bash 脚本. (替换其中的 proxy 为一个能访问互联网的代理.)
1
2
3
4
5while :
do
echo Waiting for a new connection...
ncat -l -p 443 -c "ncat --proxy-type socks5 --proxy x.x.x.x:xxxx raw.githubusercontent.com 443"
done修改 Unraid 的 hosts, 添加如下一条, 其中
a.b.c.d
是刚刚运行脚本的机器 ip.1
a.b.c.d raw.githubusercontent.com
这样所有 Unraid 对 raw.githubusercontent.com
的访问就会连接到 a.b.c.d
这个 ip, 随后使用 netcat
将其通过 socks 代理转发到目标服务器, 就不会影响 Unraid 其他的网络连接.
这样的缺点是每个特定的域名都要一个 ip, 一台电脑只能为一个域名创建转发, 不过在这个场景下也是足够了, 如果有其他网址的代理需求也可以如法炮制.
题外话: 产生了一个非常有趣的想法, 其实这种代理方式可以进行拓展, 比如在手机(轻量使用场景, 仅 HTTP)上将需要代理的几个域名指向自己的服务器, 服务器在 443 端口监听后根据 TLS ClientHello 中的 SNI 向真正的服务器转发整个 TLS 连接. 就不必在手机上运行代理客户端了.
本文采用 CC BY-NC-SA 4.0 许可协议发布.
作者: lyc8503, 文章链接: https://blog.lyc8503.net/post/14-unraid-proxy-using-dns/
如果本文给你带来了帮助或让你觉得有趣, 可以考虑赞助我¬_¬