更新软件

1
2
$sudo apt update
$sudo apt upgrade

安装并配置hostapd服务

安装hostapd

1
2
$sudo apt install hostapd
$sudo systemctl stop hostapd

配置hostapd

编辑/etc/hostapd/hostapd.conf文件,如果不存在这个文件可以直接新建一个。

1
$sudo vim /etc/hostapd/hostapd.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
interface=wlan0
#bridge=br0
#无线驱动n180211
driver=nl80211
logger_syslog=-1
logger_syslog_level=2
logger_stdout=-1
logger_stdout_level=2
##### IEEE 802.11 related configuration #######################################
#热点名字,可根据需要自行更改
ssid=AP-Pi4

utf8_ssid=1
# ISO/IEC 3166-1 标准的国家代码,用于设置监管域。根据需要设置,按照哪个国家来操作设备。
# 这可以限制可用的频道和发射功率。
#country_code=CN
# 是否启用 IEEE 802.11d,0 禁用(默认),1 启用。
# 需要正确设置 country_code 才能使 IEEE 802.11d 正常工作。
#ieee80211d=1
# 是否启用 IEEE 802.11h,0 禁用(默认),1 启用。
# 这将启用雷达探测和 DFS 支持,如果可用话。
#ieee80211h=1
# 添加 Power Constraint element 到 Beacon 和 Probe Response frames 中去。
#local_pwr_constraint=5
# 该选项仅在 ieee80211h=1 选项并且已经配置 local_pwr_constraint 选项时可用。
#spectrum_mgmt_required=1
# 设置无线模式需要硬件支持
#a = IEEE 802.11a,
#b = IEEE 802.11b, g
#= IEEE 802.11g,
#ad = IEEE 802.11ad (60 GHz)
# hw_mode=a 或 hw_mode=g 选项也与 IEEE 802.11n 一起使用来设置波段。
# 当使用 ACS 时(看下文 channel parameter ),可以使用特殊的选项值 hw_mode=any ,说明可以使用任何可用的波段,该值当前仅在驱动使用了 offloaded ACS 的情况下有效。
# 默认: hw_mode=b
hw_mode=g
# 注意有些设备不使用这个选项,而是需要在 iwconfig 中另外配置。
# 如果编译的时候启用了 CONFIG_ACS 选项。通过设置 channel=acs_survey 或 channel=0,这样 hostapd 可以在运行时基于 ACS survey 算法自动选择合适的信道。
# 有些设备仅支持最大为11频道,有些支持最大为13频道,可以通过iw list 查看。
# 另外启用 ht_capab 将影响可用的频道数
channel=6
# ACS tuning - 信道自动选择
# 参考:http://wireless.kernel.org/en/users/Documentation/acs
# 信道自动选择,有助于选择更好的信道,但是会增加启动时间,一般不需要修改。
# 可以通过设置下面选项自定义 ACS survey 算法。
# 默认:acs_num_scans=5 acs_chan_bias=1:0.8 6:0.8 11:0.8
#acs_num_scans=40
#acs_chan_bias=1:0.8 6:0.8 11:0.8
# 默认允许所有信道
#chanlist=100 104 108 112 116
#chanlist=1 6 11-13
# beacon 间隔 (默认: 100; 范围 15到65535)
#beacon_int=100
#dtim_period=1
# 默认且最大值为2007个列表
#max_num_sta=255
#rts_threshold=2347
#fragm_threshold=2346
#supported_rates=10 20 55 110 60 90 120 180 240 360 480 540
#basic_rates=10 20
#basic_rates=10 20 55 110
#basic_rates=60 120 240
# 用命令:iw list 查看无线网卡是否有“short preamble supported”。
# 0 禁用,1 启用,无线网卡支持的话可以启用以改善网络性能。
#preamble=1

