- 元件选择
- 启动网络接口
- 设置802.11ac接入点(5 GHz)
- 使用hostapd配置虚拟SSID
在过去的十年中,我购买了廉价的网络设备,并在其上安装了
DD-WRT ,以使“功能”以超过500美元的价格从Linux内核中删除,而后者是基础固件。
尽管存在不稳定的版本,未纠正的错误和
纠纷 ,但DD-WRT仍然比库存固件更可取。 但是现在有价值的组件比以往任何时候都更便宜,并且DIY社区已经完全转换为Linux(我正在找您,Raspberry先生),那么为什么不一劳永逸地构建自己的无线路由器呢?
元件选择
首先,您需要确定平台:
x86或
ARM ? 我不会
详细讨论主要的区别 ,而是简要地介绍一下:前者具有更好的性能,而后者则更便宜且更节能。 Raspberry Pi板(和等效产品)非常便宜,并且可能比大多数无线商用路由器功能更强大,但是x86平台已普及并且具有标准化的外形尺寸和扩展端口的优势。
当然,最重要的细节是芯片组。 今天,事实上的标准是
802.11n (2.4 GHz)和
802.11ac (5 GHz),但是为Linux选择驱动程序
仍然是一个挑战 ,尤其是在支持AP(接入点)模式的情况下。 简而言之,如果您不希望出现问题,请选择
Atheros芯片组。 很好地支持
ath9k和
ath10k驱动程序 ,您可以通过USB和/或mini-PCIe接口轻松找到它们。
至少需要一个网络接口控制器(NIC),并根据您的喜好选择RAM和存储。
材料清单
牺牲了价格和功耗之后,我选择了x86平台来进行模块化,相对强大的配置以进行升级。
如果不需要ARM,则不需要风扇。外壳很宽敞,有两个准备好的交流/直流插头孔。 顺利安装主板,RAM和Pico-PSU:
铁色情事实证明,安装mini-PCIe WiFi最困难,因为该板仅支持一半大小的卡:在这里,mPCIe扩展电缆可用于救援。 我用20厘米FFC电缆(随附)连接适配器的两侧,并使用双面胶带将mini-PCIe固定至机箱。


Mini-PCIe扩展器幸运的是,机箱带有三个预先切割的天线孔。 这是最终结果:


软体类
显然,我们安装了Linux。 根据硬件的不同,它可能是经过优化的发行版,如
Raspbian (针对Raspberry Pi)或您喜欢的任何其他Linux发行版。 自从我使用Ubuntu多年以来,我选择了
Ubuntu Server 18.04 LTS ,我更习惯与之合作并获得长期支持。
本文的其余部分假定您正在使用基于Debian的发行版。如果安装正常,然后转到控制台,请定义接口名称:
$ ip -br a | awk '{print $1}' lo enp1s0 enp2s0 wlp5s0
主板上有两个内置NIC:
enp1s0
和
enp2s0
。 无线网卡显示为
wlp5s0
并按预期支持AP模式:
$ iw list ... Supported interface modes: * managed * AP * AP/VLAN * monitor * mesh point
现在,我们可以概述所需的内容:我们将第一个NIC用作WAN端口,然后将第二个NIC连接到无线接口:

