Loading

openwrt 首次启动脚本--无线中继

主要实现:

管理员密码设置

主机名设置

时区设置

无线连接上级wifi,同时支持ipv4 ipv6两个网络接口,设置防火墙

桥接lan wifi中继

关闭LAN接口DHCP,

关闭dnsmasq,

本例上级wifi是192.168.2.0/24网段

 

#luci-i18n-package-manager-zh-cn luci-i18n-base-zh-cn luci-i18n-firewall-zh-cn relayd luci-proto-relay

#!/bin/sh

##############################################
# 集中式变量配置区(所有可调参数在此设置)
##############################################

### 系统基础配置 ###
ROOT_PASSWORD="12345678"     # 管理员密码
NETWORK_HOSTNAME="openwrt-print" # 设备主机名
TIMEZONE="UTC+8"               # 时区设置
ZONENAME="Asia/Shanghai"       # 时区名称

### 无线客户端配置 ###
WIFI_SSID='Openwrt_2.4G'       # 上级WiFi名称
WIFI_ENCRYPTION='psk2'         # 加密方式
WIFI_DEVICE='radio0'           # 无线设备名称
WIFI_BSSID='AA:BB:CC:DD:EE:FF' # 上级AP的MAC地址
WIFI_KEY='12345678'         # WiFi连接密码
WIFI_IFNAME='WifiClient'       # 无线接口名称
WIFI_NETWORK_v4='wlan4'        # 关联的网络接口
WIFI_NETWORK_v6='wlan6'        # 关联的网络接口

### 中继配置 ###
RELAY_PROTO='relay'           # 中继协议类型
RELAY_IP='192.168.2.3'        # 中继IP地址(上游网段,不冲突地址)
RELAY_NETMASK='255.255.255.0' # 中继子网掩码
RELAY_IFNAME='relay'          # 中继接口名称
RELAY_LOCAL_IFNAME='lan'      # 本地接口名称

### 防火墙配置 ###
FIREWALL_ZONE='lan'       # 目标防火墙区域

### 日志配置 ###
LOG_FILE="/root/deploy.log"    # 操作日志路径

##############################################
# 初始化核心逻辑(非必要请勿修改)
##############################################

### 函数定义 ###

# 简易日志记录(同时输出到控制台和日志文件)
log() {
  local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
  echo "[$timestamp] $1" | tee -a "$LOG_FILE"
}

# 错误处理函数
die() {
  log "执行失败:$1 (错误码:$2)"
  echo "! 初始化失败,请检查 $LOG_FILE !" >&2
  exit $2
}

### 执行流程 ###

log "=== 开始执行OpenWrt网络初始化脚本 ==="

##############################################
# 阶段 1/4:系统基础配置
##############################################
log "--- 阶段1/4:配置系统参数 ---"

# 设置root密码
if [ -n "${ROOT_PASSWORD}" ]; then
  if ! (echo -e "${ROOT_PASSWORD}\n${ROOT_PASSWORD}" | passwd root 2>&1 | tee -a "$LOG_FILE"); then
    die "密码设置失败,请检查复杂度" 101
  fi
  log "系统管理员密码已更新"
fi

# 配置基础系统参数
uci batch <<EOF 2>&1 | tee -a "$LOG_FILE" || die "系统参数写入失败" 102
set system.@system[0].hostname='${NETWORK_HOSTNAME}'
set system.@system[0].timezone='${TIMEZONE}'
set system.@system[0].zonename='${ZONENAME}'
commit
EOF
log "系统主机名与时区配置完成"

##############################################
# 阶段 2/4:无线客户端配置
##############################################
log "--- 阶段2/4:配置无线客户端 ---"

# 创建网络接口
uci set network.${WIFI_NETWORK_v4}=interface || die "创建IPv4接口失败" 201
uci set network.${WIFI_NETWORK_v4}.proto='static'
uci set network.${WIFI_NETWORK_v4}.ipaddr="${RELAY_IP}"
uci set network.${WIFI_NETWORK_v4}.netmask="${RELAY_NETMASK}"

