使用 Raspberry Pi 3 创建一个 wifi 热点和 Fedora

如果你已经在跑步 Fedora 在你的树莓派上,你已经在大多数情况下访问 wifi 热点了。 Raspberry Pi 有一个 wifi 接口,通常设置为加入现有的 wifi 网络。 可以重新配置此接口以提供新的 wifi 网络。 如果房间有良好的网线和糟糕的 wifi 信号(砖墙、箔背石膏板,甚至带有金属氧化物涂层的窗户都是障碍),请用您的 Pi 修复它。

本文介绍了设置热点的过程。 它在第三代 Pis 上进行了测试 – a B型 v1.2, 和 B+型 (年龄越大 2 和新的 4 未测试)。 这些是信用卡大小的 Pis,已经存在了几年。

本文还深入探讨了幕后的网络概念。 例如,“热点”这个词在世界各地的公共场所都很流行,但使用术语WLAN AP(无线局域网接入点)更准确。 事实上,如果你想惹恼你的友好邻居网络管理员,将热点称为“wifi 路由器”。 不准确会使他们的眼睛交叉。

一些 nmcli 命令将 Raspberry Pi 配置为 wifi AP。 nmcli 命令行工具控制 NetworkManager 守护程序。 它不是唯一可用的网络配置系统。 更复杂的解决方案可供喜欢冒险的人使用。 查看 主机 RPM 包和 OpenWRT 发行版. 查看与 NetworkManager 的 Internet 连接共享以获取更多想法。

深入了解网络管理

热点是路由AP(接入点)。 它位于两个网络(当前的有线网络和新的无线网络)之间,负责它们之间 IP 数据包的邮局式转发。

路由和接口

树莓派上的无线接口命名为 无线局域网0 有线的是 eth0. 新的无线网络使用一个 IP 地址范围,而当前的有线网络使用另一个。 在本例中,当前网络范围为 192.168.0.0/24,新网络范围为 10.42.0.0/24。 如果这些数字没有意义,那没关系。 您可以继续操作而无需处理 IP 子网和网络掩码。 Raspberry Pi 的两个接口具有来自这些范围的 IP 地址。

数据包根据其 IP 地址发送到本地计算机或远程目标。 这是路由工作,它是路由 AP 名称的路由部分的来源。 如果您想使用 DHCP 和 DNS 构建更复杂的路由器,请从文章如何使用中获取一些技巧 Fedora 服务器创建一个路由器/网关。

这不是桥接 AP

Netowrk 桥接是另一种扩展网络的方式,但这不是这个 Pi 的设置方式。 此路由 AP 不是桥接 AP。 要了解路由和桥接之间的区别,您必须对 OSI 网络模型的网络层有所了解。 一个好的起点是 Linux 网络故障排除初学者指南. 这是简短的回答。

  • 第 3 层,网络 ← 是的,我们路由的 AP 就在这里。
  • 第 2 层,数据链路 ← 不,它不是桥接 AP。
  • 第 1 层,物理 ← 此处涵盖无线电传输。

一种 在网络堆栈的较低层工作——它使用以太网 MAC 地址发送数据。 如果这是一个桥接 AP,它不会有两组 IP 地址; 新的无线网络和当前的有线网络将使用相同的 IP 子网。

IP伪装

在 Internet 上的任何地方都找不到以 10. 开头的 IP 地址。 这是一个私人地址,而不是公共地址。 要将 IP 数据包路由出 wifi 网络并再次返回,必须更改数据包地址。 IP伪装 是使这种路由工作的一种方式。 使用伪装名称是因为数据包的真实地址是隐藏的。 有线网络看不到来自无线网络的任何地址。

IP 伪装由 NetworkManager 自动设置。 NetworkManager 添加 nftables 规则来处理 IP伪装.

Pi 的网络堆栈

一堆网络硬件和软件使wifi工作。

  • 网络硬件
  • 内核空间软件
  • 用户空间软件

可以看到网络硬件。 Raspberry Pi 有两个主要的硬件组件——一个微型天线和 Broadcom wifi 芯片。 MagPi 杂志有一些很棒的照片.

内核软件提供管道。 没有必要直接处理这些 – 一切都很好 Fedora 分配。

  • 博通驱动模块 与硬件交谈。 用命令 lsmod | 列出这些 grep brcm。
  • TCP/IP 堆栈处理协议。
  • 网络过滤器框架 过滤数据包。
  • 一个网络系统将所有这些联系在一起。

用户空间软件定制系统。 它充满了帮助用户、与内核对话或将其他实用程序连接在一起的实用程序。 例如, 防火墙-cmd 工具与 防火墙服务, firewalld 与 nftables 工具,nftables 与内核中的 netfilter 框架对话。 这 nmcli 命令对话 网络管理员. 并且 NetworkManager 几乎可以处理所有事情。

创建 AP

理论就够了——让我们开始实践吧。 启动您的 Raspberry Pi 运行 Fedora 并运行这些命令。

安装软件

