Raspberry Pi + CentOS = Wi-Fi 热点(或带红帽的树莓路由器)

互联网上有大量关于基于 Raspberry 单板 PC 创建 Wi-Fi 接入点的信息。 通常,这意味着使用 Raspberry 原生的 Raspbian 操作系统。

作为基于 RPM 的系统的拥护者,我不能错过这个小奇迹而不尝试一下我心爱的 CentOS。

本文提供了如何使用基于 CentOS 操作系统的 Raspberry Pi 5 Model B+ 制作 3GHz/AC Wi-Fi 路由器的说明。 将会有一些标准但鲜为人知的技巧,并且作为奖励 - 将额外的 Wi-Fi 设备连接到 Raspberry 的绘图,使其能够同时在多种模式下运行(2,4+5GHz)。

Raspberry Pi + CentOS = Wi-Fi 热点(或带红帽的树莓路由器)
(免费提供的图像的混合)

让我们立即注意到,某些宇宙速度是行不通的。 我通过无线方式从 Raspberry 中挤出最大 100 Mbps 的速度,这涵盖了我的互联网提供商的速度。 如果理论上即使在 N 上也能达到半千兆位,为什么还需要这么慢的 AC? 如果你问过自己这个问题,那就去商店买一个真正的带有八根外置天线的路由器。

0. 你需要什么

  • 事实上,“树莓派产品”本身就是这样的:Pi 3 Model B+(实现令人垂涎的 5GHz 速度和通道);
  • 良好的 microSD >= 4GB;
  • 配备 Linux 和 microSD 读卡器/写入器的工作站;
  • 具备足够的 Linux 技能,本文适合经过培训的 Geek;
  • Raspberry 和 Linux 之间的有线网络 (eth0) 连接,在本地网络上运行 DHCP 服务器,并从两个设备访问互联网。

对最后一点的一个小评论。 “先有鸡蛋还是先有……”在没有任何上网设备的情况下如何制作Wi-Fi路由器? 让我们把这个有趣的练习放在本文的讨论范围之外,简单地假设 Raspberry 通过电线连接到本地网络并可以访问互联网。 在这种情况下,我们不需要额外的电视和操纵器来设置“树莓派”。

1.安装CentOS

项目主页

在撰写本文时,设备上运行的 CentOS 版本是 32 位。 我在万维网上的某个地方看到一些观点,认为 64 位 ARM 架构上的此类操作系统的性能降低了 20% 之多。 我将不做任何评论地离开这一刻。

在 Linux 上,下载带有内核的最小映像“-RaspberryPI-“并将其写入 microSD:

# xzcat CentOS-Userland-7-armv7hl-RaspberryPI-Minimal-1810-sda.raw.xz | 
  dd of=/dev/mmcblk0 bs=4M
# sync

在开始使用该映像之前,我们将从其中删除 SWAP 分区,将根目录扩展到整个可用卷并摆脱 SELinux。 该算法很简单:在 Linux 上制作根目录的副本,删除 microSD 中除第一个 (/boot) 之外的所有分区,创建新的根目录并从副本中返回其内容。

所需操作的示例(严重控制台输出)

# mount /dev/mmcblk0p3 /mnt
# cd /mnt
# tar cfz ~/pi.tgz . --no-selinux
# cd
# umount /mnt

# parted /dev/mmcblk0

(parted) unit s
(parted) print free
Model: SD SC16G (sd/mmc)
Disk /dev/mmcblk0: 31116288s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start     End        Size       Type     File system     Flags
        63s       2047s      1985s               Free Space
 1      2048s     1370111s   1368064s   primary  fat32           boot, lba
 2      1370112s  2369535s   999424s    primary  linux-swap(v1)
 3      2369536s  5298175s   2928640s   primary  ext4
        5298176s  31116287s  25818112s           Free Space

(parted) rm 3
(parted) rm 2