uci set network.${WIFI_NETWORK_v6}=interface || die "创建IPv6接口失败" 202
uci set network.${WIFI_NETWORK_v6}.proto='dhcpv6'
uci set network.${WIFI_NETWORK_v6}.reqaddress='try'
uci set network.${WIFI_NETWORK_v6}.reqprefix='auto'
uci set network.${WIFI_NETWORK_v6}.norelease='1'
log "网络接口wlan4/wlan6初始化完成"

# 配置无线设备
uci set wireless.${WIFI_DEVICE}.disabled='0' || die "启用无线设备失败" 203
uci set wireless.${WIFI_DEVICE}.cell_density='0'

# 配置STA模式
uci set wireless.default_${WIFI_DEVICE}.disabled='0'
uci set wireless.default_${WIFI_DEVICE}.mode='sta'
uci set wireless.default_${WIFI_DEVICE}.bssid="${WIFI_BSSID}"
uci set wireless.default_${WIFI_DEVICE}.ifname="${WIFI_IFNAME}"
uci set wireless.default_${WIFI_DEVICE}.ipv6='1'
uci set wireless.default_${WIFI_DEVICE}.device="${WIFI_DEVICE}"
uci set wireless.default_${WIFI_DEVICE}.ssid="${WIFI_SSID}"
uci set wireless.default_${WIFI_DEVICE}.encryption="${WIFI_ENCRYPTION}"
uci set wireless.default_${WIFI_DEVICE}.key="${WIFI_KEY}"
uci set wireless.default_${WIFI_DEVICE}.network="${WIFI_NETWORK_v4} ${WIFI_NETWORK_v6}"
log "无线客户端配置完成(SSID:${WIFI_SSID})"

##############################################
# 阶段 3/4:中继桥配置
##############################################
log "--- 阶段3/4:配置中继桥接 ---"

# 创建中继接口
uci set network.${RELAY_IFNAME}=interface || die "创建中继接口失败" 301
uci set network.${RELAY_IFNAME}.proto="${RELAY_PROTO}"
uci set network.${RELAY_IFNAME}.ipaddr="${RELAY_IP}"
uci set network.${RELAY_IFNAME}.netmask="${RELAY_NETMASK}"

# 绑定桥接网络
uci add_list network.${RELAY_IFNAME}.network="${RELAY_LOCAL_IFNAME}"
uci add_list network.${RELAY_IFNAME}.network="${WIFI_NETWORK_v4}"
uci add_list network.${RELAY_IFNAME}.network="${WIFI_NETWORK_v6}"
log "中继桥接规则已绑定"

##############################################
# 阶段 4/4:防火墙与服务配置
##############################################
log "--- 阶段4/4:配置防火墙策略 ---"

# 调整防火墙区域
uci add_list firewall.@zone[0].network="${WIFI_NETWORK_v4}" || die "防火墙配置失败" 401
uci add_list firewall.@zone[0].network="${WIFI_NETWORK_v6}"

# 删除防火墙区域wan
uci delete firewall.@zone[1]

# 禁用LAN DHCP
uci set dhcp.lan.ignore='1'

# 禁用dnsmasq
/etc/init.d/dnsmasq disable && log "已禁用DNSmasq服务"
/etc/init.d/dnsmasq stop && log "已停止DNSmasq进程"

# 提交配置变更
uci commit || die "配置提交失败" 402
log "所有配置已提交"

# 重启防火墙
service firewall restart || die "防火墙重启失败" 403
log "防火墙服务已重启"


##############################################
# 完成提示
##############################################
log "=== 网络初始化脚本执行完毕 ==="
echo "----------------------------------------"
echo "  执行结果:"
echo "  中继IP:$RELAY_IP"
echo "  日志路径:$LOG_FILE"
echo "----------------------------------------"
exit 0

 

 更新一下最新使用的版本

