在电脑上安装 Openwrt 作为旁路网关
目录
🤔场景
既然回家了,有了家用路由器,就希望各个设备能够不需要安装对应的软件而直接科学上网、屏蔽广告等。
但原来的路由器太小众,没人提供相应的固件,也就是说没法刷机。
后来,我看到有关旁路网关的介绍,觉得这可能是一种解决方案。
📝概念
路由
路由是在任何网络中选择路径的过程。主要包含:路径确定、数据转发。
网关
网关是一个网络连接到另一个网络的“关口”。
只有设置好网关地址,才能实现不同网络之间的互相通信。一般网关地址是具有路由功能的设备的 IP 地址,这些设备有路由器、启用了路由协议的服务器、代理服务器等。
旁路网关
本来路由器就是这个局域网的网关,但是多了一个在路由器旁面的网关,这个网关被叫作旁路网关,又成为旁路由,相当于一个代理。
“你没办法在发烧友圈子外的互联网及各种学术材料中找到对旁路由的描述和定义,当然也找不到合适的英文翻译”,果然这个奇怪的名词,大概是在发烧友大量折腾斐讯 N1/P1/T1 的时期被发明出来的。


旁路由的一般工作原理,发出数据经旁路网关。如果增加了 clash 类似的代理,就直接成了代理服务器了。
一般而言在主路由上分流更好,但是主路由没法实现更多的功能,没法刷机,这时候用旁路由可能是个选择。
设置二级路由器有两种方式:接二级路由器的WAN口、接二级路由器的LAN口。https://www.luyouqi.com/shezhi/7801.html 如果接 LAN 口的话,提前进入管理页面关掉二级路由器的 DHCP 服务器,直接让上游路由器的 DHCP 服务器接管,并设置二级路由器 LAN 口 IP(这一步比较关键,以后能不能进入管理页面,就要靠这个 IP 地址了)。经过我的实验,三级路由都能向一级看齐。后来放弃大伙儿向天翼网关看齐了,因为太垃圾了,连 uPnP 都没有。于是二级到一级连 WAN 口,三级到二级连 LAN 口,把天翼网关只作为光猫使用了。


在这个场景下,要注意 DHCP 服务器的问题,一个网段最好只有一个。这图里的 AP模式无线路由 很有意思。
DHCP 使用了 UDP 协议,UDP 是没有连接的,如果主路由和旁路由同时开启 DHCP,则任意一个 DHCP 服务器都可能会应答终端的申请,进而导致 IP 下发和路由表的混乱造成各种无法连接的疑难杂症。当然,我们可以将两个 DHCP 的子网网段拆分开来解决共存问题,这样的话,就是多级路由了。
🤗开搞
安装
本来自己在 Ubuntu 20.04 上尝试自己编译,结果是编译失败,很大原因是没有开启网络代理。有人对自行编译有过成功尝试,详见:零基础编译OpenWrt看这一篇就够了 – 沫延说
安装前,要下载 vmdk 文件,我们是 x86_64 的平台:ImmortalWrt Downloads。
我们的主角是 **generic-ext4-combined.vmdk.gz** ,VMware 现成的硬盘。
也可选择 LEAN 大神版本,但多了一部将 img 转成 vmdk 的步骤,需要使用到 startwind v2v converter。
注意:由于我们选择 ImmortalWrt ,也是 OpenWrt 的一种编译版本,后文对这两个名词可能会混用。
编写此文时,ImmortalWrt 的最新版本是
21.02.3,请读者注意时效性
新建虚拟机,选择从光盘中安装,此时需要镜像,其实随便什么镜像都可以,反正后面都不会用上(会改成硬盘启动),如果没现成的系统镜像,则可以下载 generic-image.iso。
然后,选择 Linux → 其他 Linux 5.x 内核 64 位。
无论你使用 Ubuntu 系统镜像,还是什么别的系统镜像,选这个就行,原因是后面不会真的用到这个镜像,只是为了完成该软件的必须步骤而已


