AIO Ep14. Unraid 不用网关代理解决插件/ App 下载的网络问题

 

前言

最近升级了 HomeLab 的 Unraid 系统到最新的 6.11.5 版本(之前的破解方法也失效了, 新方法自行搜索), 许多插件和 Docker 容器在运行了半年后已经需要升级. 可是最近 GitHub 的访问质量越来越差, 升级时的网络问题还是需要解决. 然而 Unraid 系统设置系统代理相对复杂, 所以将我目前的解决方案记录在此.

Docker 容器更新方法

Docker 其实只需要换国内源即可解决更新缓慢甚至卡死 WebUI 的情况. 但 Unraid 重启时不保留配置文件(配置文件保存在 ramfs 中), 启动后大量 Docker 服务随之启动, 修改配置需要重启 Docker 较为繁琐, 可以在 /boot/config/go 文件开头加上如下内容在开机时换源.

1
2
3
4
5
6
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors" : ["https://hub-mirror.c.163.com", "https://mirror.baidubce.com"]
}
EOF

之后基于 Docker 的 App 或者自己添加的 Docker Image 更新时都不会遇到问题.

其他插件更新方式

现在很大一部分插件都是在 raw.githubusercontent.com 上下载的, 现在网上有的代理方法多为设置网关代理或修改 /boot/config/goemhttp 的启动指令, 添加 HTTP_PROXY 的环境变量.

这种方法的缺陷是修改网络设置和 HTTP_PROXY 的环境变量都十分繁琐且不灵活, 至少需要关闭虚拟机和所有 Docker 容器, 且对系统侵入性强.

之前还能使用修改 hosts 的方法连接到 raw.githubusercontent.com, 但现在修改 hosts 都不行了.

不过受到修改 hosts 的方法启发, 我想到了一种更好地代理特定网站的方法.

  1. 在任何一台 Unraid 能访问到的 Linux 主机上(无论是公网还是局域网), 运行如下 bash 脚本. (替换其中的 proxy 为一个能访问互联网的代理.)

    1
    2
    3
    4
    5
    while :
    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
  2. 修改 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/
如果本文给你带来了帮助或让你觉得有趣, 可以考虑赞助我¬_¬