1、更灵活的参数区
加入 VERSION 常量、拆分 IPv4/IPv6/管理地址等变量,日志路径默认改到 /var/log/deploy.log 并自动建目录。
2、脚本结构模块化
以 configure_system / configure_wireless_client / configure_relay_bridge / configure_firewall / configure_luci_print_service 五大函数串联在 main(),每段日志自解释。
3、无线客户端与中继桥
继续创建 wlan4/wlan6,站点模式 IPv6 保持开启,中继接口和防火墙 zone 同时绑定 IPv4、IPv6 用于桥接上游地址。
4、防火墙与服务调整
逐项删除 wan zone 及其转发、规则、端口映射。
禁用下游 DHCP/DHCPv6/NDP,清空 ula_prefix,防止分发 ULA 或 DHCPv6 租约。
禁用并停止 dnsmasq,提交后直接 firewall restart。
加入阶段日志 4/5-1~4,便于定位执行过程。
5、打印服务
仍启用 p910nd,失败时仅记录日志。
6、容错策略
passwd 仅在设定密码时执行,空密码情形明确记录;其他写值失败只输出日志,不再 die 终止。
7、备用管理IP
唯一的网络接口,可以使用192.168.100.1进行管理,虽然没有DHCP,也可以在桥接失败的情况下,强制设置本机IP192.168.100.2,通过192.168.100.1进行管理。

#luci-i18n-package-manager-zh-cn luci-i18n-base-zh-cn luci-i18n-firewall-zh-cn relayd luci-proto-relay p910nd luci-app-p910nd luci-i18n-p910nd-zh-cn
#!/bin/sh

##############################################
# 集中式变量配置区(所有可调参数在此设置)
##############################################

VERSION=2.0

### 系统基础配置 ###
ROOT_PASSWORD=""         # 管理员密码
NETWORK_HOSTNAME="openwrt-print" # 设备主机名
TIMEZONE="UTC+8"                 # 时区设置
ZONENAME="Asia/Shanghai"         # 时区名称

### 无线客户端配置 ###
WIFI_SSID='Openwrt_2.4G'         # 上级WiFi名称
WIFI_ENCRYPTION='sae-mixed'      # 加密方式
WIFI_DEVICE='radio0'             # 无线设备名称
WIFI_BSSID='AA:BB:CC:DD:EE:FF'   # 上级AP的MAC地址
WIFI_KEY='1234567890'            # WiFi连接密码
WIFI_IFNAME='WifiClient'         # 无线接口名称
WIFI_NETWORK_v4='wlan4'          # 关联的网络接口
WIFI_NETWORK_v6='wlan6'          # 关联的网络接口

### 中继配置 ###
RELAY_PROTO='relay'             # 中继协议类型
RELAY_IP='192.168.2.3'          # 中继IP地址(上游网段,不冲突地址)
RELAY_NETMASK='255.255.255.0'   # 中继子网掩码
RELAY_IFNAME='relay'            # 中继接口名称
RELAY_LOCAL_IFNAME='lan'        # 本地接口名称
MGMT_IP='192.168.100.1'         # 本地管理地址
MGMT_NETMASK='255.255.255.0'    # 本地管理子网掩码

### 防火墙配置 ###
FIREWALL_ZONE='lan'             # 目标防火墙区域

### 日志配置 ###
LOG_FILE="/var/log/deploy.log"    # 操作日志路径

# 确保日志目录存在
LOG_DIR="$(dirname "$LOG_FILE")"
[ -d "$LOG_DIR" ] || mkdir -p "$LOG_DIR"

# 简易日志记录(同时输出到控制台和日志文件)
log() {
  local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
  echo "[$timestamp] $1" | tee -a "$LOG_FILE"
}