(parted) print free
Model: SD SC16G (sd/mmc)
Disk /dev/mmcblk0: 31116288s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start     End        Size       Type     File system  Flags
        63s       2047s      1985s               Free Space
 1      2048s     1370111s   1368064s   primary  fat32        boot, lba
        1370112s  31116287s  29746176s           Free Space

(parted) mkpart
Partition type?  primary/extended? primary
File system type?  [ext2]? ext4
Start? 1370112s
End? 31116287s

(parted) set
Partition number? 2
Flag to Invert? lba
New state?  on/[off]? off

(parted) print free
Model: SD SC16G (sd/mmc)
Disk /dev/mmcblk0: 31116288s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start     End        Size       Type     File system  Flags
        63s       2047s      1985s               Free Space
 1      2048s     1370111s   1368064s   primary  fat32        boot, lba
 2      1370112s  31116287s  29746176s  primary  ext4

(parted) quit

# mkfs.ext4 /dev/mmcblk0p2 
mke2fs 1.44.6 (5-Mar-2019)
/dev/mmcblk0p2 contains a swap file system labelled '_swap'
Proceed anyway? (y,N) y
Discarding device blocks: done                            
Creating filesystem with 3718272 4k blocks and 930240 inodes
Filesystem UUID: 6a1a0694-8196-4724-a58d-edde1f189b31
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done   

# mount /dev/mmcblk0p2 /mnt
# tar xfz ~/pi.tgz -C /mnt --no-selinux

解压根分区的内容后,是时候对其进行一些更改了。

禁用 SELinux /mnt/etc/selinux/config:

SELINUX=disabled

编辑 /mnt/etc/fstab,其中只留下有关分区的两个条目:boot(/boot,没有更改)和root(我们更改了UUID值,可以通过研究Linux上blkid命令的输出来找到该值):

UUID=6a1a0694-8196-4724-a58d-edde1f189b31  /     ext4    defaults,noatime 0 0
UUID=6938-F4F2                             /boot vfat    defaults,noatime 0 0

最后,我们更改内核启动参数:为根分区指定新位置,禁用调试信息的输出并(可选)禁止内核在网络接口上分配 IPv6 地址:

# cd
# umount /mnt
# mount /dev/mmcblk0p1 /mnt

这是内容 /mnt/cmdline.txt 为以下形式(一行,无连字符):

root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait quiet ipv6.disable_ipv6=1

表面处理:

# cd
# umount /mnt
# sync

我们将 microSD 重新排列到“raspberry”中,启动它并通过 ssh (root/centos) 对其进行网络访问。

2. 设置 CentOS

前三个不可动摇的动作: passwd文件, yum -y更新, 重新启动.

我们放弃网络管理 网络化:

# yum install systemd-networkd
# systemctl enable systemd-networkd
# systemctl disable NetworkManager
# chkconfig network off

创建文件(连同目录) /etc/systemd/network/eth0.network:

[Match]
Name=eth0

[Network]
DHCP=ipv4

我们重新启动“raspberry”并再次通过 ssh 对其进行网络访问(IP 地址可能会更改)。 注意使用的东西 / etc / resolv.conf中,由网络管理器先前创建。 因此,如果解决时出现问题,请编辑其内容。 使用 系统解析 我们不会。

我们删除“不必要的”,修复并加快操作系统的加载速度:

# systemctl set-default multi-user.target
# yum remove GeoIP Network* aic* alsa* cloud-utils-growpart 
  cronie* dhc* firewal* initscripts iwl* kexec* logrotate 
  postfix rsyslog selinux-pol* teamd wpa_supplicant

谁需要 cron的 谁不消化内置的 系统定时器,可以确定缺失的内容。 在/ var /日志- 并查看 日记。 如果您需要日志历史记录(默认情况下,仅从系统启动时开始存储信息):

# mkdir /var/log/journal
# systemd-tmpfiles --create --prefix /var/log/journal
# systemctl restart systemd-journald
# vi /etc/systemd/journald.conf

