由于本人长期使用docker来进行一些服务的安装,pve这些底层为qemu的虚拟化方案,我感觉小鸡子无法承受,所以搞了2天,折腾了很多地方,最终搞定。分享出来避免大家踩坑。
先上个图康康:
前置条件
大概得明白以下的一些内容:
- Linux的使用
- docker使用
- docker网络模式,包括macvlan
- openwrt配置与使用
不懂,折腾到具体的步骤自行百度?
方法
先后在网上学习了几位大佬的方法,其中主要使用的是洛水赋神的双网口解决方法,但是它的方法在我的小鸡子上貌似无法成功,其中主要的原因是校园网登陆问题。所以干脆直接用docker的网桥,用它来当NAT分发一个地址,然后把docker0网桥到外网的路由打通。看如下本人的网络拓扑图。
其中,有两个物理网口,分别是enp1s0和enp2s0,enp1s0是连接到校园网,但是只能认证登陆,并且分配得到一个IP地址,无法通过macvlan虚拟化enp1s0来获得另外的IP地址,或许行,但是我没搞通。enp2s0则是另外一个网口,我将它连接到了我的台式机上,后续就作为lan口进行使用。
再看主机内部,其中主要和网络相关的部分,我用了两个容器,一个是用来登陆校园网的容器,里边运行了一个脚本来登陆校园网,保证小鸡子一直在线,由于它要保证enp1s0口有网,因此,让它使用docker网络中的host模式,直接使用主机网络,然后登陆认证页面拿上层路由地址。另外一容器就是OpenWRT,其中虚拟化了两个网口,分别是WAN口和LAN口,其中WAN口使用docker的bridge网络,使用docker的NAT功能,拿到docker0中的一个IP地址;另外一个LAN口则是使用macvlan模式,自己定义一个网段,然后让enp2s0虚拟化该macvlan来进行和windows的通信。
步骤
下面复现一下每个步骤,环境是:
- Ubuntu 20.04 LTS
- docker
- J4125 双网口机子
Step 1 开起网卡混杂模式
查看网卡
ip addr
如果没有 PROMISC 字段,则使用以下命令开起:
ip link set enp1s0 promisc on
ip link set enp2s0 promisc on
持久化一下,由于Ubuntu的采用的网络管理方式跟以前的版本有所不同,所以写一个简单的脚本
vim /etc/network/if-up.d/promisc
然后填入以下内容,相当于是每次启动的时候,自动让网卡开起混杂模式。
#!/bin/bash
/sbin/ip link set enp1s0 promisc on
/sbin/ip link set enp2s0 promisc on
然后添加执行权限
chmod +x /etc/network/if-up.d/promisc
Step 2 开起 IPv4 转发
在宿主机也就是小鸡子的Ubuntu上开起IPv4转发功能:
vi /etc/sysctl.conf
# 取消 net.ipv4.ip_forward = 1 的注释
# 或者添加 net.ipv4.ip_forward = 1
# 重新加载配置
sysctl -p /etc/sysctl.conf
Step 3 配置LAN口
先编写一个模板文件,作为docker启动的时候/etc/config/network网络配置的持久化文件:
vim /home/[UbuntuUser]/openwrt/network
其中内容如下,这个其实是根据openwrt的网络配置文件来的,不同的版本可能会不同,但是大同小异:
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 packet_steering '1'
config device
option name 'br-lan'
option type 'bridge'
list ports 'eth0'
config interface 'lan'
option ifname 'br-lan'
option proto 'static'
option ipaddr '192.168.10.2'
option netmask '255.255.255.0'
option ip6assign '60'
config interface 'wan'
option ifname 'eth1'
option proto 'dhcp'
option gateway '172.17.0.1'
option dns '8.8.8.8 8.8.4.4'
配置LAN口macvlan:创建一个命名为maclan的虚拟网卡,然后固定好IP地址:
docker network create -d macvlan --subnet=192.168.10.0/24 --gateway=192.168.10.1 -o parent=enp2s0 maclan
docker network ls
Step 4 创建openwrt容器
使用镜像创建docker容器,其中我采用的openwrt容器镜像是: sulinggg/openwrt:x86_64,我们先创建容器,并把lan口连接上
sudo docker run --restart always --name openwrt -d --network maclan --privileged --ip 192.168.10.2 -v /home/bencorn/openwrt/network:/etc/config/network sulinggg/openwrt:x86_64 /sbin/init
然后进入docker配置一下密码:
docker exec -it openwrt /bin/sh
passwd
然后在连接enp2s0的windows上配置一个静态IP,这样就可以连接到LAN口了,配置OpenWRT
浏览器输入:192.168.10.2,敲回车,如果不出意外应该可以登陆到openwrt
Step 5 配置WAN口
将openwrt容器连接到网桥上
docker network connect bridge openwrt
Step 6 配置各个端口
首先在web界面中配置LAN口,选择一个物理的接口eth0:
Step7 配置路由
这个也是比较危险的操作,可能小鸡子会被网络攻击,但是无所谓,开搞
进入openwrt容器,检查网络情况:
docker exec -it openwrt /bin/sh
ping 8.8.8.8
ping www.baidu.com
如果 ping 8.8.8.8 可以查询得到,说明已经联网了;如果 ping www.baidu.com无法连接到,说明dns查询得配置一下,直接在容器内运行
echo "nameserver 8.8.8.8" > /etc/resolv.conf
如果还是无法联网,检查和配置宿主机路由,保证可以联网:
iptables -t nat -L -n -v
iptables -A FORWARD -i docker0 -o [你的外部网络接口] -j ACCEPT
iptables -A FORWARD -i [你的外部网络接口] -o docker0 -j ACCEPT
其他
到这儿应该是大功告成了,反正我成了。
- 如果还不行,可以尝试在静态配置的windows网络处设置备用DNS为1.1.1.1或者8.8.8.8
- 如果还不行,则可以GPT-4
- 如果还不行,则可以评论区留言