DIY无线路由器


  1. 元件选择
  2. 启动网络接口
  3. 设置802.11ac接入点(5 GHz)
  4. 使用hostapd配置虚拟SSID

在过去的十年中,我购买了廉价的网络设备,并在其上安装了DD-WRT ,以使“功能”以超过500美元的价格从Linux内核中删除,而后者是基础固件。

尽管存在不稳定的版本,未纠正的错误和纠纷 ,但DD-WRT仍然比库存固件更可取。 但是现在有价值的组件比以往任何时候都更便宜,并且DIY社区已经完全转换为Linux(我正在找您,Raspberry先生),那么为什么不一劳永逸地构建自己的无线路由器呢?

元件选择


首先,您需要确定平台: x86ARM ? 我不会详细讨论主要的区别 ,而是简要地介绍一下:前者具有更好的性能,而后者则更便宜且更节能。 Raspberry Pi板(和等效产品)非常便宜,并且可能比大多数无线商用路由器功能更强大,但是x86平台已普及并且具有标准化的外形尺寸和扩展端口的优势。

当然,最重要的细节是芯片组。 今天,事实上的标准是802.11n (2.4 GHz)和802.11ac (5 GHz),但是为Linux选择驱动程序仍然是一个挑战 ,尤其是在支持AP(接入点)模式的情况下。 简而言之,如果您不希望出现问题,请选择Atheros芯片组。 很好地支持ath9kath10k驱动程序 ,您可以通过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: enp1s0enp2s0 。 无线网卡显示为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 # Loopback auto lo iface lo inet loopback # WAN interface auto enp1s0 iface enp1s0 inet dhcp # Bridge (LAN) auto br0 iface br0 inet static address 192.168.1.1 network 192.168.1.0 netmask 255.255.255.0 broadcast 192.168.1.255 bridge_ports enp2s0 post-up /usr/sbin/dnsmasq \ --pid-file=/var/run/dnsmasq.$IFACE.pid \ --dhcp-leasefile=/var/lib/misc/dnsmasq.$IFACE.leases \ --conf-file=/dev/null \ --interface=$IFACE --except-interface=lo \ --bind-interfaces \ --dhcp-range=192.168.1.10,192.168.1.150,24h pre-down cat /var/run/dnsmasq.$IFACE.pid | xargs kill 

文档/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( enp1s0enp1s0之间路由数据包,并启用网络地址转换

启用数据包转发很容易:

 $ 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 # Accept all client traffic on WAN interface enp1s0 wan client all accept # Accept all traffic on LAN interface br0 lan server all accept client all accept # Route packets between LAN and WAN router lan2wan inface br0 outface enp1s0 masquerade route all accept 

FireHOL是人们为人们编写的, 这里是文档。

您可以通过手动启动fireholsudo firehol start )并将便携式计算机连接到LAN端口来检查设置: 现在,如果已连接WAN端口,则可以联机

重新引导之前,请确保编辑/etc/default/firehol以允许FireHol在引导时启动:

 $ sudo sed -i -E "s/^START_FIREHOL=.+$/START_FIREHOL=YES/g" /etc/default/firehol 

我不会详细介绍整个firehol语法,配置文件会自行说明 ,如果配置更复杂,建议您firehol 文档 如果您真的对fireholiptables做了什么感兴趣,只需在命令行中输入sudo firehol status

无线热点


显然,我们将使用hostapd管理访问点:

 $ sudo apt-get install hostapd 

在下面,您将找到最小且几乎无法解释的802.11 n / 2.4 Ghz / WPA2-AES配置文件:

 $ cat /etc/hostapd/hostapd-simple.conf #### Interface configuration #### interface=wlp5s0 bridge=br0 driver=nl80211 ##### IEEE 802.11 related configuration ##### ssid=iCanHearYouHavingSex hw_mode=g channel=1 auth_algs=1 wmm_enabled=1 ##### IEEE 802.11n related configuration ##### ieee80211n=1 ##### WPA/IEEE 802.11i configuration ##### wpa=2 wpa_key_mgmt=WPA-PSK rsn_pairwise=CCMP wpa_passphrase=YouCantGuess 

请参阅 hostpad.conf /usr/share/doc/hostapd/examples/hostapd.conf文档

可以手动测试描述的配置:

 $ sudo hostapd /etc/hostapd/hostapd-simple.conf 

如果一切顺利, 将出现无线连接 。 如果您对结果感到满意, 请不要忘记更改配置以在接口上升后立即启动hostapd (如下所示)。

