品味树莓派:设置为无线接入点

文章目录

  • 目的
  • 背景知识
    • wpa_supplicant
    • hostapd
    • 路由模式和桥接模式
    • dhcpcd
    • dnsmasq
    • sysctl & netfilter & iptables
    • systemd-networkd
  • 设置为无线接入点
    • 路由模式
    • 桥接模式
  • 总结

目的

树莓派官方的定义是微型的桌面计算机,通常来说它的无线网卡和大多数个人计算机一样都是用于接入到某个无线网络中使用的(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 守护进程;
  • 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 ),然后尝试连接可用的网络。

hostapd

wpa_supplicant 对应的有一个叫做 hostapd 的程序,这个程序可以用将无线网卡作为无线接入点使用。

对于用户而言 hostapd 主要涉及下面几个内容:

  • hostapd 守护进程;
  • hostapd.conf 配置文件;
  • hostapd_cli 命令行工具;

hostapd常见的也是作为守护进程读取hostapd.conf文件(默认为 /etc/hostapd/hostapd.conf )来执行相关的操作。

路由模式和桥接模式

树莓派Pi4有一个有线网口和一个无线网口,启用无线接入点通常可以工作在两种模式下:

  • 路由模式
    路由模式就和普通无线路由器差不多,所有连接到这个热点中的设备都在一个网段下;
    树莓派作为网关和DHCP服务器,连接到这个热点的所有设备间都可以互相通讯;
    如果想要访问外网就需要通过有线网口进行,树莓派需要处理路由和数据转发;
  • 桥接模式
    桥接模式下所有连接到这个热点中的设备和树莓派以及树莓派有线连接的网络中其它设备都在一个网段下;
    连接到这个热点中的设备的IP地址均由树莓派有线连接的网络中的DHCP服务器提供;
    这里通过树莓派无线网口连接的设备想要连接到树莓派有线所连接的网络中就需要在两个网口间进行桥接了;

dhcpcd

dhcpcd是一个默认启动的守护进程,提供DHCP客户端功能,用于向网络中的DHCP服务器获取网口在网络中的IP地址。和前面的程序一样该程序也有默认的配置文件 /etc/dhcpcd.conf

dnsmasq

dnsmasq是一个面向小型网络的 DNS & DHCP 服务器程序。和前面的程序一样该程序也有默认的配置文件 /etc/dnsmasq.conf

sysctl & netfilter & iptables

sysctl这个程序用于检查和设置内核参数;netfilter相当于防火墙程序,用于管理网络数据包的进出;iptables用来设置netfilter的规则。
在本文中使用这几个程序或其变种来实现路由模式下路由和数据转发功能。

systemd-networkd

systemd-networkd是一个管理网络配置的系统守护进程。它会在网络设备出现时检测和配置;它还可以创建虚拟网络设备。
在本文中使用这个程序来创建虚拟的网桥来提供桥接功能。

设置为无线接入点

树莓派官方文档(Configuration章节中有建立无线热点的说明):
https://www.raspberrypi.com/documentation/

树莓派Pi4中只有一个无线网口wlan0,所以要设置为无线接入点的话主要就是要实现下面几点:

  • 不让wpa_supplicant占用wlan0;
  • 使用hostapd通过wlan0建立无线热点;
  • 路由模式
    • 使用dnsmasq给建立的无线网络提供DHCP和DNS服务;
    • 使用sysctl&netfilter&iptables实现路由和转发功能;
  • 桥接模式
    • systemd-networkd实现桥接功能;

如果只是想要使用树莓派建立一个无线热点,提供接入这个热点内设备互通的话只要按照路由模式设置,提供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

总结

总的来说在树莓派中建立无线热点涉及的内容有好几块,但是操作上并不复杂。更多内容可以参考下面链接:

  • hostapd and wpa_supplicant项目页面:
    https://w1.fi/
  • dhcpcd项目页面:
    https://roy.marples.name/projects/dhcpcd/
  • dnsmasq项目页面:
    https://thekelleys.org.uk/dnsmasq/doc.html
  • 如何配置树莓派4B作为802.11ac AP:
    https://blog.csdn.net/Cui_Hongwei/article/details/123997268

你可能感兴趣的:(嵌入式系统与设备相关,网络,树莓派,路由器,hostapd,无线热点)