几乎所有必需的软件都包含在 Fedora 最小的图像。 唯一缺少的是 dnsmasq 包。 这会自动处理新 wifi 网络的 DHCP 和 IP 地址部分。 使用运行此命令 sudo:

$ sudo dnf install dnsmasq

创建一个新的 NetworkManager 连接

NetworkManager 自动建立一个网络连接,有线连接 1. 使用 nmcli 工具告诉 NetworkManager 如何添加 wifi 连接。 NetworkManager 将这些设置以及更多设置保存在一个新的配置文件中。

新的配置文件在目录 /etc/sysconfig/network-scripts/ 中创建。 起初,它是空的; 该映像没有网络接口的配置文件。 如果您想了解有关 NetworkManager 如何使用 network-scripts 目录的更多信息,详细信息在 nm-settings-ifcfg-rh 手册页.

[nick@raspi ~]$ ls /etc/sysconfig/network-scripts/
[nick@raspi ~]$

创建网络连接的第一个 nmcli 命令如下所示。 还有更多事情要做——运行这个后,树莓派将无法作为热点工作。

nmcli con add 
  type wifi 
  ifname wlan0 
  con-name 'raspi hotspot' 
  autoconnect yes 
  ssid 'raspi wifi'

以下命令完成更多步骤:

  • 创建新连接。
  • 列出连接。
  • 再看一下 network-scripts 文件夹。 NetworkManager 添加了一个配置文件。
  • 列出要连接的可用 AP。

这需要使用以 root 身份运行多个命令 sudo:

$ sudo nmcli con add type wifi ifname wlan0 con-name 'raspi hotspot' autoconnect yes ssid 'raspi wifi'
Connection 'raspi wifi' (13ea67a7-a8e6-480c-8a46-3171d9f96554) successfully added.
$ sudo nmcli connection show
NAME UUID TYPE DEVICE
Wired connection 1 59b7f1b5-04e1-3ad8-bde8-386a97e5195d ethernet eth0
raspi wifi 13ea67a7-a8e6-480c-8a46-3171d9f96554 wifi wlan0
$ ls /etc/sysconfig/network-scripts/
ifcfg-raspi_wifi
$ sudo nmcli device wifi list
IN-USE BSSID SSID MODE CHAN RATE SIGNAL BARS SECURITY
       01:0B:03:04:C6:50 APrivateAP Infra 6 195 Mbit/s 52 ▂▄__ WPA2
       02:B3:54:05:C8:51 SomePublicAP Infra 6 195 Mbit/s 52 ▂▄__ --

您可以删除新配置并使用以下命令重新开始:

$ sudo nmcli con delete 'raspi hotspot'

更改连接方式

NetworkManager 连接有许多配置设置。 您可以使用命令 nmcli con show ‘raspi hotspot’ 看到这些。 其中一些设置以标签 802-11-wireless 开头。 这与使 wifi 工作的行业标准有关——IEEE 组织为 wifi 指定了许多协议,命名为 802.11. 这个新的 wifi 连接处于基础设施模式,准备连接到 wifi 接入点。 Pi 不应该连接到另一个 AP; 它应该是其他人连接的AP。

此命令将模式从基础设施更改为 AP。 它还设置了其他一些 无线特性. 这 背景 value 告诉 NetworkManager 遵循两个旧的 IEEE 标准 – 802.11b802.11g. 基本上它将无线电配置为使用 2.4GHz 频段,而不是 5GHz 频段。 ipv4.method 共享 意味着此连接将与其他人共享。

  • 通过将模式更改为 ap 来更改与热点的连接。
sudo nmcli connection 
  modify "raspi hotspot" 
  802-11-wireless.mode ap 
  802-11-wireless.band bg 
  ipv4.method shared

连接自动开始。 dnsmasq 应用程序为 wlan0 接口提供了一个 IP 地址 10.42.0.1。 启动和停止热点的手动命令是:

$ sudo nmcli con up "raspi hotspot"
$ sudo nmcli con down "raspi hotspot"

连接设备

接下来的步骤是:

  • 看日志。
  • 连接智能手机。
  • 当你已经看够了,输入 ^C ([control][c]) 停止观看日志。
$ journalctl --follow
-- Logs begin at Wed 2020-04-01 18:23:45 BST. --
...

使用支持 wifi 的设备,例如您的手机。 手机可以找到新的raspi wifi网络。

有关关联客户端的消息出现在活动日志中:

Jun 10 18:08:05 raspi wpa_supplicant[662]: wlan0: AP-STA-CONNECTED 94:b0:1f:2e:d2:bd
Jun 10 18:08:05 raspi wpa_supplicant[662]: wlan0: CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
Jun 10 18:08:05 raspi dnsmasq-dhcp[713]: DHCPREQUEST(wlan0) 10.42.0.125 94:b0:1f:2e:d2:bd
Jun 10 18:08:05 raspi dnsmasq-dhcp[713]: DHCPACK(wlan0) 10.42.0.125 94:b0:1f:2e:d2:bd nick

检查防火墙

出现了一个名为 nm-shared 的新安全区域。 这正在停止一些 wifi 访问。