禁止基本服务使用 IPv6(如果需要)的/ etc / SSH / sshd_config中:

AddressFamily inet

/etc/sysconfig/chronyd:

OPTIONS="-4"

时间对“覆盆子”的相关性很重要。 由于开箱即用的硬件没有能力在重新启动时保存时钟的当前状态,因此需要同步。 一个非常好的和快速的守护进程是 年代 - 已安装并自动启动。 您可以将 NTP 服务器更改为最近的服务器。

/etc/chrony.conf:

server 0.ru.pool.ntp.org iburst
server 1.ru.pool.ntp.org iburst
server 2.ru.pool.ntp.org iburst
server 3.ru.pool.ntp.org iburst

要设置我们将使用的时区 特技。 由于我们的目标是创建一款工作在 5GHz 频率的 Wi-Fi 路由器,因此我们会提前做好准备,迎接惊喜 调节器:

# 百胜信息 cda
摘要:802.11 无线网络的监管合规守护进程

这种同样基于时区的邪恶设计“禁止”使用(在俄罗斯)5GHz频率和“高”数字的频道。 技巧是在不使用大陆/城市名称的情况下设置时区,即,而不是:

# timedatectl set-timezone Europe/Moscow

我们按:

# timedatectl set-timezone Etc/GMT-3

对系统发型的最后修改:

# hostnamectl set-hostname router

/root/.bash_profile:

. . .

# User specific environment and startup programs

export PROMPT_COMMAND="vcgencmd measure_temp"
export LANG=en_US.UTF-8
export PATH=$PATH:$HOME/bin

3. CentOS 附加组件

上面所说的一切都可以被视为在 Raspberry Pi 上安装“vanilla”CentOS 的完整说明。 您最终应该得到一台在 10 秒内(重新)启动的 PC,使用少于 15 MB 的 RAM 和 1.5 GB 的 microSD(由于 /boot 不完整,实际上少于 1 GB,但说实话)。

要在此系统上安装 Wi-Fi 接入点软件,您需要稍微扩展标准 CentOS 发行版的功能。 首先,我们来升级内置Wi-Fi适配器的驱动程序(固件)。 项目主页说:

Raspberry 3B 和 3B+ 上的 Wifi

CentOS 项目不允许分发 Raspberry PI 3B/3B+ 固件文件。 您可以使用以下文章来了解问题、获取固件并设置 wifi。

CentOS 项目所禁止的内容并不禁止我们个人使用。 我们将 CentOS 中的分发 Wi-Fi 固件替换为 Broadcom 开发人员的相应固件(那些同样令人讨厌的二进制 blob...)。 特别是,这将允许您在接入点模式下使用 AC。

Wi-Fi固件升级查看设备型号和当前固件版本:

# journalctl | grep $(basename $(readlink /sys/class/net/wlan0/device/driver))
Jan 01 04:00:03 router kernel: brcmfmac: F1 signature read @0x18000000=0x15264345
Jan 01 04:00:03 router kernel: brcmfmac: brcmf_fw_map_chip_to_name: using brcm/brcmfmac43455-sdio.bin for chip 0x004345(17221) rev 0x000006
Jan 01 04:00:03 router kernel: usbcore: registered new interface driver brcmfmac
Jan 01 04:00:03 router kernel: brcmfmac: brcmf_c_preinit_dcmds: Firmware version = wl0: Mar  1 2015 07:29:38 version 7.45.18 (r538002) FWID 01-6a2c8ad4
Jan 01 04:00:03 router kernel: brcmfmac: brcmf_c_preinit_dcmds: CLM version = API: 12.2 Data: 7.14.8 Compiler: 1.24.9 ClmImport: 1.24.9 Creation: 2014-09-02 03:05:33 Inc Data: 7.17.1 Inc Compiler: 1.26.11 Inc ClmImport: 1.26.11 Creation: 2015-03-01 07:22:34 

