Ubuntu STA+AP 开机自启完整方案
当前方案所需网卡需支持并发 AP+STA 模式,如果单网卡不支持并法 AP+STA 模式,那么就需要两张网卡来完成这套操作。
一、单网卡配置
1. 检查网卡支持模式
检查无线芯片是否支持 concurrent mode:
iw list | grep -A 10 "Supported interface modes"
看是否同时支持 AP 和 managed
如果满足上述要求,则进行下一步
2. 确认硬件支持并发模式
iw list | grep -A 20 "interface combinations"
如果返回类似如下结果则代表支持并发模式。
valid interface combinations: * #{ managed } <= 1, #{ AP, P2P-client, P2P-GO } <= 1, #{ P2P-device } <= 1, total <= 3, #channels <= 2
| 关键词 | 作用 |
| managed | STA 模式,即连接上游 Wi-Fi 路由器 |
| AP | 热点模式,用于发射 Wi-Fi 信号 |
| P2P-client / P2P-GO | Wi-Fi Direct 功能 |
| total <= 3 | 最多可同时存在 3 个接口(例如 STA、AP、P2P 各一个) |
| #channels <= 2 | 这些接口最多只能使用 2 个物理信道 |
3. rfkill 自动解锁 WLAN
文件:/etc/systemd/system/unblock-wifi.service
[Unit]
Description=Unblock WiFi
Before=wlan-ap.service
[Service]
Type=oneshot
ExecStart=/usr/sbin/rfkill unblock all
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
启用:
sudo systemctl daemon-reload
sudo systemctl enable unblock-wifi.service
4. 创建虚拟 AP 接口
假设网卡名为 wlp3s0
文件:/etc/systemd/system/wlan-ap.service
[Unit]
Description=Create virtual AP interface
After=unblock-wifi.service
Requires=unblock-wifi.service
[Service]
Type=oneshot
# 创建虚拟接口
ExecStart=/sbin/iw dev wlp3s0 interface add wlp3s0_ap type __ap
# 给接口分配静态 IP
ExecStartPost=/sbin/ip addr add 192.168.50.1/24 dev wlp3s0_ap
ExecStartPost=/sbin/ip link set dev wlp3s0_ap up
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
启用:
sudo systemctl daemon-reload
sudo systemctl enable wlan-ap.service
5. hostapd AP 服务
安装 hostapd
sudo apt install hostapd
文件:/etc/systemd/system/hostapd-ap.service
[Unit]
Description=Start hostapd for AP
After=wlan-ap.service
Requires=wlan-ap.service
[Service]
ExecStartPre=/bin/sleep 3
ExecStart=/usr/sbin/hostapd /etc/hostapd/hostapd.conf
Restart=always
[Install]
WantedBy=multi-user.target
hostapd 配置 /etc/hostapd/hostapd.conf
interface=wlp3s0_ap
driver=nl80211
ssid=MyHotspot
hw_mode=g
channel=6
wmm_enabled=1
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=12345678
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
6. dnsmasq DHCP 服务
安装 dnsmasq
sudo apt install dnsmasq
- 备份默认配置:
sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.bak
- 新建
/etc/dnsmasq.conf:
interface=wlp3s0_ap
bind-interfaces
dhcp-range=192.168.50.10,192.168.50.100,12h
- 修改 dnsmasq systemd 依赖:
sudo systemctl edit dnsmasq
输入:
[Unit]
After=hostapd-ap.service
Requires=hostapd-ap.service
[Service]
ExecStartPre=/bin/sleep 3
保存退出。
- 启用并重载:
sudo systemctl daemon-reload
sudo systemctl enable dnsmasq
7. 设置 NAT 转发
- 启用 IP 转发:
sudo sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
- 配置 iptables:
sudo iptables -t nat -A POSTROUTING -o wlp3s0 -j MASQUERADE
sudo iptables -A FORWARD -i wlp3s0_ap -o wlp3s0 -j ACCEPT
sudo iptables -A FORWARD -i wlp3s0 -o wlp3s0_ap -m state --state RELATED,ESTABLISHED -j ACCEPT
- 保存规则:
sudo apt install iptables-persistent
sudo netfilter-persistent save
8. STA 自动连接 Wi-Fi
nmcli dev wifi connect "YourWiFiSSID" password "YourWiFiPassword" ifname wlp3s0
nmcli connection modify "YourWiFiSSID" connection.autoconnect yes
9. NetworkManager 忽略虚拟 AP 接口
编辑 /etc/NetworkManager/NetworkManager.conf:
[keyfile]
unmanaged-devices=interface-name:wlp3s0_ap
重启 NetworkManager:
sudo systemctl restart NetworkManager
10. 开机启动顺序
-
unblock-wifi.service→ 解锁 WLAN -
wlan-ap.service→ 创建虚拟接口 + 分配静态 IP -
hostapd-ap.service→ 启动 AP -
dnsmasq.service→ DHCP -
NAT 转发 → 设备可上网
-
STA 自动连 Wi-Fi
二、双网卡配置
1. 确定网卡角色
| 网卡 | 角色 |
wlp3s0 |
STA,连接外部 Wi-Fi |
wlp4s0 |
AP,提供热点 |
你也可以反过来,只要在 systemd 和配置里对应即可。
2. hostapd 配置
假设 wlp4s0 做 AP:
/etc/hostapd/hostapd.conf:
interface=wlp4s0_ap # AP 虚拟接口基于 wlp4s0
driver=nl80211
ssid=MyHotspot
hw_mode=g
channel=6
wmm_enabled=1
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=12345678
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
虚拟接口名字可以是 wlp4s0_ap。
3. 创建虚拟 AP 接口
systemd wlan-ap.service:
[Unit]
Description=Create virtual AP interface
After=unblock-wifi.service
Requires=unblock-wifi.service
[Service]
Type=oneshot
# 创建 AP 虚拟接口
ExecStart=/sbin/iw dev wlp4s0 interface add wlp4s0_ap type __ap
# 给虚拟接口分配静态 IP
ExecStartPost=/sbin/ip addr add 192.168.51.1/24 dev wlp4s0_ap
ExecStartPost=/sbin/ip link set dev wlp4s0_ap up
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
- 注意静态 IP 要和 dnsmasq dhcp-range 同一网段,例如
192.168.51.0/24
4. dnsmasq 配置
/etc/dnsmasq.conf:
interface=wlp4s0_ap
bind-interfaces
dhcp-range=192.168.51.10,192.168.51.100,12h
systemd override /etc/systemd/system/dnsmasq.service.d/override.conf:
[Unit]
After=hostapd-ap.service
Requires=hostapd-ap.service
[Service]
ExecStartPre=/bin/sleep 3
5. NAT 设置
假设 STA 网卡 wlp3s0 已经连接外网 Wi-Fi:
# 启用 IP 转发
sudo sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# NAT 转发
sudo iptables -t nat -A POSTROUTING -o wlp3s0 -j MASQUERADE
sudo iptables -A FORWARD -i wlp4s0_ap -o wlp3s0 -j ACCEPT
sudo iptables -A FORWARD -i wlp3s0 -o wlp4s0_ap -m state --state RELATED,ESTABLISHED -j ACCEPT
# 保存规则
sudo apt install iptables-persistent
sudo netfilter-persistent save
6. STA 自动连接 Wi-Fi
nmcli dev wifi connect "YourWiFiSSID" password "YourWiFiPassword" ifname wlp3s0
nmcli connection modify "YourWiFiSSID" connection.autoconnect yes
7. NetworkManager 忽略 AP 接口
编辑 /etc/NetworkManager/NetworkManager.conf:
[keyfile]
unmanaged-devices=interface-name:wlp4s0_ap
重启 NetworkManager:
sudo systemctl restart NetworkManager
#!/usr/bin/env bash
# ============================================================
# 一键配置 NetworkManager 热点服务
# 外网网卡: wlp2s0
# 热点网卡: wlx6c1ff77f702c
# ============================================================
HOTSPOT_NAME="MyHotspot"
HOTSPOT_PASS="12345678"
NET_IF="wlp2s0"
HOTSPOT_IF="wlx6c1ff77f702c"
SCRIPT_PATH="/usr/local/bin/auto_hotspot.sh"
SERVICE_PATH="/etc/systemd/system/auto-hotspot.service"
echo "============================"
echo "🔥 开始配置自动热点服务"
echo "============================"
# 1️⃣ 生成主脚本
echo "📄 创建脚本: $SCRIPT_PATH"
sudo tee "$SCRIPT_PATH" > /dev/null <<EOF
#!/usr/bin/env bash
# 自动启动热点 (NetworkManager)
HOTSPOT_NAME="$HOTSPOT_NAME"
HOTSPOT_PASS="$HOTSPOT_PASS"
NET_IF="$NET_IF"
HOTSPOT_IF="$HOTSPOT_IF"
echo "🌐 外网网卡 (A): \$NET_IF"
echo "📶 热点网卡 (B): \$HOTSPOT_IF"
# 检查是否存在热点连接
if nmcli connection show "\$HOTSPOT_NAME" &>/dev/null; then
echo "🔁 已存在热点连接:\$HOTSPOT_NAME"
else
echo "✨ 创建热点连接..."
nmcli connection add type wifi ifname "\$HOTSPOT_IF" con-name "\$HOTSPOT_NAME" ssid "\$HOTSPOT_NAME"
nmcli connection modify "\$HOTSPOT_NAME" \
802-11-wireless.mode ap \
802-11-wireless.band bg \
802-11-wireless.channel 6 \
wifi-sec.key-mgmt wpa-psk \
wifi-sec.psk "\$HOTSPOT_PASS" \
ipv4.method shared \
ipv6.method ignore \
connection.autoconnect yes \
connection.autoconnect-priority 100
fi
# 确保热点启动
echo "🚀 启动热点..."
nmcli connection up "\$HOTSPOT_NAME" || nmcli device wifi hotspot ifname "\$HOTSPOT_IF" ssid "\$HOTSPOT_NAME" password "\$HOTSPOT_PASS"
echo "✅ 热点已启动 (\$HOTSPOT_IF),SSID: \$HOTSPOT_NAME"
EOF
sudo chmod +x "$SCRIPT_PATH"
# 2️⃣ 生成 systemd 服务文件
echo "⚙️ 创建 systemd 服务: $SERVICE_PATH"
sudo tee "$SERVICE_PATH" > /dev/null <<EOF
[Unit]
Description=Auto Hotspot using NetworkManager
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
ExecStart=$SCRIPT_PATH
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
# 3️⃣ 重新加载 systemd 并启用服务
echo "🔄 重新加载 systemd..."
sudo systemctl daemon-reload
sudo systemctl enable auto-hotspot.service
# 4️⃣ 启动服务
echo "🚀 启动热点服务..."
sudo systemctl start auto-hotspot.service
# 5️⃣ 显示状态
echo "============================"
sudo systemctl status auto-hotspot.service --no-pager
echo "============================"
echo "✅ 热点服务安装完成!"
echo "SSID: $HOTSPOT_NAME"
echo "密码: $HOTSPOT_PASS"
echo "开机自启: 已启用"
echo "日志查看命令: journalctl -u auto-hotspot.service -b"
总结
-
STA 网卡(wlp3s0)负责连接外网 Wi-Fi
-
AP 网卡(wlp4s0)提供热点(虚拟接口 wlp4s0\_ap)
-
dnsmasq 给 AP 客户端分配 IP
-
NAT 转发通过 STA 网卡访问外网

浙公网安备 33010602011771号