前言
Unraid从 7.0.0 版本开始自带 Outgoing Proxy Manager,记得某个版本后具有“检测”功能,先会检测代理可用才能选择。
近期使用了openwrt新固件,发现代理处于offline状态,在代理端一番排查后没能解决问题,之后发现可能由于❓问题会令该代理检查的链接指向回环地址,变得“不可达”,实际上代理是可用的。
本文是提供多一个选择,可以解决unraid的代理online检测,也可以自行另外选择彻底找到并解决代理端的问题。
测试环境
- Linux 6.12.24-Unraid 7.1.4
问题导致
代理选择
状态显示Not Available或Offline
在选择代理中disabled,不可选
插件更新
插件检查更新前
状态显示不可达
点击插件-检查更新,直接返回没有响应
点击完成,重新加载后
正常检查到插件更新状态,并且更新插件也是可以正常更新,即代理实际是可用
尝试
在OutgoingProxy页面刷新时可以在代理端的logs有一个新增请求
25-09-02 15:56:57[ warn ][TCP] dial 🎯 全球直连 (match DomainSuffix/msftncsi.com) 192.168.100.11:42304(clash_meta) --> www.msftncsi.com:80 error: reject loopback connection to: www.msftncsi.com:80
目标被解析为回环地址(loopback),但明明走的应该是直连
于是在代理端一番排查,最后依然如此
unraid端解决方法
修改相关文件,令其使用别的网络连接检测链接,例如
# apple
http://captive.apple.com
# cloudflare
http://1.1.1.1/cdn-cgi/trace
# firefox
https://detectportal.firefox.com/success.txt
# 甚至ytb
涉及的两个文件
# outgoingproxy
-rw-r--r-- 1 root root 5856 Sep 2 15:03 /usr/local/emhttp/plugins/dynamix/include/OutgoingProxyLib.php
# 插件更新查询
-rw-r--r-- 1 root root 10377 Sep 2 06:34 /usr/local/emhttp/plugins/dynamix/include/Wrappers.php
修改
修改前备份
cp -a /usr/local/emhttp/plugins/dynamix/include/OutgoingProxyLib.php /usr/local/emhttp/plugins/dynamix/include/OutgoingProxyLib.php.bak
cp -a /usr/local/emhttp/plugins/dynamix/include/Wrappers.php /usr/local/emhttp/plugins/dynamix/include/Wrappers.php.bak
修改OutgoingProxyLib.php
nano /usr/local/emhttp/plugins/dynamix/include/OutgoingProxyLib.php
源代码62行左右
/* Check to see if the proxy is online and available. */
function proxy_online($proxyUrl) {
$rc = true;
if ($proxyUrl) {
/* Initialize cURL session. */
$ch = curl_init("http://www.msftncsi.com/ncsi.txt");
/* Set cURL options. */
......
此函数判断online的方式为:
- 能否通过该代理成功访问
http://www.msftncsi.com/ncsi.txt
并获得响应(无论内容是什么)
不验证内容或状态码,所以可以直接换成其它链接
/* Check to see if the proxy is online and available. */
function proxy_online($proxyUrl) {
$rc = true;
if ($proxyUrl) {
/* Initialize cURL session. */
// $ch = curl_init("http://www.msftncsi.com/ncsi.txt");
$ch = curl_init("http://captive.apple.com");
/* Set cURL options. */
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3); /* Timeout in seconds. */
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, true);
curl_setopt($ch, CURLOPT_PROXY, $proxyUrl); /* Url is a proxy. */
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); /* Return transfer as a string. */
/* Execute cURL request. */
$response = curl_exec($ch);
if ($response === false) {
/* Proxy is not available. */
$rc = false;
}
/* Close cURL session. */
curl_close($ch);
}
return ($rc);
}
注释原来的并加上新的代码
保存,退出
unraid OutgoingProxy页面刷新
没有不可用的提示了
修改Wrappers.php
nano /usr/local/emhttp/plugins/dynamix/include/Wrappers.php
源代码262行左右,可以直接拉到底
/**
* Detect network connectivity via Network Connectivity Status Indicator
* @return bool
*/
function check_network_connectivity(): bool {
$url = 'http://www.msftncsi.com/ncsi.txt';
$out = http_get_contents($url);
return ($out=="Microsoft NCSI");
}
此函数有对请求结果内容进行判断,微软的NCSI服务返回的是txt,内容纯为Microsoft NCSI
以http://captive.apple.com举例,返回的是html
<HTML><HEAD><TITLE>Success</TITLE></HEAD><BODY>Success</BODY></HTML>
所以需要一些修改
/**
* Detect network connectivity via Network Connectivity Status Indicator
* @return bool
*/
function check_network_connectivity_bak(): bool {
$url = 'http://www.msftncsi.com/ncsi.txt';
$out = http_get_contents($url);
return ($out=="Microsoft NCSI");
}
function check_network_connectivity(): bool {
$url = 'http://captive.apple.com';
$out = http_get_contents($url);
return str_contains($out, "Success");
}
根据内容是否含有Success
判断,将原来的函数改其它名备份,新增函数使用原来的函数名
保存,退出
unraid 插件页面点击检查更新,可以正常检查状态
结束