我们看到固件版本为 7.45.18,日期为 01.03.2015/XNUMX/XNUMX,并记住以下一组数字: 43455 (brcmfmac43455-sdio.bin)。

下载当前的 Raspbian 镜像。 懒人可以将映像写入 microSD 并从那里获取带有固件的文件。 或者您可以在 Linux 中挂载映像的根分区并从那里复制您需要的内容:

# wget https://downloads.raspberrypi.org/raspbian_lite_latest
# unzip -p raspbian_lite_latest > raspbian.img
# fdisk -l raspbian.img
Disk raspbian.img: 2 GiB, 2197815296 bytes, 4292608 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x17869b7d

Device        Boot  Start     End Sectors  Size Id Type
raspbian.img1        8192  532480  524289  256M  c W95 FAT32 (LBA)
raspbian.img2      540672 4292607 3751936  1.8G 83 Linux

# mount -t ext4 -o loop,offset=$((540672 * 512)) raspbian.img /mnt
# cp -fv /mnt/lib/firmware/brcm/*43455* ...
'/mnt/lib/firmware/brcm/brcmfmac43455-sdio.bin' -> ...
'/mnt/lib/firmware/brcm/brcmfmac43455-sdio.clm_blob' -> ...
'/mnt/lib/firmware/brcm/brcmfmac43455-sdio.txt' -> ...
# umount /mnt

必须将生成的 Wi-Fi 适配器固件文件复制并替换为“raspberry”到目录中 /usr/lib/固件/brcm/

我们重启未来的路由器,满意地微笑:

# journalctl | grep $(basename $(readlink /sys/class/net/wlan0/device/driver))
Jan 01 04:00:03 router kernel: brcmfmac: F1 signature read @0x18000000=0x15264345
Jan 01 04:00:03 router kernel: brcmfmac: brcmf_fw_map_chip_to_name: using brcm/brcmfmac43455-sdio.bin for chip 0x004345(17221) rev 0x000006
Jan 01 04:00:03 router kernel: usbcore: registered new interface driver brcmfmac
Jan 01 04:00:03 router kernel: brcmfmac: brcmf_c_preinit_dcmds: Firmware version = wl0: Feb 27 2018 03:15:32 version 7.45.154 (r684107 CY) FWID 01-4fbe0b04
Jan 01 04:00:03 router kernel: brcmfmac: brcmf_c_preinit_dcmds: CLM version = API: 12.2 Data: 9.10.105 Compiler: 1.29.4 ClmImport: 1.36.3 Creation: 2018-03-09 18:56:28 

版本:7.45.154,日期为 27.02.2018 年 XNUMX 月 XNUMX 日。

当然还有 EPEL:

# cat > /etc/yum.repos.d/epel.repo << EOF
[epel]
name=Epel rebuild for armhfp
baseurl=https://armv7.dev.centos.org/repodir/epel-pass-1/
enabled=1
gpgcheck=0
EOF

# yum clean all
# rm -rfv /var/cache/yum
# yum update

4. 网络配置和面临的挑战

正如我们上面同意的,“树莓派”通过“线路”连接到本地网络。 我们假设提供商以完全相同的方式提供 Internet 访问:公共网络上的地址由 DHCP 服务器动态发布(可能带有 MAC 绑定)。 在这种情况下,在对树莓派进行最终设置后,您只需将提供商的电缆“插入”即可。 授权使用 系统网络 - 该主题是另一篇文章的主题,此处不进行讨论。

Raspberry 的 Wi-Fi 接口是本地网络,内置以太网适配器 (eth0) 是外部网络。 让我们对本地网络进行静态编号,例如:192.168.0.0/24。 树莓派地址:192.168.0.1。 DHCP 服务器将在外部网络(Internet)上运行。

命名一致性问题 и 危地马拉著名程序员 - 任何在 systemd 发行版中配置网络接口和服务的人都会遇到两个麻烦。

