Ubuntu STA+AP 开机自启完整方案

当前方案所需网卡需支持并发 AP+STA 模式,如果单网卡不支持并法 AP+STA 模式,那么就需要两张网卡来完成这套操作。

一、单网卡配置

1. 检查网卡支持模式

检查无线芯片是否支持 concurrent mode:

iw list | grep -A 10 "Supported interface modes"

看是否同时支持 APmanaged

如果满足上述要求,则进行下一步

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
  1. 备份默认配置:
sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.bak
  1. 新建 /etc/dnsmasq.conf
interface=wlp3s0_ap
bind-interfaces
dhcp-range=192.168.50.10,192.168.50.100,12h
  1. 修改 dnsmasq systemd 依赖:
sudo systemctl edit dnsmasq

输入:

[Unit]
After=hostapd-ap.service
Requires=hostapd-ap.service

[Service]
ExecStartPre=/bin/sleep 3

保存退出。

  1. 启用并重载:
sudo systemctl daemon-reload
sudo systemctl enable dnsmasq

7. 设置 NAT 转发

  1. 启用 IP 转发:
sudo sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
  1. 配置 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
  1. 保存规则:
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. 开机启动顺序

  1. unblock-wifi.service → 解锁 WLAN

  2. wlan-ap.service → 创建虚拟接口 + 分配静态 IP

  3. hostapd-ap.service → 启动 AP

  4. dnsmasq.service → DHCP

  5. NAT 转发 → 设备可上网

  6. 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"

总结

  1. STA 网卡(wlp3s0)负责连接外网 Wi-Fi

  2. AP 网卡(wlp4s0)提供热点(虚拟接口 wlp4s0\_ap)

  3. dnsmasq 给 AP 客户端分配 IP

  4. NAT 转发通过 STA 网卡访问外网

posted @ 2025-09-28 10:17  BlueSpace  阅读(41)  评论(0)    收藏  举报