之后,选择自定配置,输入名字之后,保存,会进入虚拟机的配置中。
首先,删除原来的硬盘和 CD/DVD 这两个东西,都是在对应的高级选项中移除,这也就是之前为什么可以随便搞个镜像的原因,我们用不着。
然后,添加设备,选择现有硬盘,在弹出的选择框中,找到下载的 vmdk 文件,就是它了。选择”制作虚拟磁盘的单独副本“选项并打开,然后点击”应用“,才能修改磁盘大小,修改之后再应用即可。


启动磁盘,选择刚才添加的硬盘,然后点击重新启动,大功告成。
不要选择从光盘启动那个编译的镜像,原因是编译的镜像是一次性的,无法安装到硬盘中,只能从光盘启动,这样会导致每次重启配置全部没有了,相当于重置了。
这里看到有个问题,明明我硬盘大小设置成了 25G,怎么好像没体现出来呢?原因就是该系统只使用了硬盘的一点点小的分区容量,还有一大堆容量没用,需要先分区再格式化再挂载,才能正常使用。
配置
修改 IP
在更改之前,要把网络设置为桥接模式:

然后,使用命令行配置的方法,使得 IP 配置正确,让我们能访问 Web 页面。
对应自己电脑桥接的路由器(我是192.168.6.0/24网段),修改对应的静态 IP:vi /etc/config/network
option ipaddr '192.168.6.234'
option gateway '192.168.6.1'
option broadcast '192.168.6.255'
option dns '114.114.114.114'
然后,重启网络:/etc/init.d/network restart
皆大欢喜,访问配置的 192.168.6.234 就能进入 Web 界面了,SSH 也能连接上了。


挂载硬盘
利用 VMware 设置了 25GB 的磁盘,但是系统没用上所有的容量,需要手动扩容。
查看磁盘情况:fdisk -l

可以看到这已有的这两个分区不到 1GB,/dev/sda 总共 25 GB 呢。咱们接下来的目的就是扩容了。
首先,对磁盘进行操作:fdisk /dev/sda,输入 F ,可查看空闲空间:

接着,输入 n,新建一个分区,后面一系列的回车默认即可,注意最后退出要使用 w,整个交互为 n > 」 > 」> 」> 」 > w。

之后,格式化分区为 ext4 格式:mkfs.ext4 /dev/sda3,注意设备符要写对了。

然后,进行磁盘的挂载,一般就是新建一个目录后将盘符挂载到该目录,一般挂载到目录 /mnt/sda3 中。但这里,我们的目的是扩容根系统,因此要挂载到根目录。
选择 Web 界面中进行操作会事半功倍。
先要点击”生成配置“,才能在之后看到我们的 /dev/sda3 。


然后,在下面的挂载点中找到我们的分区,编辑其配置,按图所示。
保存之前,记得复制那些命令,并将设备符修改正确:
mkdir -p /tmp/introot
mkdir -p /tmp/extroot
mount --bind / /tmp/introot
mount /dev/sda3 /tmp/extroot
tar -C /tmp/introot -cvf - . | tar -C /tmp/extroot -xf -
umount /tmp/introot
umount /tmp/extroot然后,选择最下面的”保存并应用“,使配置生效。
接着,我们进入命令行界面,运行修改好的上述命令。
最后,利用 reboot 命令,重启系统以生效。


本节内容参考:
运行
修改软件源
ImmortalWrt 本身的软件源其实够用,也可以选择清华源:openwrt | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror。
修改的方式,可以去 Web 界面配置,修改为清华的地址即可,这里因为本身够用没做修改:

DHCP 配置
有两种思路,但目的都是在网络中存在一个 DHCP 服务器,并使得网关为 Openwrt 的 IP。是选择路由器还是 Openwrt 呢?
方法一:保留路由器的 DHCP 服务
首先进入路由器管理界面,修改路由器自带的 DHCP 服务配置,将网关和 DNS 改成 Openwrt 电脑的 IP。


然后,进入 ImmortalWrt Web 界面,选择网络 → 接口 → 某个 LAN 接口 → 编辑 。
我们需要关闭 Openwrt 默认的 DHCP 服务,选中”忽略此接口“后保存并应用。
这之后,我们用手机 WiFi 连接路由器,会发现网关已经改成了 192.168.6.234 。
方法二:使用 Openwrt 的 DHCP 服务
首先需要禁用路由器的 DHCP 服务。然后开启 Openwrt 的 DHCP 服务,同上。
需要注意的是,得配置 DNS ,以及最好选择强制。(图中的选项中 IP 变了,是因为我后期将网段从 192.168.6.x 改成了 192.168.2.x)
这里没有显式配置网关,就是默认 Openwrt 为网关,若要显式配置,只需要在 DHCP 选项中添加 3,192.168.x.x 。