# 无线MAC地址过滤
# 此选项要求 driver=hostap 或 driver=nl80211
# 0 = 接受所有连接,仅拒绝 deny 列表中的连接
# 1 = 拒绝所有连接,仅接受 accept 列表中的连接
# 2 = 使用外部 RADIUS 服务器 (还是会优先查找 accept/deny 列表)
# 简单一点的话,可以将两个列表设置为同一个文件,仅由 macaddr_acl 来控制允许或拒绝
macaddr_acl=0
accept_mac_file=/etc/hostapd/hostapd.accept
deny_mac_file=/etc/hostapd/hostapd.deny
# 身份验证算法,1 开放系统认证,2 共享密钥认证(需要 WEP),3 两者

auth_algs=3
# 是否广播,0 广播SSID,1 不广播SSID(发送空SSID,即长度为0的SSID),
# 2 忽略广播 SSID 的探测请求,跟1类似,但是兼容某些不支持空SSID的设备
#ignore_broadcast_ssid=0
#vendor_elements=dd0411223301
# 启用WMM
wmm_enabled=1

#
# WMM-PS Unscheduled Automatic Power Save Delivery [U-APSD]
# Enable this flag if U-APSD supported outside hostapd (eg., Firmware/driver)
#uapsd_advertisement_enabled=1
#
# Low priority / AC_BK = background
#wmm_ac_bk_cwmin=4
#wmm_ac_bk_cwmax=10
#wmm_ac_bk_aifs=7
#wmm_ac_bk_txop_limit=0
#wmm_ac_bk_acm=0
# Note: for IEEE 802.11b mode: cWmin=5 cWmax=10
#
# Normal priority / AC_BE = best effort
#wmm_ac_be_aifs=3
#wmm_ac_be_cwmin=4
#wmm_ac_be_cwmax=10
#wmm_ac_be_txop_limit=0
#wmm_ac_be_acm=0
# Note: for IEEE 802.11b mode: cWmin=5 cWmax=7
#
# High priority / AC_VI = video
#wmm_ac_vi_aifs=2
#wmm_ac_vi_cwmin=3
#wmm_ac_vi_cwmax=4
#wmm_ac_vi_txop_limit=94
#wmm_ac_vi_acm=0
# Note: for IEEE 802.11b mode: cWmin=4 cWmax=5 txop_limit=188
#
# Highest priority / AC_VO = voice
#wmm_ac_vo_aifs=2
#wmm_ac_vo_cwmin=2
#wmm_ac_vo_cwmax=3
#wmm_ac_vo_txop_limit=47
#wmm_ac_vo_acm=0
# Note: for IEEE 802.11b mode: cWmin=3 cWmax=4 burst=102
# 检测客户端不活动超时,是否在线间隔时间,默认每5分钟检测客户端是否在线
# 站点不活动限制,默认5分钟
#ap_max_inactivity=300
# 默认禁用,设置为1,说明只要客户在5分钟内没有活动就断线,即使客户端仍然在AP信号的范围内,
#如果客户端过多可以启用来提高带机量。
#skip_inactivity_poll=0
# 对于过度的传输失败或其他连接丢失的情况下,断开连接,这并不适合所有设备
#disassoc_low_ack=1
# 最大允许侦听间隔,默认65535,即不限制 (how many Beacon periods STAs are allowed to remain asleep)
#max_listen_interval=100
# WDS(4-address frame)模式,仅在 driver=nl80211 的情况下支持
#wds_sta=1
# 仅在设置了bridge= 时有效,默认情况下,例如当设置了bridge=br0,那么wds_bridge=br0。
# 当然也可以手动指定为wds_bridge=XXXXX。
#wds_bridge=wds-br0
# Start the AP with beaconing disabled by default.没明白是什么意思。
#start_disabled=0
# AP隔离,1启用,0禁用。默认不隔离。
#ap_isolate=1
#bss_load_update_period=50
# 用于测试的
#bss_load_test=12:80:20000
##### IEEE 802.11n related configuration ######################################
# 启用80211n,你也将需要启用WMM来使用全部HT功能。
ieee80211n=1
# [HT40-]或[HT40+]没有设置的话将只工作在20MHz,
# [HT40-]对应可使用的频道为5-13
# [HT40+]对应可使用的频道为1-7(欧洲标准为1-9)
# 当多径效应不是很严重时,用户可以将该间隔配置为[SHORT-GI-20][SHORT-GI-40]
# 个人理解,如果不上天馈系统的话可以启用[SHORT-GI-20][SHORT-GI-40],前提是硬件支持。
#ht_capab=[LDPC][HT40-][HT40+][SHORT-GI-20][SHORT-GI-40][SMPS-DYNAMIC][GF][TX-STBC][RX-STBC123][DELAYED-BA][MAX-AMSDU-7935][DSSS_CCK-40][40-INTOLERANT][LSIG-TXOP-PROT]
# intel Wireless-N 105 (rev c4) 网卡支持的选项
ht_capab=[HT40-][SHORT-GI-20][SHORT-GI-40][DSSS_CCK-40][40-INTOLERANT][GF]
# Atheros AR9271 网卡支持的选项
#ht_capab=[HT40-][SHORT-GI-20][SHORT-GI-40][DSSS_CCK-40][40-INTOLERANT][RX-STBC1]
#ht_capab=[HT40-][SHORT-GI-20][SHORT-GI-40][DSSS_CCK-40]
#ht_capab=[HT40-][SHORT-GI-20][SHORT-GI-40]
#ht_capab=[HT40+][DSSS_CCK-40][40-INTOLERANT]
# 强制要求客户端使用HT PHY,不使用就拒绝。
#require_ht=0
# 间隔时间(秒)
#obss_interval=5
##### WPA/IEEE 802.11i configuration ##########################################
# 1 wpa,2 wpa2, 3 两者。 新的设备可以设置为2,仅使用wpa2版本。
wpa=2

