使用树莓派用作无线网关
学校有覆盖免费的无线WiFi,但是有同时连接设备的数量限制。使用树莓派的无线网卡连接到WiFi后,通过以太网接口连接交换机或常规路由器,便可建立一个局域网,从而分享这个无线WiFi给其他有线和无线设备使用。
所使用的树莓派型号是3B,安装Raspbian(Raspberry Pi OS),这一个型号的板载WiFi没有5GHz频段,避免2.4GHz频段大量设备的干扰,使用了一个RTL8821CU为主控的USB网卡用作WWAN。但是树莓派的内核本身不含这个型号的无线网卡驱动,所以需要自行编译驱动并加入内核。
编译和安装RTL8821CU网卡驱动
这个型号的驱动可以在https://github.com/brektrou/rtl8821CU找到一个开源版本。按照其README文件的指示便可以完成编译工作。其中我选择的是Build and install without DKMS,可以面去DKMS的安装和配置工作。在执行make命令之前,需要完成结尾的一个针对ARM设备的额外操作。对于32位的树莓派系统,需要进行的命令即为以下这些:
# 安装依赖包
sudo apt-get update
sudo apt-get install build-essential gcc g++ git make
# 获取源码
mkdir -p ~/build
cd ~/build
git clone https://github.com/brektrou/rtl8821CU.git
# 备份系统文件并修改配置
sudo cp /lib/modules/$(uname -r)/build/arch/arm/Makefile /lib/modules/$(uname -r)/build/arch/arm/Makefile.$(date +%Y%m%d%H%M)
sudo sed -i 's/-msoft-float//' /lib/modules/$(uname -r)/build/arch/arm/Makefile
sudo ln -s /lib/modules/$(uname -r)/build/arch/arm /lib/modules/$(uname -r)/build/arch/armv7l
# 编译和安装
cd ~/build/rtl8821CU
make
sudo make install
# 启用模块
sudo modprobe 8821cu
至此,通过执行sudo modprobe 8821cu即可启用所编译的网卡驱动。可将其添加到/etc/rc.local文件的结尾处使其开机自动加载该驱动。(注意,有的镜像可能默认没有启用rc.local文件,需要手动开启相应的systemd服务和添加相应文件)
配置无线网卡的默认接入点
接下来需要让它开机自动连接WiFi。为了不让这张无线网卡默认连接到2.4GHz的接入点,需要手动添加配置文件至wpa_supplicant中,让其优先选择5GHz的接入点(其中,5GHz的36-48频道的载波频率范围是5.18GHz~5.24GHz,与USB的时钟信号的频率和谐波频率接近,存在较大的干扰,这里还需要设置优先选用149-165频道之间的无线接入点,其频率范围是5.745GHz~5.825GHz,实测信号延迟会小很多)。
首先需要使用iwlist扫描树莓派附近的所有接入点的相关参数。如果提示iwlist命令未找到,可通过sudo apt-get install iw进行安装。这里由于板载网卡的存在,它的interface被分配给了wlan0,因此USB网卡的interface为wlan1。
#sudo iwlist wlan1 scanning
Cell 01 - Address: 36:09:XX:XX:XX:XX
Channel:1
Frequency:2.412 GHz (Channel 1)
Quality=43/70 Signal level=-67 dBm
Encryption key:off
ESSID:"TP-LINK_XXXX"
Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s
9 Mb/s; 12 Mb/s; 18 Mb/s
Bit Rates:24 Mb/s; 36 Mb/s; 48 Mb/s; 54 Mb/s
Mode:Master
...
运行命令以后的一个输出的例子如上图。其中,Frequency即为该接入点的频率,后面会附带显示相应的Channel,以及链接质量、信号电平、支持的比特率等等。这里需要在输出的列表中选择合适频率和信号质量的接入点,记下它的物理地址BSSID(如36:09:XX:XX:XX:XX)和接入点名称ESSID(如TP-LINK_XXXX)。
之后到/etc/wpa_supplicant目录中,如有wpa_supplicant.conf文件,则表示树莓派以通过其他方式配置了WiFi,根据自己需要进行保留、将其移除或修改为wpa_supplicant-wlan0.conf。其中,wpa_supplicant-wlan0.conf表示网卡wlan0的配置文件,自行新建wpa_supplicant-wlan1.conf用于配置wlan1。
一个配置例子如下:
update_config=1
country=CN
network={
ssid="Android_AP"
psk="password1"
key_mgmt=WPA-PSK
priority=999
}
network={
bssid=30:09:XX:XX:XX:XX
ssid="Public-WiFi"
key_mgmt=NONE
priority=99
}
network={
ssid="TP-LINK_XXXX"
psk="password3"
key_mgmt=WPA-PSK
priority=1
}
这是一个我习惯使用的配置文件,最优先的为自己的手机热点,使树莓派默认最优先连接手机热点,方便在出现问题时通过开启手机热点进行调试。最后保留一个配置文件用作出现问题时的备用。中间为各个免费WiFi的接入点的BSSID等等。
之后重启该无线网卡,应该就会按照优先级配置连接WiFi。如果没有生效,可以尝试重启。
sudo ifconfig wlan1 down
sudo ifconfig wlan1 up
配置有线网卡的静态IP和无线网卡的优先级
之后需要将网口设置为静态IP,构成一个局域网。树莓派默认在/etc/dhcpcd.conf中进行相应的配置。在该文件末尾追加相应配置,或在中间相应位置修改即可。静态网卡的例子如下,这里使用网卡IP为192.168.10.1,结尾的/24表示子网掩码255.255.255.0。并设置DNS服务器为腾讯云和阿里云的公共DNS(即119.29.29.29和223.5.5.5)。
# Set eth0 as static
interface eth0
static ip_address=192.168.10.1/24
static domain_name_servers=119.29.29.29 223.5.5.5
由于我是wlan0和wlan1同时启用,因此需要配置优先级,让树莓派优先使用wlan1作为路由出口。
通过ip route show命令可以看到目前的路由表,表项结尾的metric表示优先级,值越小则优先级越高。取一个足够小的值,将其配置文件添加在/etc/dhcpcd.conf中即可。
# Set wlan1 as highest priority
interface wlan1
metric 100
配置局域网
使用iptables,添加NAT配置,让树莓派作为局域网的网关。如果没有安装iptables,可以通过sudo apt-get install iptables进行安装。
此部分命令如下:
sudo iptables -F
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -t nat -A POSTROUTING -o wlan1 -j MASQUERADE
注意,iptables -F会清除已有的配置,如果已有其他配置,注意自行修改命令。
上述命令同样可以添加到rc.local使其开机生效。
由于没有安装dhcp服务器,因此局域网设备需要手动设置ip。如果是使用一个路由器,可以将路由器的WAN插上树莓派的网口,之后路由器上网方式的需要设置为静态IP(前文树莓派的IP为192.168.10.1,这里可以将路由器设置为192.168.10.2,网关192.168.10.1,掩码255.255.255.0,DNS自行配置)。或者将路由器的LAN插上树莓派的网口,即这样其他接入设备与树莓派之间不再通过一层NAT连接,此时也可使用路由器的DHCP服务器进行IP分配,注意DHCP分配的地址不要和已有的地址冲突。如果树莓派的网口连接的是一台非管理型交换机,则下面的每一台设备均需要手动分配和设置IP地址。
如果需要使用树莓派进行DHCP分配,可以通过安装dnsmasq实现。