configure_system() {
  log "--- 阶段1/5:配置系统参数 ---"

  if [ -n "${ROOT_PASSWORD}" ]; then
    echo -e "${ROOT_PASSWORD}\n${ROOT_PASSWORD}" | passwd root 2>&1 | tee -a "$LOG_FILE"
    log "系统管理员密码已更新"
  else
    log "保持 root 默认空密码"
  fi

  uci set system.@system[0].hostname="${NETWORK_HOSTNAME}"
  uci set system.@system[0].timezone="${TIMEZONE}"
  uci set system.@system[0].zonename="${ZONENAME}"
  uci commit system
  log "系统主机名与时区配置完成"

  log "--- 附加:配置本地管理地址 ---"
  uci set network.${RELAY_LOCAL_IFNAME}.proto='static'
  uci set network.${RELAY_LOCAL_IFNAME}.ipaddr="${MGMT_IP}"
  uci set network.${RELAY_LOCAL_IFNAME}.netmask="${MGMT_NETMASK}"
  uci set network.${RELAY_LOCAL_IFNAME}.gateway=''
  uci set network.${RELAY_LOCAL_IFNAME}.dns=''
  log "本地接口 ${RELAY_LOCAL_IFNAME} 已设置为 ${MGMT_IP}/${MGMT_NETMASK}"
}

configure_wireless_client() {
  log "--- 阶段2/5:配置无线客户端 ---"

  uci set network.${WIFI_NETWORK_v4}=interface
  uci set network.${WIFI_NETWORK_v4}.proto='static'
  uci set network.${WIFI_NETWORK_v4}.ipaddr="${RELAY_IP}"
  uci set network.${WIFI_NETWORK_v4}.netmask="${RELAY_NETMASK}"

  uci set network.${WIFI_NETWORK_v6}=interface
  uci set network.${WIFI_NETWORK_v6}.proto='dhcpv6'
  uci set network.${WIFI_NETWORK_v6}.reqaddress='try'
  uci set network.${WIFI_NETWORK_v6}.reqprefix='auto'
  uci set network.${WIFI_NETWORK_v6}.norelease='1'
  log "网络接口wlan4/wlan6初始化完成"

  uci set wireless.${WIFI_DEVICE}.disabled='0'
  uci set wireless.${WIFI_DEVICE}.cell_density='0'

  uci set wireless.default_${WIFI_DEVICE}.disabled='0'
  uci set wireless.default_${WIFI_DEVICE}.mode='sta'
  uci set wireless.default_${WIFI_DEVICE}.bssid="${WIFI_BSSID}"
  uci set wireless.default_${WIFI_DEVICE}.ifname="${WIFI_IFNAME}"
  uci set wireless.default_${WIFI_DEVICE}.ipv6='1'
  uci set wireless.default_${WIFI_DEVICE}.device="${WIFI_DEVICE}"
  uci set wireless.default_${WIFI_DEVICE}.ssid="${WIFI_SSID}"
  uci set wireless.default_${WIFI_DEVICE}.encryption="${WIFI_ENCRYPTION}"
  uci set wireless.default_${WIFI_DEVICE}.key="${WIFI_KEY}"
  uci set wireless.default_${WIFI_DEVICE}.network="${WIFI_NETWORK_v4} ${WIFI_NETWORK_v6}"
  log "无线客户端配置完成(SSID:${WIFI_SSID})"
}

configure_relay_bridge() {
  log "--- 阶段3/5:配置中继桥接 ---"

  uci set network.${RELAY_IFNAME}=interface
  uci set network.${RELAY_IFNAME}.proto="${RELAY_PROTO}"
  uci set network.${RELAY_IFNAME}.ipaddr="${RELAY_IP}"
  uci set network.${RELAY_IFNAME}.netmask="${RELAY_NETMASK}"

  uci add_list network.${RELAY_IFNAME}.network="${RELAY_LOCAL_IFNAME}"
  uci add_list network.${RELAY_IFNAME}.network="${WIFI_NETWORK_v4}"
  uci add_list network.${RELAY_IFNAME}.network="${WIFI_NETWORK_v6}"
  log "中继桥接规则已绑定"
}

