#!/bin/bash # ================================================ # STA+AP 异频设置脚本 # STA: 5GHz 连接上游WiFi(wld0) # AP: 2.4GHz 发出热点(ap0) # ================================================ set -e # ========== 配置区域(按需修改)========== AP_SSID="K20P-AP" # AP热点名称 AP_PASS="12345678" # AP密码(至少8位) AP_CHANNEL="6" # AP信道(2.4GHz: 1/6/11) AP_IP="192.168.50.1" # AP网关IP AP_DHCP_START="192.168.50.100" # DHCP起始IP AP_DHCP_END="192.168.50.200" # DHCP结束IP STA_IFACE="wld0" # STA接口名 AP_IFACE="ap0" # AP接口名 # ========================================= echo "================================================" echo " STA+AP 异频设置" echo " STA: $STA_IFACE (5GHz) → 连接上游WiFi" echo " AP: $AP_IFACE (2.4GHz) → 发出 $AP_SSID" echo "================================================" echo "" # 检查root权限 if [ "$(id -u)" != "0" ]; then echo "[错误] 请用root权限运行此脚本" exit 1 fi # 检查STA接口是否存在 if ! ip link show $STA_IFACE &>/dev/null; then echo "[错误] STA接口 $STA_IFACE 不存在" echo "当前接口列表:" iw dev exit 1 fi # 检查STA是否已连接 STA_STATUS=$(iw dev $STA_IFACE link 2>/dev/null | grep -c "Connected" || true) if [ "$STA_STATUS" -eq 0 ]; then echo "[警告] $STA_IFACE 当前未连接WiFi,AP仍会创建但无法上网" fi echo "[1/7] 安装依赖..." apt install -y hostapd dnsmasq iptables 2>/dev/null | tail -1 echo "[2/7] 创建AP虚拟接口 $AP_IFACE..." # 如果已存在则先删除 if ip link show $AP_IFACE &>/dev/null; then echo " $AP_IFACE 已存在,先删除..." ip link set $AP_IFACE down 2>/dev/null || true iw dev $AP_IFACE del 2>/dev/null || true fi # 获取phy设备 PHY=$(iw dev $STA_IFACE info | grep wiphy | awk '{print "phy"$2}') echo " 使用物理设备: $PHY" iw phy $PHY interface add $AP_IFACE type __ap echo "[3/7] 配置AP接口..." # 生成MAC地址(修改第一个字节为02表示本地管理) STA_MAC=$(cat /sys/class/net/$STA_IFACE/address) AP_MAC="02:$(echo $STA_MAC | cut -d: -f2-)" ip link set $AP_IFACE address $AP_MAC ip link set $AP_IFACE up ip addr flush dev $AP_IFACE ip addr add ${AP_IP}/24 dev $AP_IFACE echo " AP MAC: $AP_MAC" echo " AP IP: $AP_IP" echo "[4/7] 配置 hostapd..." cat > /etc/hostapd/hostapd.conf << EOF # AP接口 interface=$AP_IFACE driver=nl80211 # 热点信息 ssid=$AP_SSID hw_mode=g channel=$AP_CHANNEL # 802.11n支持 ieee80211n=1 wmm_enabled=1 ht_capab=[HT40+][SHORT-GI-40][DSSS_CCK-40] # 加密设置 auth_algs=1 wpa=2 wpa_passphrase=$AP_PASS wpa_key_mgmt=WPA-PSK rsn_pairwise=CCMP # 其他 ignore_broadcast_ssid=0 EOF # 指定配置文件 sed -i 's|#DAEMON_CONF=.*|DAEMON_CONF="/etc/hostapd/hostapd.conf"|' \ /etc/default/hostapd 2>/dev/null || \ echo 'DAEMON_CONF="/etc/hostapd/hostapd.conf"' >> /etc/default/hostapd echo "[5/7] 配置 dnsmasq DHCP..." # 备份原配置 [ -f /etc/dnsmasq.conf ] && cp /etc/dnsmasq.conf /etc/dnsmasq.conf.bak cat > /etc/dnsmasq.d/ap0.conf << EOF # AP热点 DHCP配置 interface=$AP_IFACE bind-interfaces dhcp-range=$AP_DHCP_START,$AP_DHCP_END,255.255.255.0,24h dhcp-option=3,$AP_IP dhcp-option=6,8.8.8.8,8.8.4.4 EOF echo "[6/7] 配置 NAT 转发..." # 开启IP转发 echo 1 > /proc/sys/net/ipv4/ip_forward # 永久生效 if ! grep -q "net.ipv4.ip_forward=1" /etc/sysctl.conf; then echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf fi # 清理旧规则 iptables -t nat -D POSTROUTING -o $STA_IFACE -j MASQUERADE 2>/dev/null || true # 添加NAT规则 iptables -t nat -A POSTROUTING -o $STA_IFACE -j MASQUERADE iptables -A FORWARD -i $AP_IFACE -o $STA_IFACE -j ACCEPT iptables -A FORWARD -i $STA_IFACE -o $AP_IFACE -m state \ --state RELATED,ESTABLISHED -j ACCEPT # 保存iptables规则 apt install -y iptables-persistent 2>/dev/null | tail -1 netfilter-persistent save 2>/dev/null || true echo "[7/7] 启动服务..." systemctl restart dnsmasq systemctl unmask hostapd 2>/dev/null || true systemctl enable hostapd systemctl restart hostapd # 等待hostapd启动 sleep 2 echo "" echo "================================================" echo " 设置完成,当前状态:" echo "================================================" echo "" # 显示STA状态 STA_SSID=$(iw dev $STA_IFACE link 2>/dev/null | grep SSID | awk '{print $2}') STA_FREQ=$(iw dev $STA_IFACE link 2>/dev/null | grep freq | awk '{print $2}') echo "STA ($STA_IFACE):" echo " 连接: ${STA_SSID:-未连接}" echo " 频率: ${STA_FREQ:-N/A} MHz" echo "" echo "AP ($AP_IFACE):" echo " SSID: $AP_SSID" echo " 密码: $AP_PASS" echo " 信道: $AP_CHANNEL (2.4GHz)" echo " 网关: $AP_IP" echo " DHCP: $AP_DHCP_START ~ $AP_DHCP_END" echo "" echo "hostapd 状态:" systemctl is-active hostapd && echo " ✅ 运行中" || echo " ❌ 未运行" echo "" echo "验证命令:" echo " iw dev # 查看所有接口" echo " systemctl status hostapd # 查看AP状态" echo " cat /var/lib/misc/dnsmasq.leases # 查看已连接设备" echo "" echo "停止AP:" echo " systemctl stop hostapd" echo " ip link set $AP_IFACE down" echo ""