软路由相对于硬路由性能较强,

幸运的是,在之前就购入了几台N1,从而可以进行折腾。

本教程结合之前恩山论坛的教程进行修改创作,

再次感谢原教程贴的作者们。

设备需求:

  • N1
  • 千兆交换机

先将N1与电脑插入路由器以便进行配置。

Step1:

安装Docker

curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh --mirror AliyunCode language: JavaScript (javascript)

Step2:

利用Docker创建虚拟内网

docker network create -d macvlan --subnet=192.168.31.0/24 --gateway=192.168.31.1 -o parent=eth0 macnetCode language: PHP (php)

Step3:

导入Openwrt官方armvirt_rootfs

docker import https://downloads.openwrt.org/releases/18.06.2/targets/armvirt/64/openwrt-18.06.2-armvirt-64-default-rootfs.tar.gz openwrt:18.06.2Code language: JavaScript (javascript)

Step4:

使用刚才创建的虚拟内网并运行(启动自启)

docker run --restart always -d --network macnet --privileged openwrt:18.06.2 /sbin/init

Step5:

进入容器内部的命令行界面,修改网络信息

docker ps
#获取正在运行的容器Code language: PHP (php)

返回结果

root@aml:~# docker ps
CONTAINER ID        IMAGE                             COMMAND             CREATED             STATUS              PORTS                    NAMES
1127b876da76        portainer/portainer:linux-arm64   "/portainer"        11 days ago         Up 30 minutes       0.0.0.0:9000->9000/tcp   keen_lederberg
1fcc16550c73        openwrt:18.06.2                   "/sbin/init"        11 days ago         Up 30 minutes                                vigilant_carsonCode language: PHP (php)

记录IMAGE为openwrt:18.06.2那行的CONTAINER ID (1fcc16550c73)

启动命令行

docker exec -it 1fcc16550c73 sh

修改网络配置文件

vi /etc/config/network

返回结果

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 'fd75:806a:fa6a::/48'

config interface 'lan'
        option type 'bridge'
        option ifname 'eth0'
        option proto 'static'
        option ipaddr '192.168.31.1'
        option netmask '255.255.255.0'
        option ip6assign '60'Code language: JavaScript (javascript)

将 “option ipaddr” 改成你们现在的Docker内网需要的网关地址。

(vi进入显示界面以后,键盘切换到英文输入,输入i开始编辑,按下Esc键后并依次输入:wq并回车保存后启动Docker內部桥接退出)

ip link add link eth0 name veth0 type macvlan
ifconfig veth0 up
iptables -t nat -I POSTROUTING -o pppoe-wan -j MASQUERADE
exitCode language: PHP (php)

Step6:

建立与宿主的Docker内网通信(修改/etc/network/interfaces文件)

#上面介绍了简单的vi用法所以不再重复
echo "
#Router
auto mac0
iface mac0 inet static
address 192.168.31.2
netmask 255.255.255.0
gateway 192.168.31.1
dns-nameservers 192.168.31.1
pre-up ip link add mac0 link eth0 type macvlan mode bridge
post-down ip link del mac0 link eth0 type macvlan mode bridge
" >> /etc/network/interfaces
#以上命令将建立与eth0的桥接并在Docker内网中使用192.168.31.2
vi /etc/network/interfaces
#更改eth0配置(iface eth0 inet dhcp)->(iface eth0 inet manual)
vi /etc/NetworkManager/NetworkManager.conf
#在以下键值内添加eth0
#[keyfile]
#unmanaged-devices=interface-name:wlan0
#->
#[keyfile]
#unmanaged-devices=interface-name:wlan0;interface-name:eth0Code language: PHP (php)

Step7:

断开N1、PC、光猫输出的广域网网线(路由器wan口接的网线)与路由器的连接,接上交换机。

正常的话电脑会通过N1获取到IP地址

cmd->
ping 192.168.31.1

正在 Ping 192.168.31.1 具有 32 字节的数据:
来自 192.168.31.1 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.31.1 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.31.1 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.31.1 的回复: 字节=32 时间<1ms TTL=64

192.168.31.1 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 0ms,最长 = 0ms,平均 = 0ms

更改SSH的地址为你刚才配置的宿主的内网地址

ssh root@192.168.31.1Code language: CSS (css)

正常来说现在已经能打开Openrt的管理页面了

#替换本地启动脚本为以下
ip link add link eth0 name veth0 type macvlan
ifconfig veth0 up
exit 0Code language: PHP (php)

配置PPPOE拨号上网

使用刚才Docker内网的桥接口进行配置

  • 点击添加新接口并依次输入或选择以下字符
  • wan
  • PPPOE
  • veth0

返回接口界面

编辑wan的参数,使用PPPOE拨号。(自行配置)

配置NAT转发

