本文介绍如何在已经刷好Armbian OS系统的网新云OEC-Trubo上,通过OpenWrt和Docker结合,变身旁路由。

一. 安装docker
使用阿里镜像加速(从官网下载大概率会失败!)
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
命令解释
从"https://get.docker.com"下载一个脚本,通过bash命令执行该脚本,同时将docker作为参数传递给脚本,使用Aliyun作为镜像加速器。
-fsSL:
-f:如果服务器返回错误码,curl会立即终止操作。Fail silently。
-s:静默模式,不显示进度条或错误信息。Silent mode.
-S:显示错误信息。Show errors
-L:自动重定向。Location.
使用-fsSL选项可以以静默模式运行curl命令,在发生错误时终止操作,并支持自动跟随重定向。
这是一种常见的配置,用于在下载和执行脚本、获取远程文件等操作中提供更可靠和干净的执行环境
| bash:是用于执行脚本的命令,将curl下载的脚本通过管道传递给bash命令执行。
-s docker --mirror Aliyun:是bash命令的参数,这会将docker作为参数传递给脚本,同时使用Aliyun作为镜像加速器。
如果你有魔法不使用阿里云加速,直接从官网下载
curl -sSL https://get.daocloud.io/docker | sh
命令解释
从"https://get.daocloud.io/docker"下载一个脚本,将curl下载的脚本通过管道传递给sh命令执行。
bash和sh差别不大,大部分Linux系统中默认安装了bash,用sh可以保持兼容性
二. 配置网络
1.开启网卡混杂模式
(在该模式下,网卡会接收到经过它所连接的网络上所有的数据包,而不仅仅是目标MAC地址是自己的数据包,因此方便进行网络流量捕获和分析。)
输入ifconfig查看有局域网IP的是哪个网卡(如果只启用了一个网卡),然后开启混杂模式
[root@OECT]# ifconfig
eth0: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST> mtu 1500
inet 192.168.10.199 netmask 255.255.255.0 broadcast 192.168.10.255
inet6 fe80::dc42:1f26:c32b:5bdf prefixlen 64 scopeid 0x20<link>
ether 00:e0:4c:68:19:69 txqueuelen 1000 (Ethernet)
RX packets 10019437 bytes 7646766799 (7.1 GiB)
RX errors 0 dropped 10119 overruns 0 frame 0
TX packets 9294965 bytes 10802889816 (10.0 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
从上面可以看见我的网卡是eth0
[root@OECT]# ip link set eth0 promisc on #开启网卡混杂模式
创建虚拟网络 MACVLAN
macvlan是一种Linux内核网络虚拟化技术,它可以用于创建和管理虚拟网络接口。
它可以为每个虚拟机或容器创建一个与主机物理网卡绑定的虚拟网卡,并且每个虚拟机或容器都有自己的IP地址。
这使得虚拟机或容器能够直接和物理网络中的其他设备通信,就像它们是直接连接在物理网络上一样。
docker network create -d macvlan --subnet=192.168.50.0/24 --gateway=192.168.50.1 -o parent=eth0 macnet
命令解释
此命令使用Docker创建一个名为macnet的macvlan网络。
-d macvlan
指定要创建的网络驱动为macvln
--subnet=192.168.10.0/24
设置网络的子网,这里设置为192.168.10.0/24表示网络中的主机IP地址范围为192.168.10.1到192.168.10.254。192.168.10.0是网段,/24是指子网掩码为255.255.255.0
--gateway=192.168.10.1
设置网络的网关地址为192.168.10.1(路由器IP)
-o parent=eth0
指定macvlan网络的父接口,也就是上级网络接口。在这里,eth0是物理网卡的名称,它将成为macvlan网络的父接口。-o是指定选项的标志,它表示将要传递额外的选项给docker network create命令
macnet
设置 macvlan 网络的名称为 macnet
以上创建好网络后,通过以下指令查看网络设置结果:
[root@OECT] docker network ls
NETWORK ID NAME DRIVER SCOPE
6e1a0e16742d bridge bridge local
136b63f0da30 host host local
3b647a96f9dc macnet macvlan local #上面刚刚创建的
b0265f7d9516 none null local
给openwrt配置网络(上一步是对宿主机进行的网络配置)
# 创建配置文件存放的目录
mkdir -p /etc/docker/openwrt
# 创建网络配置文件并编辑
vim /etc/docker/openwrt/network
进入编辑界面后,ctrl+shfit+v 粘贴如下配置文件,然后按要求修改
其中只有config interface 'lan'中的ipaddr,gateway和dns需要修改。
gateway自然和前面一样是路由器,DNS也填路由器,ipaddr则是你设置openwrt的管理地址。
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 packet_steering '1'
config interface 'lan'
option type 'bridge'
option ifname 'eth0'
option proto 'static'
option netmask '255.255.255.0'
option ip6assign '60'
option ipaddr '192.168.10.254' # openwrt的管理地址
option gateway '192.168.10.1'
option dns '192.168.10.1'
config interface 'vpn0'
option ifname 'tun0'
option proto 'none'
三. 拉取 openwrt 镜像并启动 openwrt
docker run --restart always --name openwrt -d --network macnet --privileged --ip 192.168.10.254 -v /etc/docker/openwrt/network:/etc/config/network registry.cn-shanghai.aliyuncs.com/suling/openwrt:armv8 /sbin/init

命令解释
此命令会使用指定的 OpenWrt 镜像在后台运行一个容器,容器将连接到名为 macnet 的 macvlan 网络。
容器将具有特权权限(意味着容器内的进程将具有与宿主机上的进程相同的特权级别,可以执行一些普通容器不允许的操作),并使用IP地址192.168.10.254。
容器内的/etc/config/network目录将与宿主机的/etc/docker/openwrt/network目录进行挂载(可以理解为这两个network文件其实都是宿主机上的network文件)。
容器启动时将执行OpenWrt的初始化进程
--restart always
指定容器在退出时总是重新启动。即使Docker守护进程重启,也会重新启动容器
-d: 以后台(daemon)模式运行容器,使容器在后台执行
--privileged: 赋予容器特权,允许容器内的进程使用宿主机的特权操作
registry.cn-shanghai.aliyuncs.com/suling/openwrt:armv8
指定要使用的OpenWrt镜像名称和标签
/sbin/init
是启动OpenWrt的初始化进程。它是整个系统的根进程,负责初始化系统并启动其他需要运行的服务和进程。通过指定/sbin/init作为容器启动时要执行的命令,可以让容器启动OpenWrt并正常运行
常用指令
如果前面的步骤正常执行,openwrt应该过一会就启动成功了,可以输入设置的ip地址进入openwrt后台管理界面
查看正在运行的docker容器,可以查看openwrt是不是在运行:
docker ps
进入openwrt容器内部
docker exec -it openwrt bash
docker exec是Docker命令,用于在运行中的容器中执行命令。
-it是两个选项的结合,-i表示交互式模式,-t表示分配一个伪终端。
openwrt是要执行命令的目标容器的名称。
bash是要在容器内执行的命令,即打开一个交互式bash shell。这允许您与容器进行交互,就像在一个独立的终端中登录到该容器一样。
停止openwrt
docker stop openwrt
删除已创建的openwr容器(如果玩坏了)
docker rm openwrt
