wifi_bridge
目录
要实现物联网设备(C)通过Linux设备(B)的AP+STA双模接入校园网(A),核心是让Linux设备同时扮演两个角色:
- STA角色:作为客户端,连接校园网AP(A),获取校园网访问权限;
- AP角色:作为热点,让物联网设备(C)连接,再通过Linux设备的网络转发功能,将C的流量转发到校园网(A)。
一、前置条件检查
在开始配置前,需确保Linux设备(B)满足以下条件,否则会导致配置失败:
- 无线网卡支持AP模式:
执行命令iw list查看无线网卡功能,若输出中包含AP(如下方示例),则支持AP模式;若没有,则需更换支持AP模式的无线网卡(如USB无线网卡)。supported interface modes: * IBSS * managed # STA模式(客户端) * AP # 支持AP模式(热点) * AP/VLAN * monitor - 管理员权限(root):
所有网络配置(如修改接口、启动服务)需root权限,执行sudo -i切换至root用户。 - 必要工具安装:
需安装3个核心工具,不同Linux发行版(如Ubuntu/Debian、CentOS/RHEL)安装命令不同:
| 工具用途 | Ubuntu/Debian 安装命令 | CentOS/RHEL 安装命令 |
|---|---|---|
| 管理AP模式(热点) | apt install hostapd | yum install hostapd |
| 提供DHCP/DNS(给C分配IP) | apt install dnsmasq | yum install dnsmasq |
| 无线接口配置 | apt install wireless-tools iw | yum install wireless-tools iw |
二、分步配置(核心步骤)
假设Linux设备的无线网卡名为 wlan0(可通过 ip addr 查看,可能是 wlp2s0 等),配置分为4个关键环节:STA模式(连校园网)→ AP模式(发热点)→ 网络转发 → 测试连通性。
环节1:配置STA模式(Linux设备B连接校园网A)
STA模式是让B作为“客户端”,连接校园网的AP(A)。校园网常见认证方式分两种,需针对性配置:
情况1:校园网是简单密码认证(WPA2-PSK,如家用WiFi)
通过 wpa_supplicant 或系统网络管理工具(如NetworkManager)配置:
- 创建wpa_supplicant配置文件(如
/etc/wpa_supplicant/wpa_supplicant-wlan0.conf):ctrl_interface=/var/run/wpa_supplicant update_config=1 network={ ssid="校园网AP名称(A的SSID)" # 替换为实际校园网名称(如“Campus-WiFi”) psk="校园网密码" # 替换为实际密码 key_mgmt=WPA-PSK # 认证方式(WPA2-PSK填WPA-PSK即可) proto=RSN # 支持WPA2 pairwise=TKIP # 加密算法 group=TKIP } - 启动STA连接:
wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant-wlan0.conf - 给STA接口(wlan0)获取IP(若校园网用DHCP):
dhclient wlan0 - 验证是否连上网:
执行ping www.baidu.com,若能通,说明B已成功接入校园网A。
情况2:校园网是企业级认证(WPA2-Enterprise,常见于高校)
校园网若需“账号+密码”认证(如802.1X),需修改wpa_supplicant配置文件,示例如下(需替换实际账号密码):
ctrl_interface=/var/run/wpa_supplicant
update_config=1
network={
ssid="校园网AP名称(如“Campus-Enterprise”)"
key_mgmt=WPA-EAP # 企业级认证
eap=PEAP # 认证协议(校园网可能是PEAP或TTLS,需确认)
phase2="auth=MSCHAPV2" # 二次认证(常见MSCHAPV2)
identity="校园网账号(如学号)" # 替换为你的校园网账号
password="校园网密码" # 替换为你的密码
}
后续启动和验证步骤与“情况1”一致。
环节2:配置AP模式(Linux设备B作为热点,供C连接)
AP模式是让B作为“热点”,物联网设备(C)通过WiFi连接B。需配置两个核心文件:hostapd(热点参数)和 dnsmasq(给C分配IP)。
步骤1:创建AP虚拟接口(关键!避免与STA冲突)
多数无线网卡不支持同一物理接口(如wlan0)同时运行STA和AP模式,因此需为AP模式创建一个虚拟接口(如 wlan0-ap):
# 先关闭wlan0的现有连接(避免冲突)
iw dev wlan0 disconnect
# 创建AP虚拟接口(类型为__ap)
iw dev wlan0 interface add wlan0-ap type __ap
# 启用虚拟接口
ip link set wlan0-ap up
执行 ip addr 可看到新增的 wlan0-ap 接口,后续AP模式用此接口。
设置开机自启
创建添加wlan0-ap接口的服务
sudo nano /etc/systemd/system/create-wlan0-ap.service
加入以下内容:
[Unit]
Description=Create wlan0-ap virtual interface for AP mode
After=network.target
Before=hostapd.service
[Service]
Type=oneshot
ExecStart=/bin/bash -c 'if iw dev | grep -q "wlan0-ap"; then iw dev wlan0-ap del; fi; \
iw dev wlan0 interface add wlan0-ap type __ap; \
ip link set wlan0-ap up; \
ip addr add 192.168.4.1/24 dev wlan0-ap'
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
添加该服务
sudo systemctl enable create-wlan0-ap.service
步骤2:配置hostapd(热点参数)
- 创建hostapd配置文件(如
/etc/hostapd/hostapd-wlan0-ap.conf),需注意:- 物联网设备(C)多只支持2.4GHz频段,建议优先配置2.4GHz(信道选1/6/11,避免干扰);
- 若C支持5GHz,可改为5GHz频段(需确认网卡支持)。
#使用时去除所有注释及每行末尾的空格,否则解析错误 interface=wlan0-ap # AP模式用的虚拟接口 driver=nl80211 # 驱动类型(默认nl80211) ssid=Linux-AP # 热点名称(C要连接的WiFi名称,可自定义) hw_mode=g # 频段:g=2.4GHz,a=5GHz channel=6 # 2.4GHz信道(1/6/11无重叠,选一个) wmm_enabled=0 # 关闭QoS(简化配置) macaddr_acl=0 # 允许所有MAC地址连接 auth_algs=1 # 允许开放系统认证 ignore_broadcast_ssid=0 # 不隐藏SSID(方便C查找) wpa=2 # 仅支持WPA2 wpa_passphrase=12345678 # 热点密码(至少8位,C连接时用) wpa_key_mgmt=WPA-PSK # 认证方式(简单密码) wpa_pairwise=TKIP # 加密算法 rsn_pairwise=CCMP - 测试hostapd是否能启动(验证配置文件无错误):若输出类似
hostapd /etc/hostapd/hostapd-wlan0-ap.confAP-ENABLED,说明配置正确;若报错(如“invalid channel”),需检查频段/信道是否支持(用iw list看网卡支持的信道)。 设置开机自启 编辑/etc/default/hostapd文件
DAEMON_CONF="/etc/hostapd/hostapd-wlan0-ap.conf" # 指向你的自定义配置
确保hostapd在接口创建后启动 编辑
sudo systemctl edit hostapd.service
添加
[Unit]
# 要求create-wlan0-ap.service必须先成功启动
Requires=create-wlan0-ap.service
# 确保hostapd在create-wlan0-ap之后启动
After=create-wlan0-ap.service
步骤3:配置dnsmasq(给C分配IP)
物联网设备(C)连接B的热点后,需通过DHCP获取IP,dnsmasq负责提供DHCP和DNS服务:
- 备份默认dnsmasq配置(避免冲突):
cp /etc/dnsmasq.conf /etc/dnsmasq.conf.bak - 创建新配置文件(
/etc/dnsmasq.conf):interface=wlan0-ap # 仅在AP接口提供服务 dhcp-range=192.168.4.2,192.168.4.20,255.255.255.0,24h # 分配IP段(给C) dhcp-option=3,192.168.4.1 # 网关(C的网关指向B的AP接口IP) dhcp-option=6,8.8.8.8,114.114.114.114 # DNS服务器(用公共DNS或校园网DNS) server=8.8.8.8 # 转发DNS请求到谷歌DNS log-queries # 日志记录(方便排查问题) log-dhcp # 记录DHCP分配情况 - 给B的AP接口(wlan0-ap)设置静态IP(需与上述网关一致):
ip addr add 192.168.4.1/24 dev wlan0-ap - dnsmasq使用端口53,通常被系统自带的DNS服务(如
systemd-resolved)占用,导致dnsmasq无法使用该端口
如果 systemd-resolved 占用,需要修改其配置,让它释放端口53:
编辑
systemd-resolved配置文件:sudo nano /etc/systemd/resolved.conf在文件中添加/修改以下内容(禁用其对端口53的监听):
[Resolve]
DNSStubListener=no # 关键:关闭端口53的监听
保存文件(
Ctrl+O确认,Ctrl+X退出),然后重启systemd-resolved:sudo systemctl restart systemd-resolved验证端口53是否已释放:
sudo lsof -i :53 # 此时应无输出,说明端口已释放重启
dnsmasq服务
sudo systemctl restart dnsmasq
- 验证
dnsmasq是否启动成功
sudo systemctl status dnsmasq
如果输出中显示 Active: active (running),说明启动成功;若仍失败,重复步骤1,检查是否有其他进程(如 bind9、named 等)占用端口53,停止对应的服务即可。
环节3:配置网络转发(让C的流量通过B到A)
Linux默认关闭IP转发,需手动开启,并配置防火墙(iptables)做NAT转发,实现“C→B→A”的流量通路。
步骤1:开启IP转发(永久生效)
- 临时开启(立即生效,重启后失效):
echo 1 > /proc/sys/net/ipv4/ip_forward - 永久开启(重启后仍生效):
编辑/etc/sysctl.conf,确保以下行无注释(若没有则添加):执行net.ipv4.ip_forward=1sysctl -p让配置生效。
步骤2:配置iptables(NAT转发规则)
如果是ubuntu22.04,默认使用的是nf_tables 切换为传统iptables
update-alternatives --set iptables /usr/sbin/iptables-legacy
update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
通过iptables将AP接口(wlan0-ap)的流量转发到STA接口(wlan0,已连校园网),并允许双向通信:
# 1. 清空现有规则(可选,避免旧规则干扰)
iptables -F
iptables -t nat -F
# 2. 允许AP接口(wlan0-ap)与STA接口(wlan0)之间的转发
iptables -A FORWARD -i wlan0-ap -o wlan0 -j ACCEPT
iptables -A FORWARD -o wlan0-ap -i wlan0 -j ACCEPT
# 3. 配置NAT(将C的私网IP转换为B的校园网IP,实现访问外网)
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
# 4. 保存规则(避免重启后丢失,Ubuntu需安装iptables-persistent)
# Ubuntu/Debian:
apt install iptables-persistent
netfilter-persistent save
# CentOS/RHEL:
service iptables save
环节4:启动服务并测试连通性
后台启动hostapd和dnsmasq服务:
# 启动hostapd(用自定义配置文件) hostapd -B /etc/hostapd/hostapd-wlan0-ap.conf # 启动dnsmasq systemctl start dnsmasq # 设置开机自启(可选) systemctl enable hostapd systemctl enable dnsmasq测试物联网设备(C)的连通性:
- 让C连接B的热点(SSID:
Linux-AP,密码:12345678); - 查看C是否获取到IP(应在
192.168.4.2~20范围内); - 在C上执行
ping www.baidu.com或ping 校园网网关,若能通,说明配置成功!
- 让C连接B的热点(SSID:
三、常见问题排查
若配置后C无法联网,按以下步骤排查:
hostapd启动失败:
- 报错“invalid interface”:检查虚拟接口
wlan0-ap是否存在(ip addr),重新执行iw dev wlan0 interface add wlan0-ap type __ap; - 报错“channel not allowed”:用
iw list查看网卡支持的信道,修改hostapd配置中的channel。
- 报错“invalid interface”:检查虚拟接口
C无法获取IP:
- 检查dnsmasq是否启动(
systemctl status dnsmasq),查看日志(cat /var/log/syslog | grep dnsmasq); - 确认AP接口
wlan0-ap的IP是192.168.4.1(ip addr)。
- 检查dnsmasq是否启动(
C能连热点但无法ping外网:
- 检查B的STA接口(wlan0)是否能联网(
ping www.baidu.com); - 检查IP转发是否开启(
cat /proc/sys/net/ipv4/ip_forward,应输出1); - 检查iptables规则(
iptables -t nat -L,确认POSTROUTING规则存在)。
- 检查B的STA接口(wlan0)是否能联网(
无线网卡不支持同时STA和AP:
- 若执行
iw dev wlan0 interface add wlan0-ap type __ap报错,说明网卡不支持“单卡双模”,需添加一块额外的无线网卡(如USB网卡):一块用于STA(连校园网),另一块用于AP(发热点),配置时分别用不同的接口名(如wlan0做STA,wlan1做AP)。
- 若执行
四、优化建议
- 固定接口名称:Linux网卡名称可能随重启变化(如
wlp2s0变wlp3s0),可通过/etc/udev/rules.d/70-persistent-net.rules固定接口名。 - 校园网DHCP租期:若校园网IP租期短,可配置
dhclient自动续约(无需手动操作)。 - 低功耗适配:若C是低功耗物联网设备(如ESP8266),建议将B的热点信道固定为1/6/11,减少C的连接功耗。