平行混沌(抒情题外话)Lennart Pottering 编写了自己的程序 systemd 非常好。 这 systemd 启动其他项目的速度如此之快,以至于他们没有时间从裁判的哨声中恢复过来,甚至在开始障碍训练之前就绊倒了。

但说实话,对于经验丰富的顺序 LSB 专家来说,systemd 操作系统启动时启动的进程的积极并行化是一种“驴桥”。 幸运的是,给这种“并行混乱”带来秩序其实很简单,尽管并不总是那么明显。

我们创建两个具有常量名称的虚拟桥接口: 局域网 и 苍白。 我们将 Wi-Fi 适配器“连接”到第一个适配器,将 eth0“raspberry”“连接”到第二个适配器。

/etc/systemd/network/lan.netdev:

[NetDev]
Name=lan
Kind=bridge

/etc/systemd/network/lan.network:

[Match]
Name=lan

[Network]
Address=192.168.0.1/24
IPForward=yes

/etc/systemd/network/wan.netdev:

[NetDev]
Name=wan
Kind=bridge
#MACAddress=xx:xx:xx:xx:xx:xx

/etc/systemd/network/wan.network:

[Match]
Name=wan

[Network]
DHCP=ipv4
IPForward=yes

IP转发=是 无需通过 sysctl 提示内核来启用路由。
MAC地址= 如果需要的话,让我们取消注释并进行更改。

首先我们“连接”eth0。 我们记住“一致性问题”,只使用该接口的MAC地址,例如可以这样找到:

# cat /sys/class/net/eth0/address 

创建 /etc/systemd/network/eth.network:

[Match]
MACAddress=b8:27:eb:xx:xx:xx

[Network]
Bridge=wan

我们删除之前的配置文件eth0,重新启动Raspberry并获得对其的网络访问权限(IP地址很可能会改变):

# rm -fv /etc/systemd/network/eth0.network
# reboot

5.DNSMASQ

对于制作 Wi-Fi 接入点,没有什么比一对甜蜜的情侣更好的了 域名 + hostapd 还没弄清楚。 在我看来。

万一有人忘记了,那么……hostapd - 这是控制 Wi-Fi 适配器的东西(特别是,它将负责将它们连接到虚拟 局域网 “覆盆子”),授权并注册无线客户端。

域名 — 配置客户端的网络堆栈:发布 IP 地址、DNS 服务器、默认网关和类似的功能。

让我们从 dnsmasq 开始:

# yum install dnsmasq

模式 / etc / resolv.conf中:

nameserver 1.1.1.1
nameserver 1.0.0.1
nameserver 8.8.8.8
nameserver 8.8.4.4
nameserver 77.88.8.8
nameserver 77.88.8.1
domain router.local
search router.local

根据您的喜好进行编辑。

简约 /etc/dnsmasq.conf:

domain-needed
bogus-priv
interface=lan
bind-dynamic
expand-hosts
domain=#
dhcp-range=192.168.0.100,192.168.0.199,255.255.255.0,24h
conf-dir=/etc/dnsmasq.d

这里的“魔力”在于参数 动态绑定,它告诉 dnsmasq 守护进程等待它出现在系统上 接口=局域网,并没有因为开始后的一阵骄傲的孤独而晕倒。

# systemctl enable dnsmasq
# systemctl start dnsmasq; journalctl -f

6. 主机PD

最后是神奇的 hostapd 配置。 我毫不怀疑有人阅读这篇文章就是为了寻找这些珍贵的台词。

在安装hostapd之前,需要克服“一致性问题”。 当连接额外的 USB Wi-Fi 设备时,内置 Wi-Fi 适配器 wlan0 可以轻松将其名称更改为 wlan1。 因此,我们将通过以下方式修复接口名称:我们将为(无线)适配器提供唯一的名称并将它们绑定到 MAC 地址。

对于内置Wi-Fi适配器,仍然是wlan0:

# cat /sys/class/net/wlan0/address 
b8:27:eb:xx:xx:xx

