2020年8月9日星期日

Docker 安装 OpenWrt

拉取 OpenWrt 镜像

docker pull unifreq/openwrt-aarch64:latest
docker pull kanshudj/n1-openwrtgateway:r20

# 任选一,如镜像作者在官方 hub 增删改过标签而无法拉取,请对照官方信息。

导入OpenWrt 镜像
docker load -i openwrt-aarch64.tar
docker import /root/openwrt-armvirt-64-default-rootfs.tar.gz openwrt:r20.01.24

宿主机开启网卡混杂模式 promisc

# 启用
ifconfig eth0 promisc
#ifconfig wlan0 promisc

# 关闭
ifconfig eth0 -promisc
#ifconfig wlan0 -promisc

# 查询
ifconfig eth0 => 成功标志:PROMISC

#ip link set eth0 promisc on
#ip link set wlan0 promisc on/off
# https://wangchujiang.com/linux-command/c/ip.html

# 设置 promisc 模式重启会失效,解决:
方法 A:
# SSH 命令:
sed -i '/exit 0/i\ifconfig eth0 promisc' /etc/rc.local
#sed -i '/exit 0/i\ip link set eth0 promisc on' /etc/rc.local

方法 B(未测试):
# 编辑 /etc/network/interfaces 加入
iface eth0 inet manual
  up ifconfig eth0 0.0.0.0 up
  up ifconfig eth0 promisc
这一步可以忽略。

Wikipedia:一般计算机网卡都工作在非混杂模式下,此时网卡只接受来自网络端口的目的地址指向自己的数据。当网卡工作在混杂模式下时,网卡将来自接口的所有数据都捕获并交给相应的驱动程序。网卡的混杂模式一般在网络管理员分析网络数据作为网络故障诊断手段时用到,同时这个模式也被网络黑客利用来作为网络数据窃听的入口。在 Linux 操作系统中设置网卡混杂模式时需要管理员权限。在 Windows 操作系统和 Linux 操作系统中都有使用混杂模式的抓包工具,比如著名的开源软件 Wireshark。

创建 macvlan 网络

docker network create -d macvlan --subnet=192.168.0.0/24 --gateway=192.168.0.1 -o parent=eth0 macvlan

# 解释:
从宿主机 eth0 网卡虚拟出子网卡接口,子网段是 192.168.0.0/24,网关是 192.168.0.1 的 macvlan 网络,名字叫 macvlan。
一个 eth0 只能创建一个 macvlan 网络,但有其它办法多开。

参数:
-d macvlan              # 创建类型为 macvlan 网络模式。
--subnet                # 创建大池网段,指定容器网段获取范围。
--ip-range              # 创建小池网段,指定容器网段获取范围。
--gateway               # 网关,继承宿主机所在网关(主路由 IP )。
-o parent=eth0          # 解释:-o -> option / parent=eth0,指 macvlan 模式继承的物理接口。
-o macvlan_mode bridge  # macvlan 模式,默认就是 bridge,不用理会。
macvlan_lan             # 定义该 macvlan 的名字。
查看 macvlan 是否创建成功

# 查看命令
docker network ls

# 查看 docker 网桥详细
docker network inspect macvlan_lan

创建 OpenWrt 容器

# 忽略
docker rm -f OpenWrt

# 运行
示例:
docker run --restart always -d --network macvlan --privileged unifreq/openwrt-aarch64:latest  /sbin/init

docker run -d \
    --restart always \
    --privileged \
    --network macvlan \
    --ip 192.168.2.200 \
    unifreq/openwrt-aarch64:latest

# 参数:
-d                  # 后台运行
--name              # 容器名字
--restart always    # 自启
--privileged        # 容器提权
--network           # 指定哪个 macvlan 网络,这里是 macvlan
--ip                # 必须指定 ip,防止局域网 ip 冲突

查看容器名称
docker ps -a


查看 OpenWrt 网络配置

docker exec 查询出来的容器名称 ifconfig
示例:
docker exec 0ae353551c4d ifconfig

# 查看到 br-lan 显示的是错误地址 192.168.1.1,下面会修改成正确地址。
# 只看到 lo 请忽略。
进入 OpenWrt shell 修正网络参数

docker exec -it 0ae353551c4d bash

vi /etc/config/network
按下 i

# 建议 proto 使用 static 而不使用 dhcp。
config interface 'lan'
        option type 'bridge'
        option ifname 'eth0'
        option proto 'static'
        option ipaddr '192.168.0.200'
        option netmask '255.255.255.0'
        option gateway '192.168.0.1'
        option dns '192.168.2.1'
        option ip6assign '60'

# 退出保存
esc -> :wq

# 重启 OpenWrt 网络服务,确认修改
/etc/init.d/network restart
ifconfig

# 退出 OpenWrt shell
exit

# 重启 OpenWrt
docker restart 0ae353551c4d

检查网络状态

docker exec OpenWrt ping 192.168.2.1    # 主路由
docker exec OpenWrt ping 223.6.6.6      # 外网
访问 Docker OpenWrt

后台:192.168.2.200
用户:root
密码:password 或 admin

# 检查设置
1.OP 打开网络 => 接口 => LAN 修改 => 网关/DNS:主路由 IP。

2.OP 打开网络 => 防火墙 => 自定义规则,添加后重启防火墙。
iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE

3.主路由 Padavan 设置,解决访问网站慢或在线视频卡顿。
外部网络 WAN -> 外网设置选项卡 -> IPv4 硬件加速,由 OFFLOAD TCP/UDP for LAN/WLAN,修改为 OFFLOAD TCP/UDP for LAN
路由部分

OP 打开网络 => 接口 => LAN 修改 => DHCP 服务器 (勾选忽略此接口)
主路由 Padavan 设置 => 内部网络 LAN => DHCP 服务器 => 默认网关:192.168.0.200/DNS 服务器:192.168.0.200
检查方式:OpenWrt => 状态 => 实时信息
注意善用 OpenWrt 网络 => 诊断功能。
至此完成 Docker OpenWrt 旁路由安装。