# 指定密码,ASCII码或密码字符。
#wpa_psk=0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
#密码设置
wpa_passphrase=12345678
# 使用密码文件,可以跟客户端MAC地址绑定设置不同的密码,比较实用。
wpa_psk_file=/etc/hostapd/hostapd.wpa_psk
# 是否使用验证服务器,0 禁用(默认),1 可用,2 强制使用(其他方式将拒绝)
#wpa_psk_radius=0
# 设置密钥管理算法WPA-PSK WPA-EAP或两者
wpa_key_mgmt=WPA-PSK
# 设置加密算法,CCMP就是AES,不推荐使用TKIP,除非设备不支持。
wpa_pairwise=CCMP
# 默认情况下rsn_pairwise自动设置为wpa_pairwise的值,当然也可以手动指定。
#rsn_pairwise=CCMP
#wpa_group_rekey=600
#wpa_strict_rekey=1
#wpa_gmk_rekey=86400
#wpa_ptk_rekey=600
# 预认证
#rsn_preauth=1
#rsn_preauth_interfaces=wlp2s0 br0 enp3s0
#peerkey=1
# 80211w支持,0 禁用(默认),1 可选,2 强制使用(其他方式将拒绝) 有些网卡不支持
#ieee80211w=1
# AES-128-CMAC(默认) BIP-GMAC-128 BIP-GMAC-256 BIP-CMAC-256 四种
# 一般通用设备都支持AES-128-CMAC,其他的不一定
#group_mgmt_cipher=AES-128-CMAC
#assoc_sa_query_max_timeout=1000
#assoc_sa_query_retry_timeout=201
#disable_pmksa_caching=0
#okc=1
#sae_anti_clogging_threshold=5
#sae_groups=19 20 21 25 26
##### IEEE 802.11r configuration ##############################################
# Wi-Fi无线漫游标准
#mobility_domain=a1b2
#r0_key_lifetime=10000
#r1_key_holder=000102030405
#reassociation_deadline=1000
#pmk_r1_push=1
##### Neighbor table ##########################################################
#ap_table_max_size=255
#ap_table_expiration_time=3600
##### IEEE 802.11v-2011 #######################################################
# Wi-Fi节能版
#time_advertisement=2
#time_zone=CST8
# 下面三项有些网卡不支持
#wnm_sleep_mode=1
#bss_transition=1
#proxy_arp=1