创建 /etc/systemd/network/wl0.link:

[Match]
MACAddress=b8:27:eb:xx:xx:xx

[Link]
Name=wl0

现在我们将确定 wl0 - 这是内置 Wi-Fi。 我们重新启动 Raspberry 以确保这一点。

安装:

# yum install hostapd wireless-tools

配置文件 /etc/hostapd/hostapd.conf:

ssid=rpi
wpa_passphrase=1234567890

channel=36

country_code=US

interface=wl0
bridge=lan

driver=nl80211

auth_algs=1
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

macaddr_acl=0

hw_mode=a
wmm_enabled=1

# N
ieee80211n=1
require_ht=1
ht_capab=[MAX-AMSDU-3839][HT40+][SHORT-GI-20][SHORT-GI-40][DSSS_CCK-40]

# AC
ieee80211ac=1
require_vht=1
ieee80211d=0
ieee80211h=0
vht_capab=[MAX-AMSDU-3839][SHORT-GI-80]
vht_oper_chwidth=1
vht_oper_centr_freq_seg0_idx=42

一刻也不忘 紧急委员会,更改我们需要的参数并手动检查功能:

# hostapd /etc/hostapd/hostapd.conf

hostapd 将以交互模式启动,将其状态广播到控制台。 如果没有错误,则支持 AC 模式的客户端将能够连接到接入点。 要停止 hostapd - Ctrl-C。

剩下的就是在系统启动时启用hostapd。 如果您执行标准操作(systemctl启用hostapd),那么在下次重新启动后,您会得到一个“在血液中滚动”的恶魔,并诊断为“未找到接口 wl0”。 由于“并行混乱”,hostapd 的启动速度比内核找到无线适配器的速度快。

互联网上有很多补救措施:从启动守护进程之前强制超时(几分钟),到另一个监视界面外观并(重新)启动主机板的守护进程。 这些解决方案非常可行,但非常丑陋。 我们向伟人寻求帮助 systemd 及其“目标”、“任务”和“依赖性”。

将分发服务文件复制到 /etc/systemd/system/hostapd.service:

# cp -fv /usr/lib/systemd/system/hostapd.service /etc/systemd/system

并将其内容简化为以下形式:

[Unit]
Description=Hostapd IEEE 802.11 AP, IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authenticator
After=sys-subsystem-net-devices-wl0.device
BindsTo=sys-subsystem-net-devices-wl0.device

[Service]
Type=forking
PIDFile=/run/hostapd.pid
ExecStart=/usr/sbin/hostapd /etc/hostapd/hostapd.conf -P /run/hostapd.pid -B

[Install]
WantedBy=sys-subsystem-net-devices-wl0.device

更新后的服务文件的魔力在于hostapd与新目标——wl0接口的动态绑定。 当界面出现时,守护进程启动;当界面消失时,守护进程停止。 而且这一切都是在线的 - 无需重新启动系统。 当将 USB Wi-Fi 适配器连接到 Raspberry 时,此技术特别有用。

现在你可以:

# systemctl enable hostapd
# reboot

7.IP表

“世界卫生大会???” © 是的,是的! 没有任何 systemd。 没有新奇的联合收割机(形式为 firewalld),最终会做同样的事情。

让我们使用旧的 iptables的,其服务启动后会将网络规则加载到内核中并悄悄关闭,不驻留,不消耗资源。 systemd 有一个优雅的 IP伪装=,但我们仍然会将地址转换(NAT)和防火墙委托给 iptables。

安装:

# yum install iptables-services
# systemctl enable iptables ip6tables

我更喜欢将 iptables 配置存储为脚本(示例):

#!/bin/bash

#
# Disable IPv6
#
ip6tables --flush
ip6tables --delete-chain

ip6tables --policy INPUT   DROP
ip6tables --policy FORWARD DROP
ip6tables --policy OUTPUT  DROP

