软路由部署

 

概述

常见的路由器,实际上是厂商在arm平台定制的一个操作系统;

由于某家路由器公司使用了linux的代码,在社区认为使用过多,需要公开源码时,公开了自己的源码,因此社区基于源码(事实上是重写,但源码帮助社区了解了硬件)设计了openwrt操作系统,在路由功能的基础上提供了很多其它功能.(lede曾经是openwrt的分支,但后来双方和解,以openwrt的名称和lede的社区规则进行合并)

考虑到某不可明说的需求,为了避免在所有设备配置客户端,规则,协议,部署了软路由,统一管理.

openwrt可以部署在x86平台,物理机,虚拟机,甚至docker,本教程记述部署在esxi下ubuntu20虚拟机的docker中的方案.

网络结构

visio不太好用,不画了..

光猫进小米ac2100,小米ac2100网线连接两台pc,一台主力机,一台esxi折腾机;其它设备通过ac2100的无线连接.

局域网的任何设备,手动把网关设置为软路由的ip即可.

软路由分析

通常路由器的功能包括

  • 拨号
  • 交换数据
  • 网关
  • dhcp
  • dns

软路由并非在所有功能上都有优势,因此只使用了软路由的网关和dns功能.

其中网关指的是代理其它设备的数据,dns是某功能的实现方式.

需要软路由功能的设备,需要把网关和dns设为软路由ip.

可以在ac2100的dhcp设置中,设置dhcp默认网关为软路由ip,避免手动设置,但是会有其它坑的..建议手动.

操作记录

首先,跳过部署esxi,安装ubuntu,按照docker等部分..

esxi无需软路由,网关始终指向ac2100,本地环境为192.168.2.1.

打开网卡混杂模式

esxi

打开web管理ui,网络,vswitch0,编辑设置,安全.

混杂模式,mac地址更改,伪传输均设为接受.

可能漏了什么,在那块设置附近..

ubuntu

eth0需要修改为你的网卡名,可能是eth0或者ens160这种样子

sudo ip link set eth0 promisc on

配置docker

创建网络

软路由需要有独立的ip,避免和host冲突,因此需要手动创建macvlan网络

网段,网关根据你的网络情况设定.

docker network create -d macvlan --subnet=192.168.123.0/24 --gateway=192.168.123.1 -o parent=eth0 macnet

docker镜像

在微软提供github action编译环境后,众多国人基于此配置了openwrt编译流程.

无需本地搭建任何环境,非常nice.

Actions-OpenWrt

多次编译后有些boring,选择了一位同志编译的全功能镜像..毕竟x86平台,不用节约空间和性能..

openwrt镜像

补充:openwrt主要有原版和lede大开发版,国内多用lede版,因为已经集合了不可明说插件.

除此之外还有许多大神开发了插件,可以一起编译.

docker import openwrt-x86-64-generic-rootfs.tar.gz lean_openwrt

docker部署

docker-compose部署文件:

version: '3'
services:
  openwrt:
    container_name: openwrt
    restart: always
    networks:
      - macnet
    privileged: true
    image: lean_openwrt
    command: /sbin/init
    #volumes:
      #- ./file/etc:/etc
      #- ~/.ssh:/root/.ssh
      #- ./file/ycc:/ycc


networks:
  macnet:
    external: true

里面注释掉了4行,主要是为了把配置文件保存在container外,由于本篇不准备讲docker细节,所以如果你看不懂,就不要打开它们.

docker-compose up -d

这条up命令不保证work,因为我用的是vscode的docker插件启动的..

配置openwrt

attach进openwrt,修改ip地址,示例如下.

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 'fdb3:1fa9:5ec6::/48'
        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 gateway '192.168.2.1'
        option boardcast '192.168.2.255'
        option dns '119.29.29.29'
        option ipaddr '192.168.2.2'

浏览器打开192.168.2.2即可,默认密码password.自由享用插件

one more thing!

有一个坑是docker限制macvlan类型的container不能和host通讯,为了安全.

解决方案是在host增加一个新的网卡,桥接到原本的网卡.如果ubuntu太新,需要修改新的网络管理netplan,切换为旧的ipupdown.

disbale netplan 桥接macvlan