相关文章推荐
性感的西装  ·  vehicular ...·  3 月前    · 
性感的西装  ·  在Docker 中运行OpenWrt ...·  3 月前    · 

在 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'