#!/bin/sh # 99-custom.sh 就是immortalwrt固件首次启动时运行的脚本 位于固件内的/etc/uci-defaults/99-custom.sh # Log file for debugging LOGFILE="/etc/config/uci-defaults-log.txt" echo "Starting 99-custom.sh at $(date)" >>$LOGFILE # 设置默认防火墙规则,方便虚拟机首次访问 WebUI uci set firewall.@zone[1].input='ACCEPT' # 设置主机名映射,解决安卓原生 TV 无法联网的问题 uci add dhcp domain uci set "dhcp.@domain[-1].name=time.android.com" uci set "dhcp.@domain[-1].ip=203.107.6.88" # 检查配置文件pppoe-settings是否存在 该文件由build.sh动态生成 SETTINGS_FILE="/etc/config/pppoe-settings" if [ ! -f "$SETTINGS_FILE" ]; then echo "PPPoE settings file not found. Skipping." >>$LOGFILE else # 读取pppoe信息($enable_pppoe、$pppoe_account、$pppoe_password) . "$SETTINGS_FILE" fi # 计算网卡数量 count=0 ifnames="" for iface in /sys/class/net/*; do iface_name=$(basename "$iface") # 检查是否为物理网卡(排除回环设备和无线设备) if [ -e "$iface/device" ] && echo "$iface_name" | grep -Eq '^eth|^en'; then count=$((count + 1)) ifnames="$ifnames $iface_name" fi done # 删除多余空格 ifnames=$(echo "$ifnames" | awk '{$1=$1};1') # 网络设置 if [ "$count" -eq 1 ]; then # 单网口设备 类似于NAS模式 动态获取ip模式 具体ip地址取决于上一级路由器给它分配的ip 也方便后续你使用web页面设置旁路由 # 单网口设备 不支持修改ip 不要在此处修改ip 单网口采用dhcp模式 删除默认的192.168.1.1 uci set network.lan.proto='dhcp' uci delete network.lan.ipaddr uci delete network.lan.netmask uci delete network.lan.gateway uci delete network.lan.dns uci commit network elif [ "$count" -gt 1 ]; then # 提取第一个接口作为WAN wan_ifname=$(echo "$ifnames" | awk '{print $1}') # 剩余接口保留给LAN lan_ifnames=$(echo "$ifnames" | cut -d ' ' -f2-) # 设置WAN接口基础配置 uci set network.wan=interface # 提取第一个接口作为WAN uci set network.wan.device="$wan_ifname" # WAN接口默认DHCP uci set network.wan.proto='dhcp' # 设置WAN6绑定网口eth0 uci set network.wan6=interface uci set network.wan6.device="$wan_ifname" # 更新LAN接口成员 # 查找对应设备的section名称 section=$(uci show network | awk -F '[.=]' '/\.@?device\[\d+\]\.name=.br-lan.$/ {print $2; exit}') if [ -z "$section" ]; then echo "error:cannot find device 'br-lan'." >>$LOGFILE else # 删除原来的ports列表 uci -q delete "network.$section.ports" # 添加新的ports列表 for port in $lan_ifnames; do uci add_list "network.$section.ports"="$port" done echo "ports of device 'br-lan' are update." >>$LOGFILE fi # LAN口设置静态IP uci set network.lan.proto='static' # 多网口设备 支持修改为别的管理后台地址 在Github Action 的UI上自行输入即可 uci set network.lan.netmask='255.255.255.0' # 设置路由器管理后台地址 IP_VALUE_FILE="/etc/config/custom_router_ip.txt" if [ -f "$IP_VALUE_FILE" ]; then CUSTOM_IP=$(cat "$IP_VALUE_FILE") # 用户在UI上设置的路由器后台管理地址 uci set network.lan.ipaddr=$CUSTOM_IP echo "custom router ip is $CUSTOM_IP" >> $LOGFILE else uci set network.lan.ipaddr='192.168.100.1' echo "default router ip is 192.168.100.1" >> $LOGFILE fi # 判断是否启用 PPPoE echo "print enable_pppoe value=== $enable_pppoe" >>$LOGFILE if [ "$enable_pppoe" = "yes" ]; then echo "PPPoE is enabled at $(date)" >>$LOGFILE # 设置ipv4宽带拨号信息 uci set network.wan.proto='pppoe' uci set network.wan.username=$pppoe_account uci set network.wan.password=$pppoe_password uci set network.wan.peerdns='1' uci set network.wan.auto='1' # 设置ipv6 默认不配置协议 uci set network.wan6.proto='none' echo "PPPoE configuration completed successfully." >>$LOGFILE else echo "PPPoE is not enabled. Skipping configuration." >>$LOGFILE fi fi # 若安装了dockerd 则设置docker的防火墙规则 # 扩大docker涵盖的子网范围 '172.16.0.0/12' # 方便各类docker容器的端口顺利通过防火墙 if command -v dockerd >/dev/null 2>&1; then echo "检测到 Docker,正在配置防火墙规则..." FW_FILE="/etc/config/firewall" # 删除所有名为 docker 的 zone uci delete firewall.docker # 先获取所有 forwarding 索引,倒序排列删除 for idx in $(uci show firewall | grep "=forwarding" | cut -d[ -f2 | cut -d] -f1 | sort -rn); do src=$(uci get firewall.@forwarding[$idx].src 2>/dev/null) dest=$(uci get firewall.@forwarding[$idx].dest 2>/dev/null) echo "Checking forwarding index $idx: src=$src dest=$dest" if [ "$src" = "docker" ] || [ "$dest" = "docker" ]; then echo "Deleting forwarding @forwarding[$idx]" uci delete firewall.@forwarding[$idx] fi done # 提交删除 uci commit firewall # 追加新的 zone + forwarding 配置 cat <>"$FW_FILE" config zone 'docker' option input 'ACCEPT' option output 'ACCEPT' option forward 'ACCEPT' option name 'docker' list subnet '172.16.0.0/12' config forwarding option src 'docker' option dest 'lan' config forwarding option src 'docker' option dest 'wan' config forwarding option src 'lan' option dest 'docker' EOF else echo "未检测到 Docker,跳过防火墙配置。" fi # 设置所有网口可访问网页终端 uci delete ttyd.@ttyd[0].interface # 设置所有网口可连接 SSH uci set dropbear.@dropbear[0].Interface='' uci commit # 设置编译作者信息 FILE_PATH="/etc/openwrt_release" NEW_DESCRIPTION="Packaged by wukongdaily" sed -i "s/DISTRIB_DESCRIPTION='[^']*'/DISTRIB_DESCRIPTION='$NEW_DESCRIPTION'/" "$FILE_PATH" exit 0