#替换为以下
iptables -t nat -I POSTROUTING -o pppoe-wan -j MASQUERADECode language: PHP (php)

Final Step:

若光猫自带DHCP服务器,请关闭。(重要)

启用强制DHCP分配

SSH到Openwrt的宿主上

#替换/etc/rc.local内容
echo "
modprobe pppoe
route add default gw 192.168.31.1
exit 0
" > /etc/rc.local
#重启
rebootCode language: PHP (php)

此时你的软路由已配置完成。

分类: Ubuntu

23 条评论

老王 · 2019年6月14日 下午7:42

教程很好,真不错,请问你这个网站也是N1做的吗?通过什么方式?是armbian装宝塔吗?端口怎么隐藏的呢?

    Starx · 2019年6月23日 下午10:54

    是的,是N1做的。全部环境手动配置的。

Victor Huang · 2019年7月27日 下午4:28

用这种方法是把广域网线接到交换机上,然后再把交换机和 N1 相连吗?对 MacVLAN 不太熟悉,这样会不会扩大了广播域啊?

soulfist · 2019年8月3日 下午2:06

很好的教程,感谢大大分享!

Aixtuz · 2021年3月19日 上午2:01

请问 Step6 中的 (iface eth0 inet dhcp)->(iface eth0 inet manual) 这段是要修改哪里呢?上面/etc/network/interfaces文件中没有和它一样的内容,只有近似的 iface mac0 inet static

    Starx · 2021年3月22日 上午11:07

    你好,关于eth0是假设当前你的系统默认网卡名为其,若不一致可替换为相关的网卡名。

Anthony · 2021年8月20日 下午7:41

你好,感谢你的教程,我已经成功刷入armbian,并且在上面装入docker,也运行上了OP. 联网都正常,外接一个红米路由器,都没问题。 唯独就是armbian这个宿主机没有任何网络,不知道你上面的Step 6 是怎么配的。能麻烦您说清楚一点吗?感谢!!

    Starx · 2021年9月1日 下午2:32

    你好,尝试在最后一步添加默认路由即可。

linnnnn · 2021年11月20日 下午8:25

我是在arch中用docker装op,请教一下arch无法通过op上网的问题怎么解决?

    Starx · 2021年12月16日 下午4:14

    看一下路由表和iptables nat配置

wangl13579 · 2021年12月18日 下午11:22

请问在coreelec的docker安装openwrt ,怎么进行step 6?显示没有/etc/network/interfaces这个文件

    Starx · 2021年12月26日 下午7:01

    你进到容器的终端了吗?

犬神夜叉 · 2021年12月21日 上午8:31

armbian和coreelec系统想部署成主路由,怎么部署?

    Starx · 2021年12月26日 下午7:00

    armbian可以直接部署,coreelec需要docker。

Leon · 2022年1月1日 下午4:36

你好,我最近也在折腾这个,想用docker做软路由,但是我有一些不太明白?软路由不应该有两个口,一个lan,一个wan吗?为什么你们的教程都没有wan口?
我目前的设备是:J3455自带一个千兆网卡外加一个USB千兆网卡,想要其中一个网卡接光猫,另外一个口接一个AP。 不明白该怎么配置,能指点一下吗 谢谢!

    Starx · 2022年1月18日 下午6:45

    因为N1只有一个网口,需要配置单臂路由。双网口就不需要设置bridge了。

      · 2022年1月22日 下午9:05

      我也是和他一样的情况,n3150想装个omv用docker跑opnewrt做软路由用某些功能,但是我主路由网段是1.x,这个openwrt想让他跑在2.x上,并且我主机上还有一个pcie扩展双网口的卡,想让openwrt接管这两个网口 一个做wan连接主路由做公网接入,另外一个接路由器lan tolan 做ap给手机笔记本用。这个方案看您的教程还是有点迷糊。我这种情况应该咋弄啊

zfj · 2022年1月17日 下午9:46

教程很棒。就是Step6 真的没看懂。
如果我的网卡名是eth0 openwrt地址也是192.168.31.1
请问/etc/network/interface最后修改是什么内容?
/etc/NetworkManager/NetworkManager.conf 最后后是什么内容?

    Starx · 2022年1月18日 下午6:48

    1. 设置mac0与eth0桥接
    2. eth0设置为手动
    3. 关闭networkmanager对eth0的管理

zhangjl · 2023年9月4日 下午4:50

Step6 gateway单词写错了, 我打算试试了, pve 虚拟机当主路由有性能损耗;

    Starx · 2023年9月6日 下午7:22

    感谢,已修正!

zhangjl · 2023年9月4日 下午4:52

ipv6 可以支持么

    Starx · 2023年9月6日 下午7:23

    理论上可以,不过你需要自己研究啦,我已经不用这个了当路由了。

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据