ip6tables-save > /etc/sysconfig/ip6tables
systemctl restart ip6tables

#
# Cleaning
#
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

#
# Loopback, lan
#
iptables -A INPUT -i lo  -j ACCEPT
iptables -A INPUT -i lan -j ACCEPT

#
# Ping, Established
#
iptables -A INPUT -p icmp  --icmp-type echo-request    -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#
# NAT
#
iptables -t nat -A POSTROUTING -o wan -j MASQUERADE

#
# Saving
#
iptables-save > /etc/sysconfig/iptables
systemctl restart iptables

我们执行上述脚本并失去与 Raspberry 建立新的有线 SSH 连接的能力。 没错,我们制作了一个 Wi-Fi 路由器,默认情况下禁止“通过互联网”访问 - 现在只能“通过无线”访问。 我们连接提供商的以太网电缆并开始冲浪!

8.奖励:+2,4GHz

当我使用上述图纸组装第一台树莓派路由器时,我发现家里的许多小工具由于 Wi-Fi 设计的限制,根本看不到“树莓派”。 重新配置路由器使其在 802.11b/g/n 下工作是不公平的,因为在这种情况下“无线”的最大速度不超过 40 Mbit,而我最喜欢的互联网提供商为我提供了 100 Mbit(通过电缆)。

事实上,这个问题的解决方案已经被发明出来:第二个 Wi-Fi 接口以 2,4 GHz 频率运行,以及第二个接入点。 在附近的一个摊位上,我买的不是第一个,而是第二个我遇到的 USB Wi-Fi“口哨”。 卖家被有关芯片组、与 ARM Linux 内核的兼容性以及在 AP 模式下工作的可能性的问题所困扰(他是第一个开始的)。

我们通过类比内置Wi-Fi适配器来配置“口哨”。

首先,我们将其重命名为 wl1:

# cat /sys/class/net/wlan0/address 
b0:6e:bf:xx:xx:xx

/etc/systemd/network/wl1.link:

[Match]
MACAddress=b0:6e:bf:xx:xx:xx

[Link]
Name=wl1

我们将把新 Wi-Fi 接口的管理委托给一个单独的 hostapd 守护进程,该守护进程将根据系统中严格定义的“口哨”的存在来启动和停止:wl1。

配置文件 /etc/hostapd/hostapd2.conf:

ssid=rpi2
wpa_passphrase=1234567890

#channel=1
#channel=6
channel=11

interface=wl1
bridge=lan

driver=nl80211

auth_algs=1
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

macaddr_acl=0

hw_mode=g
wmm_enabled=1

# N
ieee80211n=1
require_ht=1
ht_capab=[HT40][SHORT-GI-20][SHORT-GI-40][DSSS_CCK-40]

该文件的内容直接取决于 USB Wi-Fi 适配器的型号,因此普通的复制/粘贴可能会失败。

将分发服务文件复制到 /etc/systemd/system/hostapd2.service:

# cp -fv /usr/lib/systemd/system/hostapd.service /etc/systemd/system/hostapd2.service

并将其内容简化为以下形式:

[Unit]
Description=Hostapd IEEE 802.11 AP, IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authenticator
After=sys-subsystem-net-devices-wl1.device
BindsTo=sys-subsystem-net-devices-wl1.device

[Service]
Type=forking
PIDFile=/run/hostapd2.pid
ExecStart=/usr/sbin/hostapd /etc/hostapd/hostapd2.conf -P /run/hostapd2.pid -B

[Install]
WantedBy=sys-subsystem-net-devices-wl1.device

剩下的就是启用一个新的 hostapd 实例:

# systemctl enable hostapd2

就这样! 拉起“口哨”和“覆盆子”本身,看看你周围的无线网络。

最后,我想提醒您注意 Raspberry 的 USB Wi-Fi 适配器和电源的质量。 连接的“热哨子”有时会因短期电气故障而导致“覆盆子冻结”。

来源: habr.com

添加评论