为什么用旁路网关

普通的路由器集无线信号转发、网关、DNS 服务器等角色为一身,其中的“网关”角色负责路由器内部数据的处理。例如我的渣渣路由器「极路由4」运行一些吃资源的应用会导致网络/系统不稳定等。所以把网关的重任交给硬件性能更好的 「树莓派3B」去做。

旁路网关是什么

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

环境说明

  • 树莓派IP:192.168.5.226
  • Docker 内 OpenWrt 容器IP:192.168.5.250
  • 主路由网关:192.168.5.1

既然需要在 Docker 中运行 OpenWrt ,那么首先要在树莓派的现有系统上安装 Docker 。至于步骤嘛自行在搜索引擎中搜索相关内容以完成安装。

一、开始操作

以下所有命令均在root角色下进行,非root角色自行切换或添加sudo

打开网卡混杂模式

ip link set eth0 promisc on

创建网络

需按照本地网络环境,不能照抄

我的树莓派IP为192.168.5.226,说明处于192.168.5.x网段,需要把--subnet的参数改为192.168.5.0/24--gateway参数改为192.168.5.1

docker network create -d macvlan --subnet=192.168.5.0/24 --gateway=192.168.5.1 -o parent=eth0 macnet

命令运行后可以使用docker network ls 来查看macnet网络是否创建成功

root@ubuntu:~# docker network ls
NETWORK ID     NAME           DRIVER    SCOPE
6f4d61090f64   macnet         macvlan   local

创建并启动

docker run --restart always --name openwrt -d --network macnet --privileged sulinggg/openwrt:latest /sbin/init

命令运行后会拉取镜像并运行,可以使用docker ps -a 来查看

root@ubuntu:~# docker ps -a
CONTAINER ID   IMAGE                        COMMAND                  CREATED       STATUS        PORTS                                         NAMES
15ccc59b7927   sulinggg/openwrt:latest      "/sbin/init"             11 days ago   Up 2 hours                                                  openwrt

进入容器并修改参数

docker exec -it openwrt bash

编辑 OpenWrt 的网络配置文件:

vim /etc/config/network

修改lan口的配置

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.5.250'
        option gateway '192.168.5.1'
        option dns '192.168.5.1'

option ipaddr为Docker中OpenWrt 容器的固定IP,option gatewayoption dns则为主路由的IP

重启网络

/etc/init.d/network restart

进入管理面板

在浏览器访问option ipaddr设置的IP,例如http://192.168.5.250。用户名root,密码password

关闭DHCP

在「网络 - 接口 - Lan - 修改」界面中,勾选下方的忽略此接口,并保存&应用

主路由设置DHCP

进入主路由修改lan口的网关DNS服务器option ipaddr设置的IP,并保存&应用

重启设备

重启主路由以及树莓派,完成。

二、踩雷

Docker 内成功运行 OpenWrt 会出现无法与宿主机通信,即容器无法连接到宿主机。

因为在部署 OpenWrt 时使用到了 Dockermacvlan 模式 ,通俗来讲就是在树莓派的物理网卡虚拟出来两个虚拟网卡。可以让宿主机和 Docker 同时接入网络并使用不同的IP,但是在设计该模式的时候为了安全禁止了宿主机与容器的直接通信。解决办法就是在宿主机再建立一个 macvlan 然后修改路由,使数据经过新建的 macvlan 传到容器内的 macvlan 即可。

新建接口

添加一个名为 mynetmacvlan 接口

ip link add mynet link eth0 type macvlan mode bridge

分配IP并启用

需按照本地网络环境,不能照抄

设置 mynet 的IP为192.168.5.248

ip addr add 192.168.5.248 dev mynet
ip link set mynet up

添加静态路由

192.168.5.250为 OpenWrt 容器的IP

ip route add 192.168.5.250 dev mynet

在宿主机测试一下

root@ubuntu:~# ping 192.168.5.250 -c 3
PING 192.168.5.250 (192.168.5.250) 56(84) bytes of data.
64 bytes from 192.168.5.250: icmp_seq=1 ttl=64 time=0.415 ms
64 bytes from 192.168.5.250: icmp_seq=2 ttl=64 time=0.338 ms
64 bytes from 192.168.5.250: icmp_seq=3 ttl=64 time=0.296 ms

--- 192.168.5.250 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2052ms
rtt min/avg/max/mdev = 0.296/0.349/0.415/0.049 ms

写入开机自启脚本

/etc/rc.local加入以下内容,并添加「可执行」权限 chmod a+x /etc/rc.local

ip link add mynet link eth0 type macvlan mode bridge 
ip addr add 192.168.5.248 dev mynet
ip link set mynet up
ip route add 192.168.5.250 dev mynet

好了,教程到这里也该结束了,我在旁路由内运行「Frp内网穿透」以及一些奇怪的服务,我的一些站点已经迁移到树莓派上。

引用