将树莓派打造为无线中继

让树莓派进行wifi中继,最简单的方式是安装OpenWrt或者LEDE,然后通过Luci界面可以方便的进行操作,前提是你的无线网卡能够在OpenWrt下顺利驱动。
由于我需要中继5G信号,所以选购了一款支持双频的USB无线网卡,主控为RTL8812AU,Realtek实际上间接提供了Linux下网卡驱动的源码,在Github上可以搜索到很多,但是无奈这个驱动交叉编译完成后insmod到OpenWrt和LEDE并不能很好的驱动网卡,无奈之下只好使用Raspbian,通过相关配置来完成需求。

准备工作

  • 已经安装完Raspbian的树莓派,且能够通过串口、SSH或者显示器登陆
  • 网线
  • 电脑

这里我假设你已经在树莓派上安装好了系统,因为树莓派安装系统并不复杂,所以这里不过多赘述。

配置网桥

可能很多人会不解:添加网桥的作用是什么,通过树莓派的以太网口不是已经可以很好的通信了吗?
不知道你有没有想过一个问题,为什么你把网线插到路由器上随便一个lan口,都可以ping通192.168.1.1(假设你的网关是这个),那几个lan口也有IP吗?路由器的lan口到底有什么特殊之处?
学过计算机网络的童鞋应该知道,网桥是一个工作在二层的设备,目的是分离不同的碰撞域,设备之间直接通过mac地址通信。
在Linux系统中,假设我们有4个以太网卡,一个网桥,并且将这4个以太网卡设置为网桥的4个接口,同时将网卡设置为混杂模式,那么我们就得到了一个虚拟的网桥设备,如果再为网桥设置一个IP,那么这个网桥就是传说中的lan了。
实际上基于Linux系统的路由器正是这么做的,在OpenWrt的终端下使用ifconfig命令可以看到一个br-lan的接口,那就是虚拟网桥。

明白了原理,接下来只要知道如何创建网桥并分配接口,配置IP就行了,首先需要安装网桥配置工具:

1
sudo apt install bridge-utils

然后输入如下命令,即可完成配置,更详细的使用方法可以参考man手册。

1
2
3
4
brctl addbr br-lan
brctl addif br-lan eth0
ifconfig br-lan 192.168.1.1 up
ifconfig eth0 0.0.0.0 up

配置IP转发

一般的Linux发行版默认都不会开启ip_forward,因为正常的计算机都是作为终端,没有转发数据报的需求,因此需要手动打开。

第一种方式

1
echo 1 > /proc/sys/net/ipv4/ip_forward

第二种方式

1
2
vim /etc/sysctl.conf
+ net.ipv4.ip_forward = 1

第三种方式

1
sysctl net.ipv4.ip_forward = 1

配置iptables

如果我们中继的是运营商的wifi,那么可能会获得一个公网的IP,这种情况下想让内网的所有设备共享这一个公网IP,需要在wlan0网口启用nat。

1
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE

安装DHCP/DNS服务器

作为一台准路由器,插在上面的设备最好能够自动获取IP,这里我选用的是dnsmasq,因为科学上网比较方便。

1
2
3
apt install dnsmasq
vim /etc/dnsmasq.conf
+ dhcp-range=192.168.1.50,192.168.1.150,255.255.255.0,12h

dnsmasq的功能很强大,这里我仅仅使用了基础的DNS/DHCP功能,你也可以根据自己的需求定制。

在树莓派上连接WiFi

通过图形界面连接wifi难度不大,这里主要说一下通过命令行连接wpa/wpa2加密的wifi。
在Linux发行版中,一般都会集成一套wireless-tools,但是在树莓派中,同时还提供了wpa_supplicant,它基于C/S模型,我们需要使用wpa_cli来和wpa_supplicant通信,完成相关设置。

1
wpa_cli

然后会出现下面这样的命令行界面

1
2
3
4
5
6
7
8
9
10
11
12
wpa_cli v2.4
Copyright (c) 2004-2015, Jouni Malinen <j@w1.fi> and contributors

This software may be distributed under the terms of the BSD license.
See README for more details.


Selected interface 'wlan0'

Interactive mode

>

既然是命令行,就可以敲命令,首先扫描一下wifi

1
scan

然后读取一下扫描的结果

1
scan_result

当看到你需要中继的wifi的SSID后,记下来,然后新建一个空网络

1
add_network

此时会显示新建的网络的编号,如果没看清,可以查看一下当前所有配置过的热点信息

1
list_network

下面我们需要配置网络了,假设新建的网络编号为0

1
2
set_network 0 ssid "OpenWrt"
set_network 0 psk "1234567890"

最后选择一个网络进行连接

1
select_network 0

如果正常的话,就可以连接成功,可以查看当前状态

1
status

后续

此时,将无线路由器的wan口与树莓派的lan口连接,并设置为自动获取IP,就可以上网了。
这样可以将中继的接收方与发送方通过网线连接,因此灵活性更高,前提是你能给树莓派找到一个不会被偷的地方(¬、¬)