Debian开启热点共享网络

项目运行环境

安装所需软件

  1. 主机系统Debian Buster,有两个有线网卡,一个无线网卡

  2. eth0通过网线接入互联网,eth0与wlan0作为局域网接入点

  3. 桥接eth0和wlan0并设置桥接网卡br-lan为静态IP

  4. 通过dnsmasq为接入设备提供内网IP地址分配

  5. 使用hostapd来发射热点供设备接入局域网

1
sudo apt install dnsmasq hostapd bridge-utils

配置静态地址

  1. 以下方案选一种即可,推荐方案一
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 根据你选择的方案,先关闭其他方案防止发生冲突
systemctl stop wpa_supplicant
systemctl disable wpa_supplicant

# 关闭原始的networking管理方式,使用配置文件:/etc/network/interfaces
systemctl stop networking
systemctl disable networking

# 关闭systemd自带的网络管理,使用配置文件:/etc/systemd/network/
systemctl stop systemd-networkd
systemctl disable systemd-networkd
systemctl mask systemd-networkd

# 许多桌面系统用NetworkManager管理网络,使用配置文件:/etc/NetworkManager/NetworkManager.conf
systemctl stop NetworkManager
systemctl disable NetworkManager
systemctl mask NetworkManager
  1. 方案一:通过networking来配置桥接网卡
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# ifupdown使用的配置文件:/etc/network/interfaces
sudo apt install ifupdown

# 配置一个桥接eth0的网卡br-lan,如需新增网卡到lan将其添加到bridge_ports后即可
# 所有流量都会转发到eth0。wlan0会在后面hostapd启动时加入br-lan,无需在此设置
sudo cat > /etc/network/interfaces.d/br-lan << EOF
auto br-lan
iface br-lan inet static
address 192.168.1.1/24
bridge_ports eth0
bridge_fd 0
up iptables -t nat -A POSTROUTING -s 192.168.1.1/24 -o eth0 -j MASQUERADE
EOF

# 最后重载配置
sudo systemctl start networking
sudo systemctl enable networking
  1. 方案二:通过systemd-networkd来配置桥接网卡
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
# systemd-networkd是systemd自带的网络管理方案,可以通过如下来配置

# 创建一个虚拟网卡
sudo cat > /etc/systemd/network/20-br-lan.netdev << EOF
[NetDev]
Name=br-lan
Kind=bridge
EOF

# 为虚拟网卡配置静态地址
sudo cat > /etc/systemd/network/30-br-lan.network << EOF
[Match]
Name=br-lan

[Network]
Address=192.168.1.1/24
EOF

# 将无线网卡桥接到虚拟网卡
sudo cat > /etc/systemd/network/40-br-wlan0.network << EOF
[Match]
Name=wlan0

[Network]
Bridge=br-lan
EOF

# 将有线网卡桥接到虚拟网卡
sudo cat > /etc/systemd/network/40-br-eth0.network << EOF
[Match]
Name=eth0

[Network]
Bridge=br-lan
EOF

# 最后使其开机自启
sudo systemctl start systemd-networkd
sudo systemctl enable systemd-networkd
  1. 方案三:通过命令行手动配置桥接网卡
1
2
3
4
5
6
7
8
9
10
11
# 网桥的作用是通过桥接两个网卡使它们之间互相连通,下面是它的部分使用命令
brctl addbr br-lan # 创建网桥接口
brctl show # 查看网桥信息
ip link set br-lan up # 启用网桥接口
brctl addif br-lan wlan0 eth0 # 桥接两个网卡
ip addr add 192.168.1.1/24 dev br-lan # 设置静态地址

bridge link # 查看包涵网卡
brctl delif br-lan eth0 # 移除一个网卡
ip br-lan down # 停用网桥接口
brctl delbr br-lan # 删除网桥接口
  1. 方案五:安装配置dhcpcd来实现静态地址
1
2
3
4
5
6
7
8
9
10
sudo apt install dhcpcd5

# sudo vi /etc/dhcpcd.conf 在文件末尾添加如下内容:
interface br-lan # 使用的接口
static ip_address=192.168.1.1/24 # /24的意思是子网掩码为 255.255.255.0
nohook wpa_supplicant # 禁止接口连接WIFI

# 最后使其开机自启
sudo systemctl start dhcpcd
sudo systemctl enable dhcpcd

配置DHCP服务

  1. 有多种方案可实现提供DHCP服务,推荐方案一
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 解决dnsmasq启动报错53端口被占用的问题

# 首先查看是谁占用了53端口
root@Debian:~# netstat -tulnp | grep 53
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 185/systemd-resolve
udp 0 0 127.0.0.53:53 0.0.0.0:* 185/systemd-resolve
root@Debian:~#

# 关闭占用端口的systemd-resolved服务
sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved

# 删除默认的软链接并重新写入DNS服务器,否则DNSMASQ启动会报找不到它
sudo rm /etc/resolv.conf
sudo bash -c "echo 'nameserver 114.114.114.114' > /etc/resolv.conf"
  1. 方案一:安装配置dnsmasq来提供DHCP服务
