家里某次停电,重启Unraid后,发现无法通过 ZeroTier 在外网访问 Unraid 的 Web 页面,但是可以通过IPV6地址直接访问。
在网上查阅资料后发现,其他的端口可以正常访问,是默认的 80 端口出现了问题。Unraid 的 Web 服务器默认监听 80 端口。
根据网上给出的解决方案,在“网络设置” 的 “Interface Extra” 中配置监听的网络接口,默认只监听内网接口 br0,这时只能内网访问。
需要在下方的网关设置中,找到 ZeroTier 网段的网关,类似“ztcfww5wot”(每个人都不一样),将它填入"Include listening interfaces"。
进命令行,ifconfig。找到 zerotier,比如我是
就是这串,ztcfww5wot
应用改动后 Unraid 就会同时监听内外网接口,可以通过 ZeroTier 访问 Web UI 了。
请问重启后无法通过zerotier容器访问web ui目前有新的解决方案吗?
我是通过我上面提到的方法就可以实现外网访问了,删除然后重新添加zerotier的监听接口,就可以了,其他的方法我也不清楚
!/bin/bash
功能:修复Unraid重启后ZeroTier无法访问Web UI的问题(含IP自动检测)
作者:DeepSeek-R1
版本:v2.0
依赖:User Scripts插件、Docker服务
——————— 配置区 ———————
LOG_FILE=”/var/log/zerotier_fix.log” # 日志文件路径
ZEROTIER_CONTAINER=”zerotier” # ZeroTier容器名称
ZEROTIER_NETWORK=”192.168.193.0/24″ # ZeroTier分配的IP段
MAX_WAIT_DOCKER=300 # 等待Docker启动的最长时间(秒)
————— 高级设置(非必要勿改)————-
PRIMARY_INTERFACE=”br0″ # 主网络接口名称
—————————————————
初始化日志文件
echo “===== 脚本执行时间: $(date) =====” > $LOG_FILE
exec 2>>$LOG_FILE
发送通知到Unraid WebUI
notify -i “normal” -s “脚本启动” -d “开始修复ZeroTier访问问题…”
函数:从指定接口获取IPv4地址
get_interface_ip() {
local interface=$1
尝试使用ip命令获取
}
函数:验证IP格式
validate_ip() {
local ip=$1
local regex=’^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$’
}
自动检测UNRAID_LOCAL_IP
echo “[INFO] 正在检测网络接口 ${PRIMARY_INTERFACE} 的IP地址…” >> $LOG_FILE
UNRAID_LOCAL_IP=$(get_interface_ip $PRIMARY_INTERFACE)
if [ -n “$UNRAID_LOCAL_IP” ]; then
if validate_ip $UNRAID_LOCAL_IP; then
echo “[SUCCESS] 自动检测到IP: $UNRAID_LOCAL_IP” >> $LOG_FILE
else
echo “[ERROR] 检测到无效IP格式: $UNRAID_LOCAL_IP” >> $LOG_FILE
notify -i “alert” -s “IP异常” -d “接口${PRIMARY_INTERFACE} IP格式错误”
exit 1
fi
else
echo “[ERROR] 无法获取接口 ${PRIMARY_INTERFACE} 的IP,请检查:” >> $LOG_FILE
echo “1. 网络接口名称是否正确(当前配置:$PRIMARY_INTERFACE)” >> $LOG_FILE
echo “2. 是否已正确配置网络” >> $LOG_FILE
notify -i “alert” -s “网络错误” -d “接口${PRIMARY_INTERFACE} IP未找到”
exit 1
fi
函数:检查命令是否存在
check_command() {
if ! command -v $1 &>/dev/null; then
echo “[ERROR] 命令 $1 未安装,退出脚本.” >> $LOG_FILE
notify -i “alert” -s “依赖缺失” -d “$1 未安装”
exit 1
fi
}
检查必要命令
check_command “docker”
check_command “iptables”
等待Docker服务就绪
echo “[INFO] 等待Docker服务启动…” >> $LOG_FILE
timeout=$MAX_WAIT_DOCKER
while ! docker ps &>/dev/null && [ $timeout -gt 0 ]; do
sleep 5
timeout=$((timeout – 5))
done
if [ $timeout -le 0 ]; then
echo “[ERROR] Docker服务未在${MAX_WAIT_DOCKER}秒内启动,退出脚本.” >> $LOG_FILE
notify -i “alert” -s “服务超时” -d “Docker未就绪”
exit 1
fi
检查ZeroTier容器状态
echo “[INFO] 检查容器 ${ZEROTIER_CONTAINER} 状态…” >> $LOG_FILE
if ! docker inspect $ZEROTIER_CONTAINER &>> $LOG_FILE; then
echo “[ERROR] 容器 ${ZEROTIER_CONTAINER} 不存在,请检查名称.” >> $LOG_FILE
notify -i “alert” -s “容器异常” -d “${ZEROTIER_CONTAINER} 未找到”
exit 1
fi
确保容器处于运行状态
if [ “$(docker inspect -f ‘{{.State.Running}}’ $ZEROTIER_CONTAINER)” != “true” ]; then
echo “[WARN] 容器未运行,尝试启动…” >> $LOG_FILE
docker start $ZEROTIER_CONTAINER &>> $LOG_FILE
sleep 10
fi
添加iptables规则(幂等操作)
echo “[INFO] 配置iptables端口转发…” >> $LOG_FILE
iptables -t nat -C PREROUTING -s $ZEROTIER_NETWORK -p tcp –dport 80 -j DNAT –to-destination $UNRAID_LOCAL_IP:80 2>/dev/null
if [ $? -ne 0 ]; then
iptables -t nat -A PREROUTING -s $ZEROTIER_NETWORK -p tcp –dport 80 -j DNAT –to-destination $UNRAID_LOCAL_IP:80
echo “[SUCCESS] 添加iptables规则: ${ZEROTIER_NETWORK} -> ${UNRAID_LOCAL_IP}:80” >> $LOG_FILE
else
echo “[INFO] 规则已存在,跳过添加.” >> $LOG_FILE
fi
重启Nginx服务(强制重新绑定端口)
echo “[INFO] 重启Nginx服务…” >> $LOG_FILE
/etc/rc.d/rc.nginx restart &>> $LOG_FILE
最终状态检查
if [ $? -eq 0 ]; then
echo “[SUCCESS] 脚本执行完成!” >> $LOG_FILE
notify -i “normal” -s “修复成功” -d “WebUI应可通过ZeroTier访问”
else
echo “[ERROR] Nginx重启失败,请检查日志.” >> $LOG_FILE
notify -i “alert” -s “关键错误” -d “查看日志: ${LOG_FILE}”
exit 1
fi