OpenWrt in Docker: 打造旁路由,配置AdGuard,只需几步!
本文环境:
ubuntu 20.04,x86_64
Docker version 20.10.21
本教程适合入门
设置网卡混杂模式
ifconfig eno1 promisc
eno1是我的物理网卡,如果不知道可以通过ifconfig查看
通过ifconfig也可以确认已经开启混杂模式(PROMISC)

添加macvlan类型的docker网络
sudo docker network create -d macvlan
--subnet=192.168.0.0/24
--gateway=192.168.0.1
-o parent=eno1 openwrt_net
注意:subnet、gateway要根据实际网络环境设置,我这里局域网是192.168.0.x所以设置子网
192.168.0.0/24,gateway设置为我自己主路由的地址192.168.0.1

下载镜像
我是X86架构64位CPU,所以选择对应x86_64/amd64的镜像,拉取镜像:
sudo docker pull registry.cn-shanghai.aliyuncs.com/suling/openwrt:x86_64

自于SuLingGG大佬分享的镜像
启动镜像及network设置
sudo docker run --restart always
--name openwrt
-d --network openwrt_net --privileged
registry.cn-shanghai.aliyuncs.com/suling/openwrt:x86_64 /sbin/init
启动后,进入容器
docker exec -it openwrt /bin/bash
如果不熟悉命令行,也可以从Portainer中进入容器
然后修改网络配置文件
vim /etc/config/network
将红色框内容根据实际情况修改为可用的IP地址:
option ipaddr -- 容器IP,也就是openwrt系统的地址
option gateway -- 设置为主路由的地址
option dns -- 这里先设置为一个公共的dns,这里选择了腾讯dns,根据自己喜好选择

然后重启网络服务:
/etc/inti.d/network restart
以下是直接从命令行进行上述设置的示例

旁路由配置
上面设置了ipaddr地址为192.168.0.201,从这个地址登录系统web端

初始密码为空,为了安全需要登录后重新设置
要将openwrt设置为旁路由,需要三个必要配置:
【网络】-【接口】-【物理设置】,将【桥接接口】选项去掉


2. 【网络】-【防火墙】-【自定义规则】增加规则:
iptables -t nat -I POSTROUTING -j MASQUERADE

检查下【网络】-【接口】-【基本配置】,是否符合本地环境,【使用自定义的 DNS 服务器】先配置为一个公共dns


至此,Docker部署openwrt,配置为旁路由的步骤就结束了,PC通过旁路由可以正常上网。
AdGuard安装和设置
安装AdGuard
进入容器docker exec -it openwrt /bin/bash
执行 wget --no-verbose -O - https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v
脚本会根据操作系统自动选择对应版本下载,并安装

配置AdGuard
安装完成后,进入到AdGuard的web页面 192.168.0.201:3000
注意:192.168.0.201是我的openwrt容器的ip地址,需要根据实际环境替换
进入web页面后,根据导引设置,注意DNS服务器端口原为53,需要设置为其他端口号,这里设置为5300。

然后再设置DNS,【设置】--【DNS设置】--【上游DNS服务器】这里添加了三个公共的DNS
可以根据自己需要设置
并选择【并行请求】

再接下来,【过滤器】--【DNS黑名单】添加自定义过滤规则
我这里添加了一条规则,规则URL:https://gitlab.com/cats-team/adrules/-/raw/main/dns.txt

OpenWrt上的设置
以上AdGuard页面上设置完成后,需要再对OpenWrt的设置做响应调整。
然后回到openwrt页面【网络】-【接口】-【基本设置】,将【使用自定义的DNS服务器】设置为192.168.0.201,即本容器IP,再次提醒需要根据实际环境设置。

【网络】-【防火墙】-【自定义规则】修改两条规则,将--to-ports修改为AdGuard配置的DNS端口5300。

开启AdGuard的效果比对如下。实际上不增加自定义过滤规则就能达到这个效果了。

从AdGuard仪表盘可以验证配置是否生效

Docker环境下保存配置
请注意本文的OpenWrt是运行在容器中的,各种配置保存在容器的存储中,如果容器重启可能造成配置丢失。一种简单粗暴的办法是,将配置好的容器保存为新的镜像。
sudo docker commit openwrt openwrt_new:202311v1
"openwrt":运行中的容器名
"openwrt_new:202311v1":新镜像名称:tag
然后remove旧的容器,用新镜像启动
sudo docker run --restart always --name openwrt
-d --network openwrt_net --privileged
openwrt_new:202311v1 /sbin/init
旁路由对网速的影响
在openwrt旁路由模式下,对wifi和有线的网速有一定影响,网上也有一些关于旁路由造成网速变慢的讨论。为了验证上述情况,进行了实测。
为了让减少对网速的影响,参考《OpenWrt 网速慢的解决方法》,对旁路由进行一些设置。进入【网络】-【防火墙】,将“启用 SYN-flood 防御”的√去掉(默认是选中的),将【lan】的“IP动态伪装”选中,如下图。也可以开启Turbo ACC加速,据说效果不明显。

其实,上述设置也不见得有特别明显的效果。
然后通过测速软件对比了使用旁路由前后网速的变化(非专业工具和非专业知识背景)。
首先,对比PC(有线连接到主路由)上将网关设置为openwrt旁路由对网速的影响,结果见下图。使用360自带的测速器,可以看到使用旁路由时最大连接速度低于前后两次未使用旁路由的测试,但是衰减幅度不算大。

然后,对比手机wifi连接情况下的速度。测试实例如下图,左边为旁路由模式,右边为非旁路由。经过几次测试,发现在wifi下,两者差异并不大。

以上实验的主路由为某AX3000路由器。但是,如果主路由换成wifi5 AC1900M的路由器,使用旁路由对网速影响较大,速度至少衰减一倍以上。
小结
当然OpenWrt的功能远远不止上述功能,本文仅是记录入门操作作为备忘,其他进阶功能还待继续探索。
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

piscesc
校验提示文案
值友2964977283
校验提示文案
以身体不适为由
校验提示文案
拯救牛头人
校验提示文案
蓝色追风鸟
校验提示文案
哈士奇不是狼
校验提示文案
大头好物推荐
校验提示文案
aiis
校验提示文案
吴小伟
校验提示文案
Ho---
校验提示文案
汤姆猫达人
校验提示文案
大肠丶刺身
前提:我是主路由,拨号,后面接群辉,群辉虚拟机装op当旁路由,里面装梯子,以后群辉走旁路由以便全局代理。
问题:我家有公网,再群辉中成功进行了ddns,但是如果我在家庭网络中就无法通过ddns的域名访问群辉,在家庭网络外就可以,怎么能让家内家外都可以通过ddns访问群辉?
校验提示文案
fuwa888
校验提示文案
哈士奇不是狼
校验提示文案
蓝色追风鸟
校验提示文案
fuwa888
校验提示文案
大肠丶刺身
前提:我是主路由,拨号,后面接群辉,群辉虚拟机装op当旁路由,里面装梯子,以后群辉走旁路由以便全局代理。
问题:我家有公网,再群辉中成功进行了ddns,但是如果我在家庭网络中就无法通过ddns的域名访问群辉,在家庭网络外就可以,怎么能让家内家外都可以通过ddns访问群辉?
校验提示文案
拯救牛头人
校验提示文案
以身体不适为由
校验提示文案
汤姆猫达人
校验提示文案
大头好物推荐
校验提示文案
Ho---
校验提示文案
吴小伟
校验提示文案
值友2964977283
校验提示文案
piscesc
校验提示文案
aiis
校验提示文案