树莓派官方的定义是微型的桌面计算机,通常来说它的无线网卡和大多数个人计算机一样都是用于接入到某个无线网络中使用的(STA - Station 模式)。不过在某些情况下偶尔也会用来启用无线网络作为无线接入点使用(AP - Access Point 模式)。树莓派官方的文档中已经有介绍怎么进行设置了,这篇文章将依照官方文档做个扩充性的说明。
本文中演示中设备使用 Raspberry Pi 4 Model B ,系统使用 Raspberry Pi OS(32-bit 2022-04-04) 。
树莓派中管理无线网卡作为客户端去连接无线网络所用的程序是 wpa_supplicant (主流的操作系统中很多使用的也是这个)。
对于用户而言 wpa_supplicant 主要涉及下面几个内容:
wpa_supplicant
守护进程;wpa_supplicant.conf
配置文件;wpa_cli
命令行工具;wpa_gui
图形化工具;wpa_supplicant.conf 文件中最主要记录了欲连接的无线网络的名称和密码等信息,比如下面例子:
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=CN
network={
ssid="Name of your wireless LAN"
psk="Password for your wireless LAN"
}
其中country为地区代码(CN表示China);network保存的是一个无线网络的相关信息。你也可以设置多个无线网络:
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=CN
network={
ssid="Name of your wireless LAN 1"
psk="Password for your wireless LAN 1"
}
network={
ssid="Name of your wireless LAN 2"
psk="Password for your wireless LAN 2"
}
wpa_supplicant通常安装为开机启动的守护进程,wpa_supplicant启动后会去读取配置文件(默认为 /etc/wpa_supplicant/wpa_supplicant.conf
),然后尝试连接可用的网络。
wpa_supplicant 对应的有一个叫做 hostapd 的程序,这个程序可以用将无线网卡作为无线接入点使用。
对于用户而言 hostapd 主要涉及下面几个内容:
hostapd
守护进程;hostapd.conf
配置文件;hostapd_cli
命令行工具;hostapd常见的也是作为守护进程读取hostapd.conf文件(默认为 /etc/hostapd/hostapd.conf
)来执行相关的操作。
树莓派Pi4有一个有线网口和一个无线网口,启用无线接入点通常可以工作在两种模式下:
dhcpcd是一个默认启动的守护进程,提供DHCP客户端功能,用于向网络中的DHCP服务器获取网口在网络中的IP地址。和前面的程序一样该程序也有默认的配置文件 /etc/dhcpcd.conf
。
dnsmasq是一个面向小型网络的 DNS & DHCP 服务器程序。和前面的程序一样该程序也有默认的配置文件 /etc/dnsmasq.conf
。
sysctl这个程序用于检查和设置内核参数;netfilter相当于防火墙程序,用于管理网络数据包的进出;iptables用来设置netfilter的规则。
在本文中使用这几个程序或其变种来实现路由模式下路由和数据转发功能。
systemd-networkd是一个管理网络配置的系统守护进程。它会在网络设备出现时检测和配置;它还可以创建虚拟网络设备。
在本文中使用这个程序来创建虚拟的网桥来提供桥接功能。
树莓派官方文档(Configuration章节中有建立无线热点的说明):
https://www.raspberrypi.com/documentation/
树莓派Pi4中只有一个无线网口wlan0,所以要设置为无线接入点的话主要就是要实现下面几点:
如果只是想要使用树莓派建立一个无线热点,提供接入这个热点内设备互通的话只要按照路由模式设置,提供dhcp和dns服务即可,不需要实现路由和转发功能。
下面两个模式的演示都在刚装好的系统上进行。
安装相关程序:
sudo apt install hostapd -y
sudo apt install dnsmasq -y
sudo DEBIAN_FRONTEND=noninteractive apt install -y netfilter-persistent iptables-persistent
调整dhcpcd程序对wlan0的操作:
sudo nano /etc/dhcpcd.conf
在文件末尾添加下面内容(设置了要开启的无线接入点网关地址,并禁止wpa_supplicant使用wlan0)(ctrl+s保存,ctrl+x退出):
interface wlan0
static ip_address=192.168.4.1/24
nohook wpa_supplicant
设置要开启的无线接入点的DHCP和DNS服务器(首先备份下原有文件,然后从空白文件进行设置):
sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig
sudo nano /etc/dnsmasq.conf
文件内容如下:
interface=wlan0
dhcp-range=192.168.4.2,192.168.4.20,255.255.255.0,24h
domain=wlan
address=/gw.wlan/192.168.4.1
设置要开启的无线接入点:
sudo nano /etc/hostapd/hostapd.conf
文件内容如下(其中ssid和wpa_passphrase分别为要开启的无线接入点的名称和密码):
country_code=CN
interface=wlan0
ssid=NameOfNetwork
hw_mode=g
channel=6
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=PasswordOfNetwork
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
设置hostapd为守护进程,确保无线端口未被屏蔽:
sudo systemctl unmask hostapd
sudo systemctl enable hostapd
sudo rfkill unblock wlan
接着重启树莓派可以用其它设备看到新建立的无线网络了:
sudo reboot
到目前为止已经建立了基本可用的独立的无线热点,只是接入到这个热点中的设备无法访问外网,还需要进一步进行设置。当然这里还有个前提是树莓派要能通过网线访问外网。
新建文件:
sudo nano /etc/sysctl.d/routed-ap.conf
文件中写入下面内容:
net.ipv4.ip_forward=1
设置防火墙规则:
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo netfilter-persistent save
接着重启树莓派即可:
sudo reboot
这样连接到建立的无线热点的设备就可以访问外网了。
桥接模式前提是树莓派通过网线接入的网络要能正常使用。
安装相关程序:
sudo apt install hostapd -y
创建网桥:
sudo nano /etc/systemd/network/bridge-br0.netdev
文件内容如下(创建名为br0的网桥)(ctrl+s保存,ctrl+x退出):
[NetDev]
Name=br0
Kind=bridge
设置以太网口为网桥成员:
sudo nano /etc/systemd/network/br0-member-eth0.network
文件内容如下:
[Match]
Name=eth0
[Network]
Bridge=br0
启动systemd-networkd守护进程,使树莓派重启时虚拟网桥可以正常工作:
sudo systemctl enable systemd-networkd
调整dhcpcd程序对无线网口、以太网口和网桥的操作:
sudo nano /etc/dhcpcd.conf
在文件中第一行 interface xxx
之前(从未改动过该文件的话其实就在底部添加就行)添加下面内容(屏蔽这两个端口,不给它们设置IP):
denyinterfaces wlan0 eth0
在文件尾部添加下面内容(给网桥设置IP,即树莓派的IP):
interface br0
设置要开启的无线接入点:
sudo nano /etc/hostapd/hostapd.conf
文件内容如下(其中ssid和wpa_passphrase分别为要开启的无线接入点的名称和密码):
country_code=CN
interface=wlan0
bridge=br0
ssid=NameOfNetwork
hw_mode=g
channel=6
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=PasswordOfNetwork
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
设置hostapd为守护进程,确保无线端口未被屏蔽:
sudo systemctl unmask hostapd
sudo systemctl enable hostapd
sudo rfkill unblock wlan
接着重启树莓派可以用其它设备看到新建立的无线网络了:
sudo reboot
总的来说在树莓派中建立无线热点涉及的内容有好几块,但是操作上并不复杂。更多内容可以参考下面链接: