初入树莓派4----无线中继路由
树莓派实现无线中继
资料来源:
https://beekc.top/2019/08/20/raspberry-wifi-ap/
更新
1 | 19.01.06 初始化 |
导语
- 租的房间距离主路由隔了好远,又加上电脑的无线网卡信号极差.上网的体验可想而知,频繁掉线,卡顿.
- 手头还有吸尘器 3B 和一个 rtl8812au ,rtl8812au 连接主路由科比电脑的无线网卡好多了,寻思中继一下路由.
- 没想到是个大坑,现在才出来…😂.
方案
路由中继有交换机和桥接两种.
- 交换机即树莓派连上主路由,再自己开个热点组个子网.
- 桥接是直接中继主路由的信号 Dhcp 还是交给主路由,形式看树莓派根本不存在.
我还有 NAS ,不太想直接连到主路由,这里选交换机了.虽然桥接的性能可能更好一点.
开热点自然是 hostapd ,负责 dncp 的这里选之前用过的 dnsmasq (虽然很久没用了).
3B 的无线网卡只支持到 802.11g ,信号也不是很好,还好热点需要覆盖的范围也有限,就用 3B 自带的无线网卡开热点了.
没想到 rtl8812au 的驱动却是多磨.gnab/rtl8812au 的驱动编译后运行很好,但是就是不支持开热点(以后还想升级来着).几次更换无果,直接切到了 kali ,网卡驱动都不用编译,热点工作好好的.但是 kali 的iptables 有问题,设置无法生效. 无奈又切换回来了,最后换成了 abperiasamy/rtl8812AU_8821AU_linux 才算是正常了.
这里假设子网 ip 段为 192.168.3.1/8 .把 eth0 的 ip 分配成 192.168.4.1 方便管理.
这样汇总成了 init.sh ap.sh
两个脚本. init.sh 负责初始化系统, ap.sh 建立 wifi.涉及 iptables 又复习了一遍.
一定不要直接下载运行,需要按照自己需要自行修改才可以.
rtl8812au驱动
安装必要软件
1
sudo apt-get install linux-image-rpi-rpfv linux-headers-rpi-rpfv raspberrypi-kernel-headers dkms build-essential bc
下载驱动源文件
1
2git clone https://github.com/abperiasamy/rtl8812AU_8821AU_linux.git
cd rtl8812AU_8821AU_linux还需要修改一下 Makefile ,设置为树莓派.
1
2CONFIG_PLATFORM_I386_PC = n
CONFIG_PLATFORM_ARM_RPI = y编译 and 安装
1
2
3make -j4
sudo make install
sudo modprobe -a rtl8812au
init.sh
修改清华源
1
2
3
4
5
6
7
8
9
10sudo mv /etc/apt/sources.list /etc/apt/sources.list.bak
sudo bash -c "cat > /etc/apt/sources.list <<EOF
deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ buster main non-free contrib
EOF"
sudo mv /etc/apt/sources.list.d/raspi.list /etc/apt/sources.list.d/raspi.list.bak
sudo bash -c "cat > /etc/apt/sources.list.d/raspi.list <<EOF
deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui
EOF"系统更新
1
sudo apt-get update
安装必备的软件
1
2
3
4
5# 安装vim htop
sudo apt install -y vim htop
# 安装hostapd dnsmasq
sudo apt install -y hostapd dnsmasq假设主路由名称为 A ,密码 12345678.
1
2
3
4
5
6
7
8# 写入默认wifi(修改)
sudo bash -c "cat >> /etc/wpa_supplicant/wpa_supplicant.conf <<EOF
network={
ssid=\"A\"
psk=\"12345678\"
priority=1
}
EOF"写入默认ip配置 eth0 是192.168.4.1 ; wlan0 是 192.168.3.1 ; wlan1 是
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
28sudo bash -c "cat >> /etc/network/interfaces <<EOF
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.4.1
netmask 255.255.255.0
auto wlan0
allow-hotplug wlan0
#iface wlan0 inet dhcp
#wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
iface wlan0 inet static
address 192.168.3.1
netmask 255.255.255.0
auto wlan1
allow-hotplug wlan1
iface wlan1 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
#auto wlan2
#allow-hotplug wlan2
#iface wlan2 inet dhcp
#wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
EOF"系统优化,开启bbr等.
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
28sudo sudo bash -c "cat >> /etc/sysctl.conf <<EOF
#TCP配置优化(不然你自己根本不知道你在干什么)
fs.file-max = 51200
#提高整个系统的文件限制
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
net.core.netdev_max_backlog = 250000
net.core.somaxconn = 4096
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range = 10000 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_mem = 25600 51200 102400
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864
net.ipv4.tcp_mtu_probing = 1
net.ipv4.tcp_congestion_control = bbr
net.ipv4.ip_forward = 1
#END OF LINE
EOF"
sudo sysctl -p
ap.sh
hostapd 的默认配置在 /etc/hostapd/hostapd.conf.这里默认名称为 PI 密码 12345678
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17sudo bash -c "cat >/etc/hostapd/hostapd.conf <<EOF
interface=wlan0
driver=nl80211
hw_mode=g
channel=3
ieee80211n=1
wmm_enabled=1
ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40]
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
ssid=PI
wpa_passphrase=12345678
EOF"dnsmasq 的配置文件在 /etc/dnsmasq.conf,这里要和 wlan1 的静态ip地址
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22sudo bash -c "cat >>/etc/dnsmasq.conf <<EOF
# Use interface wlan0
interface=wlan0
# Explicitly specify the address to listen on
listen-address=192.168.3.1
# Bind to the interface to make sure we aren't sending things elsewhere
bind-interfaces
# Forward DNS requests to AliDNS
server=223.5.5.5
# Don't forward short names
domain-needed
# Never forward addresses in the non-routed address spaces
bogus-priv
# Assign IP addresses between 192.168.3.50 and 192.168.3.150 with a 12 hour lease time
dhcp-range=192.168.3.50,192.168.3.150,12h
EOF"开机启动
1
2
3
4sudo systemctl enable dnsmasq
#直接enable可能有错误
sudo systemctl unmask hostapd
sudo systemctl enable hostapdiptables
1
2
3
4
5
6
7
8
9
10
11
12
13
14# wlan1 出口动态nat
sudo iptables -t nat -A POSTROUTING -o wlan1 -j MASQUERADE
# 允许回来的链接 入口wlan1 入口 wlan0 .
sudo iptables -A FORWARD -i wlan1 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
# 允许出去的链接 出口wlan1 入口wlan0
sudo iptables -A FORWARD -i wlan0 -o wlan1 -j ACCEPT
# 保存 iptables 开机恢复
sudo apt-get install -y iptables-persistent
sudo service netfilter-persistent save
sudo bash -c "cat >>/etc/rc.local <<EOF
iptables-restore < /etc/iptables/rules.v4
EOF"如果你没有设置 eht0 静态ip,那么 raspberry 默认路由是 eth0 这样还是 wlan0 下面连不上网.需要变动一下路由表.假设主路由网关在 192.168.1.1.
1
2
3
4# 删除默认出口 eth0
sudo route del default gw 192.168.1.1 eth0
# 增加为 wlan1
sudo route add default gw 192.168.1.1 wlan1
后记
- 效果真是不太好,主要是受制于吸尘器 3B 垃圾的自带 AP .带宽显示是72M,实测只有不到30M.如果是 rtl8812u 开 5G频段,瓶颈反而是 3B 的 USB 口了.手头另一个 usb 网卡是垃圾的随身 wifi ,效果和 3B 自带的差不太多.就此中继信号的梦想中断了…