1
2
3
4
5
6
7
8
# 以下操作为接入的设备提供192.168.1.100到192.168.1.249之间的地址租用24小时

# sudo vi /etc/dnsmasq.conf 在文件末尾添加如下内容:
interface=br-lan # 使用的接口
listen-address=127.0.0.1,192.168.1.1 # 监听的地址
server=223.5.5.5 # 使用的 DNS
server=223.6.6.6
dhcp-range=br-lan,192.168.1.100,192.168.1.249,255.255.255.0,24h
  1. 方案二:安装配置udhcpd来提供DHCP服务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 编辑/etc/default/udhcpd,找到该行去掉注释并改为为DHCPD_ENABLED="yes"
# 修改/etc/udhcpd.conf配置文件来配置监听网卡和网段及域名解析
# 通过sudo udhcpd -f可测试配置文件是否正确

sudo cat > /etc/udhcpd.conf << EOF
start 192.168.1.100
end 192.168.1.200
interface br-lan
max_leases 80
remaining yes
opt dns 114.114.114.114 114.114.115.115
option subnet 255.255.255.0
opt router 192.168.1.1
opt wins 192.168.1.10
option dns 127.0.0.1
option domain local
option lease 864000
EOF

配置热点服务

  1. 指定hostapd的配置文件路径
1
2
# 修改 /etc/default/hostapd 中的 #DAEMON_CONF 这行为 
DAEMON_CONF="/etc/hostapd/hostapd.conf"
  1. 编辑/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
# 下面两个分别是2.4G和5G频率的例子
sudo cat > /etc/hostapd/hostapd.conf << EOF
country_code=US
interface=wlan0
bridge=br-lan
driver=nl80211
ssid=RPI4
hw_mode=g
channel=11
auth_algs=1
ignore_broadcast_ssid=0
wmm_enabled=1
macaddr_acl=0
ieee80211n=1
ht_capab=[SHORT-GI-20][DSSS_CK-40]
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP
wpa_passphrase=password
EOF

sudo cat > /etc/hostapd/hostapd.conf << EOF
country_code=US
interface=wlan0
bridge=br-lan
driver=nl80211
ssid=RPI4
hw_mode=a
channel=36
auth_algs=1
ignore_broadcast_ssid=0
wmm_enabled=1
macaddr_acl=0
ieee80211n=1
ht_capab=[HT40+][SHORT-GI-20][SHORT-GI-40][DSSS_CK-40]
ieee80211ac=1
vht_capab=[SHORT-GI-80][SU-BEAMFORMEE]
vht_oper_chwidth=0
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
wpa_passphrase=password
EOF
  1. 测试配置文件是否正确以及程序是否可以正常启动:hostapd -dd /etc/hostapd/hostapd.conf

  2. 如测试没有报错那么也可以让热点程序在后台运行:hostapd -B /etc/hostapd/hostapd.conf

访问外网

  1. 开启内核转发
1
2
3
4
5
# 临时开启内核转发,重启失效
sudo sysctl -w net.ipv4.ip_forward=1

# 永久开启需要编辑 /etc/sysctl.conf 去掉下面行前的 # 注释
# net.ipv4.ip_forward=1
  1. 启用流量转发(如果使用方案一,那么桥接网卡时已设置流量转发,这步可跳过)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 将来自192.168.1.1/24的流量转发到本机联网的端口eth0
# 如果Debian主机使用其他网卡连接外网,则把eth0改为其他网卡

# 临时启用流量转发,重启失效
sudo iptables -t nat -A POSTROUTING -s 192.168.1.1/24 -o eth0 -j MASQUERADE

#################################################
# 永久开启流量转发需要保存转发规则到iptables.ipv4.nat
iptables -t nat -A POSTROUTING -s 192.168.1.1/24 -o eth0 -j MASQUERADE
iptables-save > /etc/iptables.ipv4.nat

# A. 开机时再加载保存的规则,将下面命令添加到/etc/rc.local中的exit 0之前
iptables-restore < /etc/iptables.ipv4.nat

# B. 或者执行下面操作这个让网口启动前自动加载保存的规则
echo "/sbin/iptables-restore < /etc/iptables.ipv4.nat" > /etc/network/if-pre-up.d/iptables
chmod +x /etc/network/if-pre-up.d/iptables
  1. 设置软件开机来自动共享网络
1
2
3
4
5
6
sudo systemctl enable dnsmasq
sudo systemctl unmask hostapd
sudo systemctl enable hostapd

# sudo systemctl enable udhcpd
# sudo systemctl enable dhcpcd
  1. 上述操作完成后重启系统再连接热点便可以访问外网了

扩展知识

  1. eth0不接入网线并配置了/etc/network/interfaces.d/xxx,会导致开机等待5分钟。编辑/lib/systemd/system/networking.service,修改TimeoutStartSec为1min可以减少等待时间

  2. hostapd设置的信道或ht_capab项设置错误可能会出现运行失败导致无法开机自启

  1. 使用iw list获取网卡信息中对应频段的Capabilities可看它支持什么功能,ht_capab设置越全面,你得到的速度就越快。如果报错或不确定那就牺牲一些速度,删掉报错和不确定的项。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# HT可选项:
