本教程基于如下软硬件环境:
设备:斐讯 N1(aarch64 架构)
系统:Debian GNU/Linux 10 (buster) with Linux 5.4.108
Docker Version: 20.10.5
主路由IP:10.10.10.1
设置 Armbian 宿主机静态内网 IP 地址
vi /etc/network/interfaces
根据下面给出的内容修改,此处目的是固定 armbian 宿主机的内网 IP 地址。
iface eth0 inet static #此处默认是 dhcp(动态) 改成 static(静态)
address 10.10.10.2 #设置 armbian(本机)宿主机的内网 IP 地址
netmask 255.255.255.0 #子网掩码
gateway 10.10.10.1 #指定为主路由网关地址
dns-nameservers 10.10.10.1 #指定为主路由 DNS 地址
编辑 /etc/rc.local
文件
vi /etc/rc.local
添加下面的指令到 /etc/rc.local
文件 exit 0
之前
#开启混杂模式
ip link set eth0 promisc on
#新增一个叫 macnet(不要和容器的macvlan重名)的macvlan接口
ip link add macnet link eth0 type macvlan mode bridge
#为该接口分配ip,并启用 (用于宿主机与容器间通信)
ip addr add 10.10.10.63/32 dev macnet
ip link set macnet up
#修改路由,使宿主机到10.10.10.32/27的通信全部经由macnet进行
ip route add 10.10.10.32/27 dev macnet
为 Docker 创建自定义网络并制定 Docker 容器的内网 IP 范围
docker network create -d macvlan --subnet=10.10.10.0/24 --gateway=10.10.10.1 --ip-range 10.10.10.32/27 --aux-address="macnet=10.10.10.63" -o parent=eth0 macnet
--subnet=10.10.10.0/24
创建 Docker macnet 内网范围--gateway=10.10.10.1
指定 macnet 的网关地址--ip-range 10.10.10.32/27
限制容器的内网 IP 范围(从 10.10.10.33 到 10.10.10.62)--aux-address="macnet=10.10.10.63"
指定 10.10.10.63 用于容器跟宿主机通信(容器访问 10.10.10.63 就等于访问宿主机 10.10.10.2)
然后我们就可以跑 Docker 容器了,下面我以 openwrt 容器为例给大家演示一下。
docker run -d --name openwrt --restart always --network macnet --hostname openwrt --ip 10.10.10.40 --privileged --label com.centurylinklabs.watchtower.enable=false p3terx/openwrt-mini:latest
我说一下上面 docker run 指令中的重点:--restart always
自启动容器(因为是跑的 openwrt 软路由需要自启动)--network macnet
将该 openwrt 容器添加到我们刚刚创建的 macnet 网络中--ip 10.10.10.40
指定 openwrt 容器的 IP 地址(设置为 10.10.10.33 – 10.10.10.62 以内的任意 IP 都可以)--privileged
给 openwrt 容器特权
然后我们需要进入 openwrt 容器的内部修改网络配置
docker exec -it openwrt sh
修改 /etc/config/network
配置文件
vi /etc/config/network
只需要把配置文件 lan 口设置的 IP 地址设置为上面 docker run 用的 10.10.10.40 地址就可以,必须相对应!
修改后保存配置文件然后执行 reboot
重启 openwrt 容器。
此时通过浏览器访问内网 http://10.10.10.40 打开 openwrt 后台( 默认密码:password)
最后说一下 openwrt 旁路由的主要设置
1、网络 >> 接口,设置 LAN 口的 IPv4 网关:10.10.10.1,设置 IPv4 广播:10.10.10.255,DNS 服务器:223.5.5.5、223.6.6.6
2、再把下面的 DHCP 服务器 >> 基本设置,勾选 “忽略此接口”
3、DHCP 服务器 >> IPv6 设置,路由通告服务:已禁用,DHCPv6 服务:已禁用,NDP 代理:已禁用
4、返回顶部菜单,物理设置 >> 桥接接口 (去掉勾选)然后页面拉到底,点击保存应用。
5、网络 >> 防火墙,LAN 入站数据、出站数据、转发三项全部允许,然后勾选右侧 IP 动态伪装、MSS 钳制,点击保存应用。
补充:防火墙页面上放的 启用 SYN-flood 防御 去掉勾选。
6、防火墙 >> 自定义规则,酌情添加 iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
(如果上面勾选了IP 动态伪装、MSS 钳制,则此处可以不添加自定义规则,如果上面未勾选IP 动态伪装、MSS 钳制,则此处建议添加自定义规则)点击重启防火墙。
7、网络 >> Turbo ACC 网络加速,勾选启用 BBR
8、主路由设置网关和 DNS 指向旁路由 openwrt
9、至此教程基本已经结束了,但是可能会遇到端口映射后在外部网络无法通过映射的端口访问内网设备。下面给出解决办法,除主路由自身以外的所有内网设备映射的端口都要改成指向 openwrt 旁路由地址:10.10.10.40
补充:也可以直接在主路由设置 DMZ 到 10.10.10.40(旁路由)以后就不需要在主路由设置端口映射了,直接在旁路由做端口映射就可以了。
10、然后在 openwrt 旁路由 >> 防火墙 >> 端口转发 这里再去映射到每个端口所对应的内网设备地址。
因为旁路由设备只有 1 个 LAN 口 所以 openwrt 添加的端口转发还需要点击修改按钮,设置 LAN 到 LAN 转发,而不是 WAN 到 LAN。
11、教程中用的 docker 容器有个小问题,需要在系统启动项中添加个本地启动脚本,下面给出脚本内容。(如果你有特殊上网需求则需要添加下面的脚本内容到启动项,如果你没有特殊上网需求则可以不添加)
echo -e "nameserver 127.0.0.1\noptions ndots:0" > /etc/resolv.conf
最后做个总结
主路由设置如下:
设备地址:10.10.10.1
DHCP:启用
DHCP 范围:10.10.10.100 – 10.10.10.200(预留 100 个自动 DHCP 分配地址一般足够了)
网关地址:10.10.10.40(指向旁路由)
DNS地址:10.10.10.40(指向旁路由)
旁路由设置如下:
旁路由地址:10.10.10.40
DHCP:关闭
网关地址:10.10.10.1(指向主路由)
DNS地址:10.10.10.1(指向主路由,或者223.5.5.5、223.6.6.6)
Armbian 宿主机设置如下:
宿主机地址:10.10.10.2
网关:10.10.10.1
掩码:255.255.255.0
DNS:10.10.10.1
Docker 网络设置如下:
保留地址:10.10.10.63(用于容器内部与宿主机 Armbian 通信,因为在容器内部之间访问 10.10.10.2 是不通的!所以容器内部访问 10.10.10.63 就等于访问 10.10.10.2)
容器网络范围:10.10.10.32/27(等于 10.10.10.33 – 10.10.10.62 一共 32 个内网地址,一般家用 32 个内网地址分配给容器足够了,如果不够用可以自行适当调整范围,但是调整范围后需要其他的网络配置也要相应的调整!)
本教程不单单局限于 Armbian Docker 旁路由,还同样适用其他架构的 Docker 旁路由,只要能理解本文的具体内容,那么任何旁路由就都不难搞了。