本文参考自CSDN用户羟基氟化宇的畅玩树莓派4B(二)树莓派搭建无线路由器(支持5GWIFI)
本文补充其中的细节及遇到的问题。
本文提及的代码,均需在树莓派终端中运行。
〇、硬件准备
树莓派4B一个、网线一根。
(如果需要从树莓派再引网线出去,还需要网口->USB转接器一个、额外网线一根)
将网线插入树莓派就可以开始以下操作啦。
具体接线在此不赘述,就跟普通路由器一样接。
一、工具安装
为了可以从更快或者更可靠的服务器下载软件包,需要修改软件源。
打开软件源文件,修改其中的软件源:
sudo nano /etc/apt/sources.list
在打开的文件中,注释掉原有的软件源。
根据 Debian 版本(bullseye 或 buster)的不同,所需修改的软件源也不同。
如果文件首行出现“bullseye”,则在文件末尾添加:
deb https://mirror.nju.edu.cn/debian/ bullseye main contrib non-free
deb https://mirror.nju.edu.cn/debian-security/ bullseye-security main contrib non-free
deb https://mirror.nju.edu.cn/debian bullseye-updates main contrib non-free
如果出现“buster”,则在文件末尾添加:
deb https://mirrors.aliyun.com/raspbian/raspbian/ buster main contrib non-free rpi
deb-src https://mirrors.aliyun.com/raspbian/raspbian/ buster main contrib non-free rpi
ctrl+x退出并按y保存文件。执行语句安装工具:
sudo apt-get update
sudo apt-get install -y hostapd dnsmasq iptables dnsutils
-
hostapd (Host Access Point Daemon): 这是一个使设备能够作为无线接入点的软件。hostapd 允许树莓派广播其自己的无线网络SSID,使其他设备能够连接到这个由树莓派创建的网络。
-
dnsmasq: 这是一个轻量级的DNS和DHCP服务器,常用于小型网络(如家庭网络)。dnsmasq 可以为连接到树莓派的设备分配IP地址,并处理DNS解析。
-
iptables: 这是一个灵活的网络流量管理工具,它通过设置规则来控制数据包的流向。iptables 用于设置网络路由规则,如NAT(网络地址转换),以允许多个设备共享同一个互联网连接。
-
dnsutils: 这个包提供了用于查询和诊断DNS的工具,如dig和nslookup。这些工具可以帮助调试和管理网络上的DNS问题。
二、网卡配置
此步骤主要用于配置树莓派的无线网络接口(wlan0),使其作为一个静态IP地址的无线接入点,同时通过图形界面设置无线网络的SSID(网络名)和密码。
打开网络接口的配置文件。:
sudo nano /etc/network/interfaces
在文件末尾添加:
auto wlan0
allow-hotplug wlan0
iface wlan0 inet static
address 192.168.90.1
netmask 255.255.255.0
auto wlan0:表示在启动时自动激活wlan0网络接口。
allow-hotplug wlan0:如果这个接口是热插拔的(如USB无线网卡),则当它被插入时自动启动。
iface wlan0 inet static:为wlan0接口指定静态IP地址的配置。
address 192.168.90.1:设置树莓派无线网卡的IP地址。要注意不要与其他设备的地址冲突。
netmask 255.255.255.0:设置网络掩码,决定了网络的大小。
保存后打开配置工具
sudo raspi-config
依次选择后配置SSID和passphrase,即该路由器广播的无线网络的名称和访问密码。
在原文中还有选择地区为US(因为不同的国家有不同的无线频段和功率限制)的步骤,但笔者并没有遇到这一步。可以手动编辑无线网络配置文件:
sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
将里面的Country手动改成US即可。
三、DHCP和DNS配置
先对dns配置文件进行备份,然后打开:
sudo cp /etc/dnsmasq.conf /etc/dnsmasq.conf.bak
sudo nano /etc/dnsmasq.conf
在打开的文件末尾添加:
# DHCP
interface=wlan0
bind-interfaces
dhcp-range=192.168.90.100,192.168.90.200,48h
# DNS
log-queries
log-facility=/home/pi/logs/dnsmasq.log
no-hosts
clear-on-reload
dns-forward-max=1000
all-servers
server=8.8.8.8
server=208.67.222.222
server=4.2.2.1
interface=wlan0:指定 dnsmasq 服务绑定到哪个网络接口,这里是 wlan0,即树莓派的无线网卡。
bind-interfaces:确保 dnsmasq 只使用指定的接口,避免在多网卡设备上出现混淆。
dhcp-range=192.168.90.100,192.168.90.200,48h:设置DHCP地址池,从 192.168.90.100 到 192.168.90.200,租期为48小时。这意味着连接到树莓派的设备将从这个范围内自动获取IP地址。
log-queries:记录所有DNS查询,有助于调试和监控网络活动。
log-facility=/home/pi/logs/dnsmasq.log:指定日志文件的位置
no-hosts:不从 /etc/hosts 文件读取本地DNS记录。
clear-on-reload:重新加载配置文件时清空DNS缓存,这有助于保证配置更改立即生效。
dns-forward-max=1000:限制最大并发DNS转发请求的数量,这里设置为1000。
all-servers:查询所有配置的DNS服务器,而不是只查询一个直到得到响应。
server=8.8.8.8、server=208.67.222.222、server=4.2.2.1:设置用于DNS查询的上游DNS服务器,这些都是公共DNS服务器,提供稳定和快速的DNS解析服务。
保存后重启dnsmasq服务:
sudo service dnsmasq restart
接着,可以配置国内域名走国内DNS服务器解析
使用 curl 从 GitHub 上下载 felixonmars 的 dnsmasq-china-list,这是一个专门为中国大陆域名优化的DNS解析列表。
223.5.5.5 是阿里巴巴的公共DNS,也可以用腾讯的119.29.29.29,百度的180.76.76.76等。
sudo bash -c "curl -s https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/accelerated-domains.china.conf | sed 's/114.114.114.114/223.5.5.5/g' > /etc/dnsmasq.d/accelerated-domains.china.conf"
使用Github上的privacy-protection-tools/anti-AD禁广告,dnsmasq 将自动拦截那些已知的广告和跟踪域名的DNS请求
sudo bash -c "curl -s https://raw.githubusercontent.com/privacy-protection-tools/anti-AD/master/adblock-for-dnsmasq.conf > /etc/dnsmasq.d/adblock-for-dnsmasq.conf"
四、配置转发
此步骤是为了确保树莓派能够作为一个有效的路由器和网关,处理内外网络间的数据转发和地址转换,允许内部网络的设备通过树莓派接入互联网。
首先编辑文件
sudo nano /etc/sysctl.conf
去掉net.ipv4.ip_forward=1的注释。随后执行:
sudo sysctl -p
这将启用IP转发功能,允许树莓派转发接收到的数据包,使其可以在不同的网络接口之间路由数据包。
再依次运行下列命令以配置NAT:
# 清空现有的iptables规则
sudo iptables -F
sudo iptables -X
# 添加一个NAT规则,用于将从wlan0(无线网络接口)出去的数据包的源地址转换为eth0(有线网络接口)的IP地址。
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# 允许从外部网络回应内网请求的数据包通过
sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
# 允许从内网出去的数据包通过
sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
# 保存当前的iptables规则到文件中
sudo bash -c "iptables-save > /etc/iptables.rules"
编辑文件:
sudo nano /etc/rc.local
在exit 0前面添加:
iptables-restore < /etc/iptables.rules
这条命令在系统启动时自动加载保存的iptables规则,确保每次启动后防火墙规则都能正确应用。
五、配置hostapd
编辑配置文件
sudo nano /etc/hostapd/hostapd.conf
# 网卡,一般就是wlan0不用修改,除非使用了外接的无线网卡。
interface=wlan0
# 不用修改
driver=nl80211
# 5G
hw_mode=a
# 启用 802.11n
ieee80211n=1
# 启用 802.11ac
ieee80211ac=1
# 启用 802.11d
ieee80211d=1
# 启用 802.11h
ieee80211h=1
# 其他的国家代码似乎会出错
country_code=US
# (Wi-Fi MultiMedia) 多媒体优化,优先传输时间敏感型数据
wmm_enabled=1
# 信道。可选[36, 40, 44, 48, 52, 56, 60, 64, 149, 153, 157, 161, 165]
channel=149
# (high-throughput 高吞吐量) 802.11n的带宽扩展技术
require_ht=1
# (very high throughput) 802.11ac的带宽扩展技术
require_vht=1
# 工作带宽 40MHz
vht_oper_chwidth=1
# channel+6
vht_oper_centr_freq_seg0_idx=155
# 查看本小节后面的说明(硬件支持)
ht_capab=
# 查看本小节后面的说明(硬件支持)
vht_capab=
# 认证方式:WPA2-PSK
wpa=2
wpa_key_mgmt=WPA-PSK
# 加密方式:CCMP
rsn_pairwise=CCMP
# WIFI信息(根据自己的需求修改)
# wifi名称(就是搜索WIFI时显示的名字)
ssid=RASPI-WIFI
# wifi密码(就是连接WIFI时输入的密码)(必须8位以上,也就是最少输8个字母或数字)
wpa_passphrase=12345678
上面的配置中,ht_capab和vht_capab的内容与硬件支持密切相关。执行此代码查看硬件支持情况:
iw phy phy0 info
找到Capabilities
按照以下选项配置:
[LDPC]
LDPC coding capability
[HT40-][HT40+]
[HT40-] = both 20 MHz and 40 MHz with secondary channel below the primary channel;
[HT40+] = both 20 MHz and 40 MHz with secondary channel above the primary channel;
(20 MHz only if neither is set)
[SHORT-GI-20]
Short GI for 20 MHz
[SHORT-GI-40]
Short GI for 40 MHz
[TX-STBC]
Tx STBC
[RX-STBC1][RX-STBC12][RX-STBC123]
Rx STBC
[DELAYED-BA]
HT-delayed Block Ack
[MAX-AMSDU-7935]
Maximum A-MSDU length (3839 octets if not set)
[DSSS_CCK-40]
DSSS/CCK Mode in 40 MHz
[40-INTOLERANT]
40 MHz intolerant
[LSIG-TXOP-PROT]
L-SIG TXOP protection support
我的配置为:
ht_capab=[HT40-][HT40+][SHORT-GI-20][SHORT-GI-40][DSSS_CCK-40]
找到VHT Capabilities
按照以下选项进行配置:
[MAX-MPDU-3895][MAX-MPDU-7991][MAX-MPDU-11454]
Indicates maximum MPDU length
[VHT160][VHT160-80PLUS80]
Indicates supported Channel widths
[RXLDPC]
Rx LDPC coding capability.
[SHORT-GI-80]
Short GI for 80 MHz
[SHORT-GI-160]
Short GI for 160 MHz
[TX-STBC-2BY1]
Tx STBC
[RX-STBC-1][RX-STBC-12][RX-STBC-123][RX-STBC-1234]
Rx STBC:
[SU-BEAMFORMER]
SU Beamformer Capable
[SU-BEAMFORMEE]
SU Beamformee Capable
[BF-ANTENNA-2][BF-ANTENNA-3][BF-ANTENNA-4]
Compressed Steering Number of Beamformer Antennas Supported
If SU beamformer capable, set to maximum value minus 1
[SOUNDING-DIMENSION-2][SOUNDING-DIMENSION-3][SOUNDING-DIMENSION-4]
Number of Sounding Dimensions
[MU-BEAMFORMER]
MU Beamformer Capable
[VHT-TXOP-PS]
VHT TXOP PS
[HTC-VHT]
+HTC-VHT Capable
Indicates whether or not the STA supports receiving a VHT variant HT Control field.
[MAX-A-MPDU-LEN-EXP0][MAX-A-MPDU-LEN-EXP7]
Maximum A-MPDU Length Exponent
[VHT-LINK-ADAPT2][VHT-LINK-ADAPT3]
VHT Link Adaptation Capable
[RX-ANTENNA-PATTERN]
Rx Antenna Pattern Consistency
[TX-ANTENNA-PATTERN]
Tx Antenna Pattern Consistency
我的配置为:
vht_capab=[MAX-MPDU-3895][SHORT-GI-80][SU-BEAMFORMEE]
随后,执行:
sudo hostapd /etc/hostapd/hostapd.conf
如果没有问题就会看到AP-ENABLED
六、服务启停与状态查看
查询hostapd工作状态:
sudo systemctl status hostapd
如果发现状态是inactive,可以手动开启:
sudo systemctl start hostapd
也可以手动停止:
sudo systemctl stop hostapd
笔者在刚开始配置时遇到如下问题:
ty@raspberrypi:~ $ sudo systemctl start hostapd
Failed to start hostapd.service: Unit hostapd.service is masked.
ty@raspberrypi:~ $ sudo systemctl status hostapd
● hostapd.service
Loaded: masked (Reason: Unit hostapd.service is masked.)
Active: inactive (dead)
此时需要手动解除屏蔽:
sudo systemctl unmask hostapd
然后重启服务。
此时应该可以搜索到配置的WIFI信号了。
如果手机还是搜索不到对应的WIFI,尝试重启树莓派。