$ sudo firewall-cmd --get-active-zones
[sudo] password for nick:
nm-shared
  interfaces: wlan0
public
  interfaces: eth0

新区域设置为接受所有内容,因为目标是 ACCEPT。 客户端可以使用 Web、邮件和 SSH 访问 Internet。

$ sudo firewall-cmd --zone=nm-shared --list-all
nm-shared (active)
  target: ACCEPT
  icmp-block-inversion: no
  interfaces: wlan0
  sources: 
  services: dhcp dns ssh
  ports: 
  protocols: icmp ipv6-icmp
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
	    rule priority="32767" reject

这个配置设置的大列表需要一些检查。

第一行,无罪直到证明有罪选项目标:ACCEPT 表示允许所有流量通过,除非规则另有说明。 这就像说这些类型的流量都可以。

  • 入站数据包 – 从 wifi 客户端发送到 Raspberry Pi 的请求
  • 转发的数据包 – 从 wifi 客户端到 Internet 的请求
  • 出站数据包 – PI 发送到 wifi 客户端的请求

但是,有一个隐藏的问题:从 wifi 客户端(例如您的工作站)到 Raspberry Pi 的请求可能会被拒绝。 最后一行——丰富规则部分的神秘规则——指的是 路由策略数据库. 该规则阻止您使用如下命令从工作站连接到 Pi:ssh 10.42.0.1。 此规则仅影响发送到 Raspberry Pi 的流量,而不影响发送到 Internet 的流量,因此浏览网页工作正常。

如果入站数据包与服务和协议列表中的内容匹配,则允许通过。 NetworkManager 自动添加 ICMP、DHCP 和 DNS(互联网基础设施服务和协议)。 SSH 数据包不匹配,到达 后期处理 阶段,并被拒绝——priority=”32767″ 翻译为“在所有处理完成后执行此操作”。

如果您想知道幕后发生了什么,那么丰富的规则会创建一个 nftables 规则。 nftables 规则看起来像这样。

$ sudo nft list chain inet firewalld filter_IN_nm-shared_post
table inet firewalld {
  chain filter_IN_nm-shared_post {
    reject
  }
}

修复 SSH 登录

使用 SSH 从您的工作站连接到 Raspberry Pi。由于丰富的规则,这将不起作用。 不在列表中的协议会立即被拒绝。

检查 SSH 是否被阻止:

$ ssh 10.42.0.1
ssh: connect to host 10.42.0.1 port 22: Connection refused

接下来,将 SSH 添加到允许的服务列表中。 如果您不记得定义了哪些服务,请使用 firewall-cmd ‐‐get-services 列出所有服务。 对于 SSH,请使用选项 ‐‐add-service ssh 或‐‐remove-service ssh。 不要忘记使更改永久化。

$ sudo firewall-cmd --add-service ssh --permanent --zone=nm-shared
success

现在再次使用 SSH 进行测试。

$ ssh 10.42.0.1
The authenticity of host '10.42.0.1 (10.42.0.1)' can't be established.
ECDSA key fingerprint is SHA256:dDdgJpDSMNKR5h0cnpiegyFGAwGD24Dgjg82/NUC3Bc.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.42.0.1' (ECDSA) to the list of known hosts.
Last login: Tue Jun 9 18:58:36 2020 from 10.0.1.35
[email protected]'s password:

SSH 访问不再被阻止。

作为无头计算机进行测试

树莓派运行良好 无头电脑. 从这里开始,您可以使用 SSH 在您的 Pi 上工作。

  • 关闭电源。
  • 卸下键盘和视频监视器。
  • 打开。
  • 等待几分钟。
  • 使用 SSH 从您的工作站连接到 Raspberry Pi。 使用有线接口或无线接口; 两者都工作。

使用 WPA-PSK 提高安全性

WPA-PSK(带有预共享密钥的 Wifi 保护访问)系统专为家庭用户和小型办公室而设计。 它受密码保护。 再次使用 nmcli 添加 WPA-PSK:

$ sudo nmcli con modify "raspi hotspot" wifi-sec.key-mgmt wpa-psk
$ sudo nmcli con modify "raspi hotspot" wifi-sec.psk "hotspot-password"

故障排除

这里有一些建议:

坏消息是,这里没有故障排除提示。 有很多事情可能会出错,没有办法覆盖它们。

对网络堆栈进行故障排除很棘手。 如果一个组件出错,它可能全部出错。 进行重新加载防火墙规则等更改可能会扰乱 NetworkManager 和 sshd 等服务。 当你发现自己在奔跑时,你就知道自己陷入了困境 nftables 命令 像 nft 列表规则集和 防火墙命令 比如firewall-cmd ‐‐set-log-denied=all。

玩你的新平台

为您的新 AP 增值。 由于您运行的是 Pi,因此有许多硬件附加组件。 既然正在运行 Fedora,您有数以千计的软件包可用。 尝试将其变成迷你 NAS,或添加备用电池,或者音乐播放器。

摄影者 尤里尔不飞溅.