联播网
如果您具有Ubuntu 18.04,则立即摆脱netplan,以返回对/ etc / network / interfaces的支持:
$ sudo apt-get install ifupdown bridge-utils $ sudo systemctl stop networkd-dispatcher $ sudo systemctl disable networkd-dispatcher $ sudo systemctl mask networkd-dispatcher $ sudo apt-get purge nplan netplan.io
作为DHCP / DNS服务器,选择
dnsmasq :
$ sudo apt-get install dnsmasq
由于我们将通过
post-up
挂钩启动和配置
dnsmasq
进程,因此请记住在引导时禁用守护程序:
$ sudo sed -i "s/^ENABLED=1$/ENABLED=0/g" /etc/default/dnsmasq
我们将根据该图编写网络接口的
初步配置,包括
dnsmasq
的最低配置:
$ cat /etc/network/interfaces
文档/etc/network/interfaces
在这里如您在
post-up
部分中所见,一旦桥升起,dnsmasq就开始启动。 它的配置仅由命令行参数(
--conf-file=/dev/null
)执行,并且在关闭接口时该过程将停止。
在
wlp5s0
未特别指定
bridge_ports
接口,因为
hostapd
会自动将其添加到网桥(在启动hostapd更改接口模式之前,brctl可能会拒绝这样做)。
请参阅dnsmasq
文档 。现在,您可以重新启动网络(
sudo service networking restart
),或者简单地重新启动以确认网络配置正确。
请注意:尽管我们目前可以从
enp2s0
接收DHCP,
enp2s0
我们将无法
进行无线连接 (稍后会详细介绍)
或访问Internet (请参见下文)。
路由选择
此时,您需要在LAN(
enp2s0
)和WAN(
enp1s0
)
enp1s0
之间路由数据包,并启用
网络地址转换 。
启用数据包转发很容易:
$ sudo sysctl -w net.ipv4.ip_forward=1 $ echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
最后一条命令确保在下次重新启动之前保存配置。网络地址转换是另一回事,通常您必须处理(或更确切地说,是对付)
iptables
。 幸运的是,“石器时代”已经过去了,FireHol的团队付出了很多努力来添加必要的抽象级别:
$ sudo apt-get install firehol
FireHOL是一种最新的安全防火墙语言,其配置易于理解和访问。 您不再需要编写
iptables
语句:配置文件本身将转换为
iptables
语句并根据需要应用。 后台无守护程序。
启用LAN的网络地址转换并添加最小防火墙规则的步骤基本完成:
$ cat /etc/firehol/firehol.conf version 6
FireHOL是人们为人们编写的, 这里是文档。您可以通过手动启动
firehol
(
sudo firehol start
)并将便携式计算机连接到LAN端口来检查设置:
现在,如果已连接WAN端口,则
可以联机 。
重新引导之前,请
确保编辑
/etc/default/firehol
以允许FireHol在引导时启动:
$ sudo sed -i -E "s/^START_FIREHOL=.+$/START_FIREHOL=YES/g" /etc/default/firehol
我不会详细介绍整个firehol
语法,配置文件会自行说明 ,如果配置更复杂,建议您firehol
文档 。 如果您真的对firehol
对iptables
做了什么感兴趣,只需在命令行中输入sudo firehol status
。无线热点
显然,我们将使用
hostapd管理访问点:
$ sudo apt-get install hostapd
在下面,您将找到最小且几乎无法解释的802.11 n / 2.4 Ghz / WPA2-AES配置文件:
$ cat /etc/hostapd/hostapd-simple.conf
请参阅 hostpad.conf
/usr/share/doc/hostapd/examples/hostapd.conf
文档 。
可以手动测试描述的配置:
$ sudo hostapd /etc/hostapd/hostapd-simple.conf
如果一切顺利,
将出现无线连接 。 如果您对结果感到满意,
请不要忘记更改配置以在接口上升后立即启动
hostapd
(如下所示)。
这是您的最终/etc/network/interfaces:
$ cat /etc/network/interfaces
设置802.11ac接入点(5 GHz)
被动扫描
根据
Airetos AEX-QCA9880-NX文档,该芯片组支持802.11ac,因此我们可以将拥挤的2.4 GHz信道留给天堂5 GHz。
让我们看看支持哪些频率:
$ iw list ... Frequencies: * 2412 MHz [1] (20.0 dBm) * 2417 MHz [2] (20.0 dBm) * 2422 MHz [3] (20.0 dBm) * 2427 MHz [4] (20.0 dBm) * 2432 MHz [5] (20.0 dBm) * 2437 MHz [6] (20.0 dBm) * 2442 MHz [7] (20.0 dBm) * 2447 MHz [8] (20.0 dBm) * 2452 MHz [9] (20.0 dBm) * 2457 MHz [10] (20.0 dBm) * 2462 MHz [11] (20.0 dBm) * 2467 MHz [12] (disabled) * 2472 MHz [13] (disabled) * 2484 MHz [14] (disabled) ... Frequencies: * 5180 MHz [36] (17.0 dBm) (no IR) * 5200 MHz [40] (17.0 dBm) (no IR) * 5220 MHz [44] (17.0 dBm) (no IR) * 5240 MHz [48] (17.0 dBm) (no IR) * 5260 MHz [52] (23.0 dBm) (no IR, radar detection) * 5280 MHz [56] (23.0 dBm) (no IR, radar detection) * 5300 MHz [60] (23.0 dBm) (no IR, radar detection) * 5320 MHz [64] (23.0 dBm) (no IR, radar detection) * 5500 MHz [100] (23.0 dBm) (no IR, radar detection) * 5520 MHz [104] (23.0 dBm) (no IR, radar detection) * 5540 MHz [108] (23.0 dBm) (no IR, radar detection) * 5560 MHz [112] (23.0 dBm) (no IR, radar detection) * 5580 MHz [116] (23.0 dBm) (no IR, radar detection) * 5600 MHz [120] (23.0 dBm) (no IR, radar detection) * 5620 MHz [124] (23.0 dBm) (no IR, radar detection) * 5640 MHz [128] (23.0 dBm) (no IR, radar detection) * 5660 MHz [132] (23.0 dBm) (no IR, radar detection) * 5680 MHz [136] (23.0 dBm) (no IR, radar detection) * 5700 MHz [140] (23.0 dBm) (no IR, radar detection) * 5720 MHz [144] (23.0 dBm) (no IR, radar detection) * 5745 MHz [149] (30.0 dBm) (no IR) * 5765 MHz [153] (30.0 dBm) (no IR) * 5785 MHz [157] (30.0 dBm) (no IR) * 5805 MHz [161] (30.0 dBm) (no IR) * 5825 MHz [165] (30.0 dBm) (no IR) ...
在上面的列表中,我们看到芯片组支持通道1-14(2.4 GHz)和通道36-165(5 GHz),但是您是否注意到
no IR
标志?
no IR
标志表示
无辐射 (即
被动扫描 )。 这意味着在设备首次启动辐射(包括
信标 )的情况下,禁止使用此模式。 换句话说,
您不能在这些通道上运行接入点 !
法规要求
Linux的
法规要求解释了上述情况,该
法规要求 根据国家/地区来规范射频频谱的使用。
但是,嘿!
我住在美国,该链接说我有权在36-48频道上发起辐射,那怎么回事? 让我们看看当前正在使用哪个监管域:
$ iw reg get country 00: DFS-UNSET (2402 - 2472 @ 40), (N/A, 20), (N/A) (2457 - 2482 @ 40), (N/A, 20), (N/A), NO-IR (2474 - 2494 @ 20), (N/A, 20), (N/A), NO-OFDM, NO-IR (5170 - 5250 @ 80), (N/A, 20), (N/A), NO-IR (5250 - 5330 @ 80), (N/A, 20), (0 ms), DFS, NO-IR (5490 - 5730 @ 160), (N/A, 20), (0 ms), DFS, NO-IR (5735 - 5835 @ 80), (N/A, 20), (N/A), NO-IR (57240 - 63720 @ 2160), (N/A, 0), (N/A)
问题显示该
世界域当前处于活动状态(或未安装),即
每个国家/地区允许的
最小值 。
不幸的是,您不能手动安装
sudo iw reg set
域,因为该域在EEPROM中受保护:
$ dmesg | grep EEPROM [ 12.123068] ath: EEPROM regdomain: 0x6c
补丁!
幸运的是,法规要求是在驱动程序级别处理的,因此可以轻松更改它们:我们在
Open-WRT源代码中找到了补丁。
首先,不要忘记从
/etc/apt/sources.list
连接源代码存储库:
$ cat /etc/apt/sources.list ... deb-src http://us.archive.ubuntu.com/ubuntu/ bionic main restricted ...
然后通过安装必要的依赖项来准备环境:
$ sudo apt-get install build-essential fakeroot $ sudo apt-get build-dep linux
下载您的内核源代码:
$ apt-get source linux
由于构建系统中的细微差异,由于
原始的 Open-WRT补丁无法“按原样”应用于Ubuntu内核树,因此我必须对其进行修复:
$ VERSION=$(uname -r) $ cd linux-${VERSION%%-*} $ wget -O - https://gist.github.com/renaudcerrato/02de8b2e8dc013bc71326defd2ef062c/raw/a2db325e520e6442c8c12f7599d64ac1b7596a3e/402-ath_regd_optional.patch | patch -p1 -b
一切准备就绪,可以进行组装:
$ fakeroot debian/rules clean $ fakeroot debian/rules binary-generic
如果没有问题,现在您可以在前一个内核之上安装固定内核:
$ cd .. $ sudo dpkg -i linux*.deb
重新启动,瞧:
$ sudo iw reg set US $ iw list ... Frequencies: * 5180 MHz [36] (17.0 dBm) * 5200 MHz [40] (17.0 dBm) * 5220 MHz [44] (17.0 dBm) * 5240 MHz [48] (17.0 dBm) * 5260 MHz [52] (23.0 dBm) (radar detection) * 5280 MHz [56] (23.0 dBm) (radar detection) * 5300 MHz [60] (23.0 dBm) (radar detection) * 5320 MHz [64] (23.0 dBm) (radar detection) * 5500 MHz [100] (23.0 dBm) (radar detection) * 5520 MHz [104] (23.0 dBm) (radar detection) * 5540 MHz [108] (23.0 dBm) (radar detection) * 5560 MHz [112] (23.0 dBm) (radar detection) * 5580 MHz [116] (23.0 dBm) (radar detection) * 5600 MHz [120] (23.0 dBm) (radar detection) * 5620 MHz [124] (23.0 dBm) (radar detection) * 5640 MHz [128] (23.0 dBm) (radar detection) * 5660 MHz [132] (23.0 dBm) (radar detection) * 5680 MHz [136] (23.0 dBm) (radar detection) * 5700 MHz [140] (23.0 dBm) (radar detection) * 5720 MHz [144] (23.0 dBm) (radar detection) * 5745 MHz [149] (30.0 dBm) * 5765 MHz [153] (30.0 dBm) * 5785 MHz [157] (30.0 dBm) * 5805 MHz [161] (30.0 dBm) * 5825 MHz [165] (30.0 dBm) ...
为了避免自动更新,您可能需要修复Linux内核版本 。构型
新的
hostapd
配置
hostapd
将非常简单:
hw_mode=a
包括5 GHz频带,而
ieee80211ac=1
包括802.11ac(VHT)。
country_code=US
的
ieee80211d=1
选项指定了我们运营所在的监管域。
为了充分利用带宽,
ht_capab
和
vht_capab
应该反映硬件功能:
$ iw list ... Band 1: Capabilities: 0x19e3 RX LDPC HT20/HT40 Static SM Power Save RX HT20 SGI RX HT40 SGI TX STBC RX STBC 1-stream Max AMSDU length: 7935 bytes DSSS/CCK HT40 ... Band 2: VHT Capabilities (0x338001b2): Max MPDU length: 11454 Supported Channel Width: neither 160 nor 80+80 RX LDPC short GI (80 MHz) TX STBC RX antenna pattern consistency TX antenna pattern consistency
考虑到这一点,
这是最终的 hostapd.conf
:
$ cat /etc/hostapd/hostapd.conf
请参阅 hostpad.conf
/usr/share/doc/hostapd/examples/hostapd.conf
文档 。
至此,无线路由器已完全运行,如果您需要更复杂的配置,则可以深入研究配置文件。
使用hostapd配置虚拟SSID
无论您是要为VPN配置访客访问点还是专用无线网络,都必须在某个时候配置虚拟SSID。
图表
根据
当前配置 ,这是我们想要获得的更新图。 假设
wlp5s0
是物理无线接口,则虚拟SSID将使用自己的
192.168.2.0/24
子网在
wlan0
虚拟接口上运行:

