在 Docker 中运行 OpenWrt 旁路网关 透明网关


在接下来的文章中,我们将在 Docker 容器中运行 OpenWrt,并通过设置,让 Docker 容器中的 OpenWrt 网关接管路由器自身的网关,减轻路由器的负担,同时,由于网关被 OpenWrt 接管,所以 OpenWrt 中的大部分应用都是可用的,比如酸酸乳,V2ray,去广告等。做个不恰当的比喻, OpenWrt 网关接管路由器自身的网关后,你可以理解为路由器是 OpenWrt 的一块外置网卡。

一、概念介绍

1. OpenWrt

OpenWrt:是一个高度模块化、高度自动化的嵌入式的Linux发行版,她拥有强大的网络组件和扩展性,常常被用于工控设备、智能家居、路由器等设备中。它还提供了上百个已编译好的软件,而且数量还在不断增加。

OpenWrt使用框架来构建应用程序,不需要构建一个完整的固件,对于用户来说,将会拥有完全定制的玩法。OpenWRT支持各种处理器架构,无论是对ARM,X86,PowerPC或者MIPS都有很好的支持。

2. 旁路网关

那么,什么是旁路网关(旁路由)呢?

所谓的旁路网关:就是在路由器之外的其他硬件设备上搭建一个网关环境,把路由器肩负的网关重任交给其他更适合的设备来做,同时,旁路网关处理完的结果会返回给主路由器,由主路由器继续进行转发处理。

普通的路由器往往集无线信号转发、网关、DNS 服务等角色为一身,其中的“网关”角色负责路由器内部数据与外部网络的交换处理。但因为一般家用的路由器硬件性能很有限,在运行一些比较吃资源的应用(如酸酸乳、去广告等)时,几乎会占满所有硬件资源,导致路由器网络/系统不稳定等诸多问题。

既然路由器的硬件性能有限,那可不可以把网关的重任交给硬件性能更好的设备去做,让路由器安安心心地做好数据交换的工作哪?

当然可以了,我们可以增加一个旁路网关,让它预先处理数据,将复杂的功能完成后,再交给主路由进行转发和后续的工作。

这样,每个角色各司其职,路由器肩上的任务轻了,即使是油管 4K 也能轻松跑满网速了,而旁路网关也能提供更多的功能。由此资源的充分利用,一举两得。

3. Docker

Docker 是一个开源,轻量级的应用容器引擎,基于GO语言开发,用于创建、管理和编排容器。与VMware 虚拟机相比,Docker 使用容器承载应用程序,而不使用操作系统,所以它的开销很少,性能很高。

二、Docker 安装

1. 获取自动安装脚本

阿里云镜像安装脚本内容

# 安装命令
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh --mirror Aliyun

安装过程如下

# Executing docker install script, commit: 1b02882d63b9cfc484ad6b0180171c679cfe0f3a
+ sh -c apt-get update -qq >/dev/null
+ sh -c DEBIAN_FRONTEND=noninteractive apt-get install -y -qq apt-transport-https ca-certificates curl >/dev/null
+ sh -c curl -fsSL "https://download.docker.com/linux/debian/gpg" | apt-key add -qq - >/dev/null
Warning: apt-key output should not be parsed (stdout is not a terminal)
+ sh -c echo "deb [arch=arm64] https://download.docker.com/linux/debian stretch stable" > /etc/apt/sources.list.d/docker.list
+ sh -c apt-get update -qq >/dev/null
+ [ -n  ]
+ sh -c apt-get install -y -qq --no-install-recommends docker-ce >/dev/null
+ sh -c docker version
Client: Docker Engine - Community
 Version:           19.03.8
 API version:       1.40
 Go version:        go1.12.17
 Git commit:        afacb8b
 Built:             Wed Mar 11 01:27:00 2020
 OS/Arch:           linux/arm64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.8
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.17
  Git commit:       afacb8b
  Built:            Wed Mar 11 01:25:31 2020
  OS/Arch:          linux/arm64
  Experimental:     false
 containerd:
  Version:          1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
If you would like to use Docker as a non-root user, you should now consider
adding your user to the "docker" group with something like:

  sudo usermod -aG docker your-user

Remember that you will have to log out and back in for this to take effect!

WARNING: Adding a user to the "docker" group will grant the ability to run
         containers which can be used to obtain root privileges on the
         docker host.
         Refer to https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface
         for more information.