# [HT40-]和[HT40+]的可用频率分别为:5-13,40,48,56,64和1-7,36,44,52,60
HT20/HT40 :[HT40]或[HT40-]或[HT40+]
Static SM Power Save :[SMPS-STATIC]或[SMPS-DYNAMIC]
RX Greenfield :[GF]
RX HT20 SGI :[SHORT-GI-20]
RX HT40 SGI :[SHORT-GI-40]
RX STBC 1-stream :[RX-STBC1]
TX STBC :[TX-STBC]
Max AMSDU length: 7935 bytes :[MAX-AMSDU-7935] 默认[MAX-AMSDU-3839]
DSSS/CCK HT40 :[DSSS_CK-40]

# VHT可选项:
Max MPDU length: 7991 :[MAX-MPDU-7991] 默认[MAX-MPDU-3895]
Supported Channel Width: :[VHT160]或[VHT160-80PLUS80]需设备支持
short GI (80 MHz) :[SHORT-GI-80]
SU Beamformee :[SU-BEAMFORMEE]
  1. 举个例子说明下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 如果使用iw list获取的网卡Capabilities信息如下:
......
Capabilities: 0x1062
HT20/HT40
Static SM Power Save
RX HT20 SGI
RX HT40 SGI
No RX STBC
Max AMSDU length: 3839 bytes
DSSS/CCK HT40
Maximum RX AMPDU length 65535 bytes (exponent: 0x003)
Minimum RX AMPDU time spacing: 16 usec (0x07)
HT TX/RX MCS rate indexes supported: 0-7
VHT Capabilities (0x00001020):
Max MPDU length: 3895
Supported Channel Width: neither 160 nor 80+80
short GI (80 MHz)
SU Beamformee
VHT RX MCS set:
......

# 那么ht_capab和vht_capab的设置就可以如下:
ht_capab=[HT40+][SHORT-GI-20][SHORT-GI-40][DSSS_CK-40][MAX-AMSDU-3895]
vht_capab=[MAX-MPDU-3895][SHORT-GI-80][SU-BEAMFORMEE]
  1. 如果 iw reg set US 指定国家码无效,那么请检查下是否安装了 wireless-regdb 或者看 wpa_supplicant 服务是否已停止了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
leux@h88k:~$ sudo iw reg get
global
country 00: DFS-UNSET
(2402 - 2472 @ 40), (6, 20), (N/A)
(2457 - 2482 @ 20), (6, 20), (N/A), AUTO-BW, PASSIVE-SCAN
(2474 - 2494 @ 20), (6, 20), (N/A), NO-OFDM, PASSIVE-SCAN
(5170 - 5250 @ 80), (6, 20), (N/A), AUTO-BW, PASSIVE-SCAN
(5250 - 5330 @ 80), (6, 20), (0 ms), DFS, AUTO-BW, PASSIVE-SCAN
(5490 - 5730 @ 160), (6, 20), (0 ms), DFS, PASSIVE-SCAN
(5735 - 5835 @ 80), (6, 20), (N/A), PASSIVE-SCAN
(57240 - 63720 @ 2160), (N/A, 0), (N/A)

leux@h88k:~$ dmesg | grep cfg80211
[ 8.242481] cfg80211: failed to load regulatory.db
leux@h88k:~$ ls /usr/lib/firmware/regulatory*
/usr/lib/firmware/regulatory.db
/usr/lib/firmware/regulatory.db.p7s
  1. 使用iw list可查看网卡支持什么频段的热点:Frequencies里面的频段没有disabled或no IR字样的都可以,只显示no IR就是你的国家码不支持当前频道

  2. 如果iw list频段里面全部显示no IR,且 iw reg get 获取到的当前国家码是00,就需要执行 iw reg set US 指定国家码

  3. 设置为澳大利亚可开启更多信道和更强的信号发射功率:iw reg set AU,在5G频段的部分信道下,澳大利亚的最大功率限制为1000mW,而中国则是600mW

  4. 地区设为CN和AU时分别支持的信道:CN:149,153,157,161,165。AU:36,40,44,48,,149,153,157,161,165

  5. 无线信号的频率越高波长越短,抗干扰越强传输距离越弱。所以2.4G比5G的传输距离更远但干扰大。

  6. 影响信号和穿墙的主要因素有两个:无线信号的发射功率越大,信号覆盖也就越广。二是天线的增益越高,信号的覆盖面越窄死角也就越多

  7. 安装Samba可实现网络文件共享

1
2
3
4
5
6
7
8
9
10
11
12
13
apt install samba

# 共享用户家命令只需编辑/etc/samba/smb.conf
# 将[homes]里面的 read only = yes 替换为 writable = yes 即可

smbpasswd -a pi # 添加一个Samba用户pi
smbpasswd -d pi # 禁用一个Samba用户pi
smbpasswd -e pi # 开启一个Samba用户pi
smbpasswd -x pi # 删除一个Samba用户pi

# 最后重启服务即可生效
systemctl restart smbd
systemctl restart nmbd