什么是软路由和OpenWrt?
与软路由相对的是我们平时家用的路由器,软路由是指利用台式机或服务器等设备配合软件形成的路由解决方案,主要靠软件的设置,达成路由器的功能;而硬路由则是以特有的硬设备,包括处理器、电源供应、嵌入式软件,提供设定的路由器功能。
OpenWrt便是软路由系统中的十分受欢迎的一员,它是一款高度模块化、高度自动化的嵌入式Linux系统,拥有强大的网络组件和扩展性,常常被用于工控设备、路由器等设备中。
OpenWrt可以实现的功能
得益于高度的可定制和可扩展性,OpenWrt软路由除了可以完成一般家用路由器的功能之外,还可以实现:端口转发、内网穿透、4G联网、FTP服务器等更多强大功能。
如在笔者的“基于4G模块的远程采集控制与数据传输的实现”的项目中,以微雪SIM7600 CE 4G模块、树莓派4B(2GB RAM)、5口千兆交换机模块为硬件;以OpenWrt为系统搭建了一台软路由,该软路由中通过控制4G模块联网完成数据传输;通过配置端口转发实现了本地多级路由下的设备互通;通过Frp内网穿透客户端结合云服务器端Frp内网穿透服务实现异地组网进而实现项目的远程开发、调试、部署,远程访问设备终端等。
OpenWrt的编译和定制
对于有一定Linux使用基础的用户来说,OpenWrt的编译已经十分便捷。本次编译采用Lean的Github项目源码,项目源码链接为:https://github.com/coolsnowwolf/lede
编译过程可参考视频教程:https://www.bilibili.com/video/BV1AA411Y7eu
编译过程大致分为:
- 配置编译环境
- 拉取源码
- 更新及安装组件
- 勾选配置信息
- 编译等几个步骤。
配置编译环境:
首先编译环境建议选择Ubuntu 1804操作系统,同时必须具备全局科学上网环境,可以选择谷歌云、Github Action、Vmware虚拟机等等,在此基础上,以非Root用户登录终端并输入以下命令:
sudo apt-get -y update 获取最新的软件列表
sudo apt-get -y upgrade 升级软件到最新的版本
sudo apt-get -y install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch python3.5 python2.7 unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs git-core gcc-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint device-tree-compiler g++-multilib antlr3 gperf wget swig rsync 安装编译环境依赖
git clone https://github.com/coolsnowwolf/lede 拉取项目源码到本地
cd lede/ 进入项目文件夹
./scripts/feeds update -a 更新组件
./scripts/feeds install -a 下载组件
勾选配置信息
make menuconfig 勾选系统基本信息并配置所需的功能
这一步只需在以下的图形界面下按空格或回车勾选相应选项即可完成配置。
以本次编译的系统为例,首先选择树莓派 4B对应的CPU型号等信息:
之后,由于勾选对应的CPU型号后,配置文件中会加载一部分默认配置,这部分配置已经包含了最基础的路由器功能,如DHCP、防火墙、WIFI等,因此我们只需要在此基础之上勾选我们额外需要的功能即可。
添加对于3G、4G 等USB外接设备的支持
本文使用微雪电子SIM7600CE 4G模块其外观如下图所示,相关特性详见官方 https://www.waveshare.net/wiki/SIM7600CE_4G_HAT
在OpenWrt官方的文档https://oldwiki.archive.openwrt.org/doc/howtobuild/wireless-router-with-a-3g-dongle中明确说明了如何构建支持3G、4G的系统镜像,但由于官方文档老旧,部分选项的路径已经失效,本文重新整理了全部软件包的路径,使用者只需要按照如下路径全部双击空格以进行勾选即可。
Kernel Modules
USB Support
<*> kmod-usb2
<*> kmod-usb-ohci
<*> kmod-usb-uhci
<*> kmod-usb-acm
<*> kmod-usb-net
(以下为官方指定的部分,建议直接全部勾选)
<*> kmod-usb-net-asix...... Kernel module for USB-to-Ethernet Asix convertors
<*> kmod-usb-net-cdc-eem..................... Support for CDC EEM connections
-*- kmod-usb-net-cdc-ether.............. Support for cdc ethernet connections
<*> kmod-usb-net-cdc-mbim..................... Kernel module for MBIM Devices
-*- kmod-usb-net-cdc-ncm..................... Support for CDC NCM connections
<*> kmod-usb-net-cdc-subset...... Support for CDC Ethernet subset connections
<*> kmod-usb-net-dm9601-ether........ Support for DM9601 ethernet connections
<*> kmod-usb-net-hso.. Kernel module for Option USB High Speed Mobile Devices
<*> kmod-usb-net-ipheth..................... Apple iPhone USB Ethernet driver
<*> kmod-usb-net-kalmia................... Samsung Kalmia based LTE USB modem
<*> kmod-usb-net-kaweth.. Kernel module for USB-to-Ethernet Kaweth convertors
<*> kmod-usb-net-mcs7830
<*> kmod-usb-net-pegasus
<*> kmod-usb-net-qmi-wwan.................................... QMI WWAN driver
<*> kmod-usb-net-rndis......................... Support for RNDIS connections
<*> kmod-usb-net-sierrawireless.......... Support for Sierra Wireless devices
<*> kmod-usb-net-smsc95xx. SMSC LAN95XX based USB 2.0 10/100 ethernet devices
<*> kmod-usb-serial..................... Support for USB-to-Serial converters
(以下为官方指定的部分,建议直接全部勾选)
<*> kmod-usb-serial-ark3116........ Support for ArkMicroChips ARK3116 devices
<*> kmod-usb-serial-belkin........................ Support for Belkin devices
<*> kmod-usb-serial-ch341.......................... Support for CH341 devices
<*> kmod-usb-serial-cp210x........... Support for Silicon Labs cp210x devices
<*> kmod-usb-serial-cypress-m8.............. Support for CypressM8 USB-Serial
<*> kmod-usb-serial-ftdi............................ Support for FTDI devices
<*> kmod-usb-serial-ipw.................... Support for IPWireless 3G devices
<*> kmod-usb-serial-keyspan........ Support for Keyspan USB-to-Serial devices
<*> kmod-usb-serial-mct.............. Support for Magic Control Tech. devices
<*> kmod-usb-serial-mos7720.............. Support for Moschip MOS7720 devices
<*> kmod-usb-serial-motorola-phone............ Support for Motorola usb phone
<*> kmod-usb-serial-option................... Support for Option HSDPA modems
<*> kmod-usb-serial-oti6858...... Support for Ours Technology OTI6858 devices
<*> kmod-usb-serial-pl2303............... Support for Prolific PL2303 devices
<*> kmod-usb-serial-qualcomm................. Support for Qualcomm USB serial
<*> kmod-usb-serial-sierrawireless....... Support for Sierra Wireless devices
<*> kmod-usb-serial-ti-usb...................... Support for TI USB 3410/5052
<*> kmod-usb-serial-visor............... Support for Handspring Visor devices
-*- kmod-usb-serial-wwan..................... Support for GSM and CDMA modems
Network
<*>chat
<*>ppp
Network
WWAN
<*>uqmi
<*>umbim
<*>comgt
Utilities
<*>usb-modeswitch
Luci
Collections
<*> luci
Applications
<*> luci-app-mwan3
<*> luci-app-qos
Protocols
<*> luci-proto-3g
-*- luci-proto-ppp
<*> luci-proto-qmi
添加USB3.0转千兆网口有线网卡支持
(具体型号依据手中的有线网卡型号而定,本次采用下图型号)
Kernel Modules
USB Support
<*> kmod-usb-usb3
<*> kmod-usb-net-asix
<*> kmod-usb-net-asix-ax88179
添加Frp客户端
Luci
Applications
<*> luci-app-frpc
勾选好需要的功能之后,保存配置文件并退出即可,此时在lede/目录下会生成一个名为.comfig的配置文件,该文件中包含了以上步骤中的宣布配置参数,可下载并保存,日后需要再次编译相同配置的系统镜像或在此基础上增添新的功能时,可以直接将将旧的.config文件放到lede/目录下来节省重新配置旧参数的时间。
使用screen防止编译过程终端会话意外断开
在开始编译之前,由于考虑到初次编译时间长达数小时,为了避免编译中途终端连接断开等情况的发生,强烈建议使用screen开启一个新的会话,这样即使会话断开,编译任然会继续在后台运行,保证编译中途不会中断,当然也可以选择全程都在screen创建的会话下进行,这样更加保险。
安装和使用screen可在终端输入命令:
sudo apt-get install screen -y 安装screen
sudo screen -S compile 新建一个名为 compile 的会话
sudo screen -d compile 断开处于连接状态的会话(意外退出的
会话被锁死,使用此命令将其释放后即可重连)
sudo screen -r compile 重连会话
编译OpenWrt系统镜像
使用screen创建好会话后进入lede/目录下输入命令:
make -j8 download V=s && make -j1 V=s 下载dl库并开启带线程编译
获取镜像
编译成功后的镜像位于lede/bin/target……目录下,如树莓派4B的镜像目录为:lede/bin/target/bcm27xx/bcm2711,根据型号自行选择对应的目录找到镜像下载到本地即可。
提供本次视频使用的镜像:镜像-树莓派4b+sim7600ce+openwrt.zip
烧写镜像
电脑端安装工具balenaEtcher,之后选择下载好的.img格式的镜像及SD卡(8G足够),点击烧录即可。