为了便于使用,将注释去除 (所用协议较老,请参照最新版)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
interface=wlan0
driver=nl80211
#修改名字
ssid=AP-Pi4
utf8_ssid=1
hw_mode=g
channel=7
ieee80211n=1
macaddr_acl=0
auth_algs=1
wmm_enabled=0
wpa=2
#密码设置
wpa_passphrase=12345678
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP
  • ssid: WiFi 名称,8~64 个字符,最好用英文字母,不要出现特殊字符
  • hw_mode: WiFi 网络模式,一般填 g 即可,设备支持的话可以填 a 启用 5G 频段:

    • a = IEEE 802.11a (5 GHz)
    • b = IEEE 802.11b (2.4 GHz)
    • g = IEEE 802.11g (2.4 GHz)
  • channel: 信道编号。如果上面配置了 hw_mode=g 使用 2.4G 频段,则一般填 7 即可。如果配置了 5G 频段,则信道编号有所不同,具体参考:无线局域网信道列表 - 维基百科,自由的百科全书 (wikipedia.org)
  • wpa_passphrase: WiFi 密码,最好用英文加数字,不要出现特殊字符

最新版配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
interface=wlan0
driver=nl80211
ssid=AP-Pi4
hw_mode=a
channel=0
ieee80211n=1
ieee80211ac=1
ieee80211ax=1
ieee80211d=1
ieee80211h=1
country_code=CN
auth_algs=1
wpa=2
wpa_passphrase=123456789
wpa_key_mgmt=WPA-PSK WPA-PSK-SHA256
rsn_pairwise=CCMP
macaddr_acl=0
wmm_enabled=1
wmm_ac_bk_cwmin=4
wmm_ac_bk_cwmax=10
wmm_ac_bk_aifs=7
wmm_ac_bk_txop_limit=0
wmm_ac_bk_acm=0
wmm_ac_be_aifs=3
wmm_ac_be_cwmin=4
wmm_ac_be_cwmax=10
wmm_ac_be_txop_limit=0
wmm_ac_be_acm=0
wmm_ac_vi_aifs=2
wmm_ac_vi_cwmin=3
wmm_ac_vi_cwmax=4
wmm_ac_vi_txop_limit=94
wmm_ac_vi_acm=0
wmm_ac_vo_aifs=2
wmm_ac_vo_cwmin=2
wmm_ac_vo_cwmax=3
wmm_ac_vo_txop_limit=47
wmm_ac_vo_acm=0
he_su_beamformer=1
he_su_beamformee=1
he_mu_beamformer=1
he_bss_color=5
he_default_pe_duration=0
he_basic_mcs_nss_set=2
he_oper_centr_freq_seg0_idx=0
require_ht=1

he_su_beamformee=1
he_su_beamformer=1
he_bss_color=3
he_twt_required=1
vht_capab=[SHORT-GI-80][RX-STBC1][TX-STBC][SU-BEAMFORMER][SU-BEAMFORMEE]

编辑/etc/default/hostapd文件,将DAEMON_CONF前面的注释去掉,并加上/etc/hostapd/hostapd.conf

image-20220208150739117

1
2
3
$sudo vim /etc/default/hostapd

DAEMON_CONF="/etc/hostapd/hostapd.conf"

保存退出后启动hostapd

1
2
3
$sudo systemctl unmask hostapd
$sudo systemctl enable hostapd
$sudo systemctl start hostapd

image-20220208153101418

可以看到热点已经开启成功,但是还没有分配IP不能上网。

配置wlan0静态IP

让wlan0的IP地址设置成静态的,然后在通过DHCP同态的去给连接设备分配IP