OpenClash 代理上网
直接更新软件包列表后搜索 clash,进行安装:

安装完成之后,需要你退出登录后再进入 Web 页面,会发现多了服务 → OpenClash。

配置就不用说了,一般是通过订阅地址的,自己探索一下就能很好使用了。现在,使用手机连接到路由器,能直接上 YouTube 了。
AdGuardHome 去除广告
搜索 adguardhome 安装包,注意已经没有 luci-app-adguardhome 的包了,因为已经过时了,我们直接安装 adguardhome。

直接输入 AdGuardHome 命令(注意区分大小写),可以执行程序:

上面虽然已经运行了,但是不能后台运行,而在安装过程中已经自动生成了 /etc/init.d/adguardhome 文件,咱们可以使用命令 service adguardhome start 尝试开启。(也可以使用 AdGuardHome —service install 安装成系统服务)
但是失败了,原因是生成的这个文件有问题。
后台启动失败的原因已有讨论:https://github.com/AdguardTeam/AdGuardHome/issues/1386,从这里面得到结论是
init.dscripts 文件编写的有问题。
将该文件重写,我更改后的脚本如下:
#!/bin/sh /etc/rc.common
PROG=/usr/bin/AdGuardHome
USE_PROCD=1
# starts after network starts
START=21
# stops before networking stops
STOP=89
start_service() {
  **enabled=1 # 更改 1
  WORK_DIR=/root/AdGuardHome  # 更改 2**
	name=AdGuardHome
  [ "$enabled" -eq "1" ] || exit 2
  [ -d "$WORK_DIR" ] || mkdir -m 0755 -p "$WORK_DIR"
	
	echo "Starting ${name}"
  procd_open_instance
  procd_set_param command "$PROG" -c /etc/adguardhome.yaml -w "$WORK_DIR" --no-check-update
  procd_set_param stdout 1
  procd_set_param stderr 1
  procd_close_instance
	echo "${name} has been started"
}
stop_service() {
    echo "Stopping ${name}"
}再运行命令:service adguardhome start

成功,现在就可访问 192.168.6.234:3000 的管理页面了,注意 IP 是 ImmortalWrt 的地址,AdGuardHome 默认监听在 3000 端口。
我将 ImmortalWrt 的 DNS 监听端口设置为 54,这样 AdGuardHome 就能监听 53 了(于是整个 DNS 解析过程就是:AdGuardHome → ImmortalWrt → OpenClash,如果未生效,建议看看防火墙,特别是 NAT 表是不是有 53 端口的 REDIRECT)。

然后我们将 AdGuardHome 的上游 DNS 设置为 127.0.0.1:54 即可。


关于过滤规则,可添加:anti-AD | 致力于成为中文区命中率最高的广告过滤列表、Cats-Team/AdRules: List of ad filters based on Chinese locale 等。

如果遇上 DNS 请求没有打到 AdGuardHome,那么主要问题应该还是 OpenWrt 自带的 dnsmasq 造成电脑
iptables的配置问题,端口记得改回53,然后我们service dnsmasq stop,紧接着就service dnsmasq disable禁用掉。现在我们完全不使用 dnsmasq ,直接用 AdGuardHome 接管默认的 dnsmasq 提供的 DHCP 与 DNS 服务。如果还要加上 Clash,那么注意 Clash 不要劫持 DNS,并且将 AdGuardHome 上游设置为 Clash 的127.0.0.1:7874。
后记
后期我发现 adguardhome 的 53 端口重启就被 dnsmasq 占用了,要想办法完全禁用,比如把二进制程序名字改了。

在实践中,我发现有时候路由器碰一下之后,网线很可能就脱落了,因而电脑再怎么配置也无法上网,原因居然是物理的网线掉了…… 这还真不是虚拟机的锅……