2. 开启网卡的混杂模式

开启网卡的混杂模式(这样是为了目前这个阶段能正常安装并配置,要永久开启需修改配置文件,稍后详述)

ip link set eth0 promisc on

3. 下载 OpenWrt 镜像

在终端界面执行以下命令,下载OpenWrt的docker 镜像文件

# 镜像下载命令
docker pull buddyfly/openwrt-aarch64

镜像下载过程如下

Using default tag: latest
latest: Pulling from buddyfly/openwrt-aarch64
aef47d0acf8a: Pull complete
Digest: sha256:d3a3f4f9aaac4169d3b16c1f796b5d379c6234b997cb440daee80ef3ad1aba05
Status: Downloaded newer image for buddyfly/openwrt-aarch64:latest
docker.io/buddyfly/openwrt-aarch64:latest

4. 创建 Docker 虚拟网络

虚拟网络名称为macnet,驱动为macvlan模式,将 subnet 10.10.10.0修改为你自己主路由的网段,geteway 10.10.10.1修改为你自己的主路由网关】

# 创建虚拟网络
docker network create -d macvlan --subnet=10.10.10.0/24 --gateway=10.10.10.1 -o parent=eth0 macnet

5. 启动 OpenWrt 容器

启动 OpenWrt 容器

# 开启容器
docker run --restart always -d --network macnet --privileged buddyfly/openwrt-aarch64:latest

6. 查看运行中的 OpenWrt 容器

查看运行中的容器

# 查看运行中的容器
docker ps -a

运行结果如下

root@aml4:~# docker ps -a
CONTAINER ID        IMAGE                             COMMAND             CREATED             STATUS              PORTS               NAMES
f76303c1b9f0        buddyfly/openwrt-aarch64:latest   "/sbin/init"        43 seconds ago      Up 40 seconds                           affectionate_liskov
root@aml4:~#

7. 修改OpenWrt容器的IP地址

进入openwrt容器修改network设置

# 进入容器命令行
docker exec -it f76303c1b9f0 /bin/bash

进入容器命令行结果如下

root@aml4:~# docker exec -it f763 /bin/bash
bash-4.4#

编辑网络配置文件

# 修改网络配置
vi /etc/config/network

修改文件如下 将option ipaddr 192.168.1.1 改为你想作为旁路网关的空闲地址。我的网段为10.10.10.X,共享地址为10.10.10.254

config interface 'loopback'
        option ifname 'lo'
        option proto 'static'
        option ipaddr '127.0.0.1'
        option netmask '255.0.0.0'

config globals 'globals'
        option ula_prefix 'fd00:6e95:e381::/48'

config interface 'lan'
        option type 'bridge'
        option ifname 'eth0'
        option proto 'static'
        option ipaddr '10.10.10.254'
        option netmask '255.255.255.0'
        option ip6assign '60'

重启网络服务

/etc/init.d/network restart

8. 永久开启网卡混杂模式

重启网卡混杂模式会失效,需设为永久开启 修改/etc/network/interfaces文件:

谨慎操作,可能导致无法访问网络

添加 up ip link set eth0 promisc on

修改网卡接口配置

三、旁路网关配置

1. 登录旁路网关系统

用户名 root 密码 password

登录界面

2. 更改系统主题

更改系统主题为Argon-Dark

更改主题

3. 更改上级路由

点击网络>接口>修改

进入LAN配置

修改IPv4网关为10.10.10.1,DHCP服务器 勾选 忽略此接口

修改上级路由

4. 网络加速设置

开启DNS加速

更改主题

5. 科学上网

开启科学上网

添加节点

全局设置

参数设置

6. 配置旁路网关

局域网中需要科学上网的机器配置旁路网关

网关设置

油管测速


文章作者: Baymax
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Baymax !
评论
 上一篇
Docker 入门系列 1. Docker 简介 Docker 入门系列 1. Docker 简介
  本系列笔记是作为一个新手小白,从了解 Docker 是什么、Docker 技术包含哪些概念到上手使用、安装以及发布 Docker 镜像的整个过程。小白在学习过程中遵循简介、入门、上手到深入的顺序,根据个人学习实践过程进行书写与记录。 一
2020-05-12
下一篇 
Hello World Hello World
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hex
2020-05-08
  目录