607 日 , 2024 23:56:27
Unraid 无法远程访问 Web UI

家里某次停电,重启Unraid后,发现无法通过 ZeroTier 在外网访问 Unraid 的 Web 页面,但是可以通过IPV6地址直接访问。

在网上查阅资料后发现,其他的端口可以正常访问,是默认的 80 端口出现了问题。Unraid 的 Web 服务器默认监听 80 端口。

根据网上给出的解决方案,在“网络设置” 的 “Interface Extra” 中配置监听的网络接口,默认只监听内网接口 br0,这时只能内网访问。

需要在下方的网关设置中,找到 ZeroTier 网段的网关,类似“ztcfww5wot”(每个人都不一样),将它填入"Include listening interfaces"。

image-20240607235221201

进命令行,ifconfig。找到 zerotier,比如我是

image-20240607235326358
就是这串,ztcfww5wot

应用改动后 Unraid 就会同时监听内外网接口,可以通过 ZeroTier 访问 Web UI 了。 但是重启后仍然会重置网络配置,虽然"Include listening interfaces"中仍然还有“ztcfww5wot”,似乎不起作用了,需要删除,重新进行添加,注意删除后要先应用。

评论

  1. ABC
    Windows Chrome
    1 月前
    2025-2-22 10:14:41

    请问重启后无法通过zerotier容器访问web ui目前有新的解决方案吗?

    • 博主
      ABC
      Windows Edge
      1 月前
      2025-2-23 11:06:17

      我是通过我上面提到的方法就可以实现外网访问了,删除然后重新添加zerotier的监听接口,就可以了,其他的方法我也不清楚

  2. ABC
    Windows Chrome
    1 月前
    2025-2-22 10:49:28

    !/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命令获取

    local ip=$(ip -4 addr show $interface 2>/dev/null | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
    
    # 如果ip命令失败则尝试ifconfig
    if [ -z "$ip" ]; then
        ip=$(ifconfig $interface 2>/dev/null | awk '/inet / {print $2}' | cut -d: -f2)
    fi
    
    echo $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]?)$’

    if [[ $ip =~ $regex ]]; then
        return 0
    else
        return 1
    fi

    }

    自动检测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

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!