configure_firewall() {
  log "--- 阶段4/5-1:绑定接口到防火墙 zone ---"
  uci add_list firewall.@zone[0].network="${WIFI_NETWORK_v4}"
  uci add_list firewall.@zone[0].network="${WIFI_NETWORK_v6}"

  log "--- 阶段4/5-2:删除 WAN 区域及相关规则 ---"
  local section name
  for section in $(uci -q show firewall | grep '=zone$' | cut -d. -f2 | cut -d= -f1); do
    name="$(uci -q get firewall.$section.name 2>/dev/null || echo "")"
    if [ "$name" = "wan" ]; then
      uci delete firewall.$section
      log "已删除防火墙区域 wan ($section)"
    fi
  done

  local idx=0 src dest
  while uci -q get firewall.@forwarding[$idx] >/dev/null 2>&1; do
    src="$(uci -q get firewall.@forwarding[$idx].src 2>/dev/null)"
    dest="$(uci -q get firewall.@forwarding[$idx].dest 2>/dev/null)"
    if [ "$src" = "wan" ] || [ "$dest" = "wan" ]; then
      uci delete firewall.@forwarding[$idx]
      log "已删除防火墙转发规则(@forwarding[$idx]):src=$src dest=$dest"
      continue
    fi
    idx=$((idx + 1))
  done

  idx=0
  while uci -q get firewall.@rule[$idx] >/dev/null 2>&1; do
    src="$(uci -q get firewall.@rule[$idx].src 2>/dev/null)"
    dest="$(uci -q get firewall.@rule[$idx].dest 2>/dev/null)"
    if [ "$src" = "wan" ] || [ "$dest" = "wan" ]; then
      uci delete firewall.@rule[$idx]
      log "已删除防火墙规则(@rule[$idx]):src=$src dest=$dest"
      continue
    fi
    idx=$((idx + 1))
  done

  idx=0
  while uci -q get firewall.@redirect[$idx] >/dev/null 2>&1; do
    src="$(uci -q get firewall.@redirect[$idx].src 2>/dev/null)"
    dest="$(uci -q get firewall.@redirect[$idx].dest 2>/dev/null)"
    if [ "$src" = "wan" ] || [ "$dest" = "wan" ]; then
      uci delete firewall.@redirect[$idx]
      log "已删除防火墙端口转发(@redirect[$idx]):src=$src dest=$dest"
      continue
    fi
    idx=$((idx + 1))
  done

  log "--- 阶段4/5-3:写入防火墙默认策略 ---"
  uci -q delete firewall.@defaults[0].syn_flood
  uci set firewall.@defaults[0].synflood_protect='1'

  uci set dhcp.lan.ignore='1'
  uci set dhcp.lan.ra='disabled'
  uci set dhcp.lan.dhcpv6='disabled'
  uci set dhcp.lan.ndp='disabled'
  uci set network.globals.ula_prefix=''

  /etc/init.d/dnsmasq disable && log "已禁用DNSmasq服务"
  /etc/init.d/dnsmasq stop && log "已停止DNSmasq进程"

  log "--- 阶段4/5-4:提交并重载防火墙配置 ---"
  uci commit
  log "所有配置已提交"

  (/etc/init.d/firewall restart 2>&1 | tee -a "$LOG_FILE") || log "防火墙脚本重启时出现错误"
  log "防火墙服务已重新加载"
}

configure_luci_print_service() {
  log "--- 阶段5/5:启用 LuCI 打印服务 ---"
  uci set p910nd.@p910nd[0].enabled='1'
  uci commit p910nd
  (/etc/init.d/p910nd enable 2>&1 | tee -a "$LOG_FILE") || log "启用 p910nd 自启动失败"
  (/etc/init.d/p910nd start 2>&1 | tee -a "$LOG_FILE") || log "启动 p910nd 服务失败"
  log "p910nd 服务已启用并启动"
}

main() {
  log "=== 开始执行OpenWrt网络初始化脚本 $VERSION ==="

  configure_system
  configure_wireless_client
  configure_relay_bridge
  configure_firewall
  configure_luci_print_service

  log "=== 网络初始化脚本执行完毕 ==="
  echo "----------------------------------------"
  echo "  执行结果:"
  echo "  中继IP:$RELAY_IP"
  echo "  日志路径:$LOG_FILE"
  echo "----------------------------------------"
}

main "$@"
exit 0
View Code

 

posted @ 2025-04-05 13:00  上官飞鸿  阅读(443)  评论(0)    收藏  举报