准备工作
首先,检查您的无线设备是否支持多个SSID:
$ iw list ... valid interface combinations: *
如您所见,该芯片组在一个通道上最多支持八个接入点。 这意味着您最多可以配置七个虚拟SSID,并且它们都将在同一通道上工作。
网络接口
根据hostapd.conf中的文档,物理接口的MAC地址与虚拟接口的BSSID之间存在严格的连接:
hostapd将基于配置的BSSID生成BSSID掩码。 hostapd将验证dev_addr和MASK == dev_addr 。 如果不是这种情况,则必须在启动hostapd之前更改无线电的MAC地址。 如果为每个辅助BSS配置了BSSID,则此限制不适用于hostapd,并且如果驱动程序支持,则可以使用其他掩码(例如,交换本地管理的位)
除非使用'bssid'参数指定了明确的BSSID,否则将按顺序将BSSID分配给每个BSS。
如果指定了显式的BSSID,则必须这样选择它:
-生成覆盖它和dev_addr的有效MASK
-与电台的MAC地址不同
-与任何其他明确指定的BSSID不同
为了满足这些要求并允许
hostapd
自动分配虚拟接口的BSSID,我们通过将四个最低有效位清零来更新物理无线接口的MAC地址。 这对于15个虚拟BSSID而言已足够-远远超出了必要。
首先,确定当前的MAC地址:
$ ip addr show wlp5s0 | grep link | awk '{print $2}' 44:c3:06:00:03:eb
如果清除最后四位并设置
U / L位 ,则将获得MAC地址
46:c3:06:00:03:e0
。
现在,我们将在加载接口之前更新配置以设置正确的MAC地址,并根据我们的示意图声明一个虚拟无线接口:
$ cat /etc/network/interfaces ...
太好了 我将
dnsmasq
用作DHCP服务器-随时替换为您喜欢的任何内容。 请注意,为使虚拟接口正常工作,需要
allow-hotplug
。
接入点配置
现在最简单的事情是:将虚拟SSID添加到当前的
hostapd
配置中。 只需将其添加
到现有
hostapd.conf
文件的末尾:
$ cat /etc/hostapd/hostapd.conf ...
在该示例中,我使用了WPA2加密,但是大多数无线接口选项都可以在此处使用(例如,
channel
)。 您只需根据已声明并正确配置的虚拟接口在配置文件中添加行即可添加更多虚拟SSID。
现在重新启动-并查看新的SSID和新的无线接口(注意MAC地址):
$ ip addr show wlan0 | grep link | awk '{print $2}' 46:c3:06:00:03:e1
就是这样!