这是您的最终/etc/network/interfaces:

 $ cat /etc/network/interfaces # Loopback auto lo iface lo inet loopback # WAN interface auto enp1s0 iface enp1s0 inet dhcp # Bridge (LAN) auto br0 iface br0 inet static address 192.168.1.1 network 192.168.1.0 netmask 255.255.255.0 broadcast 192.168.1.255 bridge_ports enp2s0 post-up /usr/sbin/hostapd \ -P /var/run/hostapd.$IFACE.pid \ -B /etc/hostapd/hostapd-simple.conf post-up /usr/sbin/dnsmasq \ --pid-file=/var/run/dnsmasq.$IFACE.pid \ --dhcp-leasefile=/var/lib/misc/dnsmasq.$IFACE.leases \ --conf-file=/dev/null \ --interface=$IFACE --except-interface=lo \ --bind-interfaces \ --dhcp-range=192.168.1.10,192.168.1.150,24h pre-down cat /var/run/dnsmasq.$IFACE.pid | xargs kill pre-down cat /var/run/hostapd.$IFACE.pid | xargs kill 

设置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=USieee80211d=1选项指定了我们运营所在的监管域。

为了充分利用带宽, ht_capabvht_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 #### Interface configuration #### interface=wlp5s0 bridge=br0 driver=nl80211 ##### IEEE 802.11 related configuration ##### ssid=iCanHearYouHavingSex hw_mode=a channel=0 auth_algs=1 wmm_enabled=1 country_code=US ieee80211d=1 ieee80211h=0 ##### IEEE 802.11n related configuration ##### ieee80211n=1 ht_capab=[HT40+][SHORT-GI-20][SHORT-GI-40][TX-STBC][RX-STBC1][DSSS_CK-40][LDPC][MAX-AMSDU-7935] ##### IEEE 802.11ac related configuration ##### ieee80211ac=1 vht_capab=[MAX-MPDU-11454][RXLDPC][SHORT-GI-80][TX-STBC-2BY1][RX-STBC-1][MAX-A-MPDU-LEN-EXP7][TX-ANTENNA-PATTERN][RX-ANTENNA-PATTERN] vht_oper_chwidth=1 ##### WPA/IEEE 802.11i configuration ##### wpa=2 wpa_key_mgmt=WPA-PSK rsn_pairwise=CCMP wpa_passphrase=YouCantGuess 

请参阅 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: * #{ AP, mesh point } <= 8, total <= 8, #channels <= 1, STA/AP BI must match ... 

如您所见,该芯片组在一个通道上最多支持八个接入点。 这意味着您最多可以配置七个虚拟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 ... # Physical Wireless auto wlp5s0 iface wlp5s0 inet manual pre-up ip link set dev wlp5s0 address 46:c3:06:00:03:e0 # Virtual Wireless allow-hotplug wlan0 iface wlan0 inet static address 192.168.2.1 network 192.168.2.0 netmask 255.255.255.0 broadcast 192.168.2.255 post-up /usr/sbin/dnsmasq \ --pid-file=/var/run/dnsmasq-wlan0.pid \ --conf-file=/dev/null \ --interface=wlan0 --except-interface=lo \ --bind-interfaces \ --dhcp-range=192.168.2.10,192.168.2.150,24h post-down cat /var/run/dnsmasq-wlan0.pid | xargs kill ... 

太好了 我将dnsmasq用作DHCP服务器-随时替换为您喜欢的任何内容。 请注意,为使虚拟接口正常工作,需要allow-hotplug

接入点配置


现在最简单的事情是:将虚拟SSID添加到当前的hostapd配置中。 只需将其添加现有hostapd.conf文件的末尾:

 $ cat /etc/hostapd/hostapd.conf ... ### Virtual SSID(s) ### bss=wlan0 ssid=MyVirtualSSID wpa=2 wpa_key_mgmt=WPA-PSK rsn_pairwise=CCMP wpa_passphrase=you_cant_guess 

在该示例中,我使用了WPA2加密,但是大多数无线接口选项都可以在此处使用(例如, channel )。 您只需根据已声明并正确配置的虚拟接口在配置文件中添加行即可添加更多虚拟SSID。

现在重新启动-并查看新的SSID和新的无线接口(注意MAC地址):

 $ ip addr show wlan0 | grep link | awk '{print $2}' 46:c3:06:00:03:e1 

就是这样!

Source: https://habr.com/ru/post/zh-CN437634/


All Articles