1
2
$sudo apt install dhcpcd
$sudo vim /etc/dhcpcd.conf

在文件最后添加

1
2
3
interface wlan0
static ip_address=192.168.4.1/24
nohook wpa_supplicant

保存退出,重启dhcpcd服务:

1
$sudo systemctl restart dhcpcd

查看wlan0的IP地址:ifconfig ,可以发现,wlan0的IP已经改变为之前设置的地址

image-20220209160315594

安装并配置dnsmasq服务

Dnsmasq 提供 DNS 缓存和 DHCP 服务功能。作为域名解析服务器(DNS),dnsmasq可以通过缓存 DNS 请求来提高对访问过的网址的连接速度。作为DHCP 服务器,dnsmasq 可以用于为局域网电脑分配内网ip地址和提供路由。DNS和DHCP两个功能可以同时或分别单独实现。dnsmasq轻量且易配置,适用于个人用户或少于50台主机的网络。此外它还自带了一个 PXE 服务器。

安装dnsmasq服务

1
2
$ sudo apt install dnsmasq
$ sudo systemctl stop dnsmasq

配置dnsmasq

编辑/etc/dnsmasq.conf文件,将里面的内容删除或者注释掉。

1
2
3
4
5
6
7
8
9
10
sudo vim /etc/dnsmasq.conf

#添加新内容
interface=wlan0
dhcp-range=192.168.4.2,192.168.4.20,255.255.255.0,24h

#dhcp 服务会给客户端分配 192.168.4.2 到 192.168.4.20 的 IP 空间,并设置24 小时租期。

#重启dnsmasq服务
$sudo systemctl restart dnsmasq

配置完后连接到热点已经自动分配到了一个IP地址,但是还不能上网

image-20220209162149776

配置IP转发

编辑 /etc/sysctl.conf 系统配置文件,将 net.ipv4.ip_forward=1 前面的注释去掉。

1
2
3
4
$sudo vim /etc/sysctl.conf

#net.ipv4.ip_forward=1
#将前面的 # 号删除

image-20220209162842756

修改防火墙规则

安装iptables

1
apt install iptables
1
2
3
4
5
6
7
8
9
10
11
12
13
$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


##若要通过热点建立NAS开启以下防火墙规则
#sudo iptables -A INPUT -p tcp --dport 139 -j ACCEPT
#sudo iptables -A OUTPUT -p tcp --sport 139 -j ACCEPT
#sudo iptables -A INPUT -p tcp --dport 445 -j ACCEPT
#sudo iptables -A OUTPUT -p tcp --sport 445 -j ACCEPT



为了避免每次重启后都要重新配置,将防火墙规则写入开机启动项

1
2
将防火墙规则写入文件
$sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"

编辑/etc/rc.local,将iptables-restore < /etc/iptables.ipv4.nat加到exit 0前面。

1
2
3
4
5
6
$sudo vim /etc/rc.local
#加在exit 0前面
iptables-restore &lt; /etc/iptables.ipv4.nat
若执行后出现:sh: 1: iptables-save: not found
要先安装iptables
$sudo apt install iptables

image-20220209163455762

保存退出后重启树莓派:sudo reboot

网络测试

经过一段时间的测试,能够正常访问互联网,网速也还可以,但是在流量较大时会间歇性断开连接,上传速率也有些异常,目前还不清楚是什么原因造成。(已解决)

image-20220209185439101

常见问题修复

网络慢问题分析及解决办法

设置hostapd开机自启失败解决办法

可能原因:NetworkManager占用wlan0导致启动失败

解决办法:禁用 NetworkManager 控制 wlan0

  1. 创建一个 NetworkManager 的配置文件

    1
    sudo nano /etc/NetworkManager/conf.d/no-wlan0.conf
  2. 编辑配置文件

    1
    2
    [keyfile]
    unmanaged-devices=interface-name:wlan0
  3. 重启NetworkManager

    1
    sudo systemctl restart NetworkManager