踩了好多好多大坑,感觉用N100在docker中使用openwrt并且WAN口进行PPPoE拨号的教程不是太多,给我折磨完了
前言
最近入手了一个 699 双网口的 N100 小主机,自己有内存和硬盘,装上就开始酷酷捯饬,装上 Ubuntu22.04,双网口的第一步当然是 openwrt,启动!
相同情况的教程的确有点少,酷酷踩坑,感觉可能是没人用 docker openwrt 当主路由,而且 WAN 口还是 PPPoE 拨号
先罗列一下参考过的教程
能用,好用的教程
https://rupu.net/archives/docker-openwrt
神中神,主路由且双网卡,不同之处是我是PPPoE拨号上网且他的lan口是无线网卡(这个很重要,有个大坑)
https://blog.csdn.net/qq_38251691/article/details/128356619
神,一定需要手动设置 ip 地址和网关,参考一些教程会设置为.x.2害死我了,第一次连接IP、子网掩码、网关的静态设置非常重要,因为镜像的LAN口默认不会开启DHCP,需要手动设置静态IP进入openwrt后台后开启DHCP
https://blog.csdn.net/gongchenyu/article/details/134724333
docker旁路由,有参考价值,有宿主机通信
https://rehtt.com/index.php/archives/236/
宿主机通信详解,非常的棒
https://post.smzdm.com/p/awzodmpp/
IPV6设置,我使用的是ImmortalWrt,WAN6选设备的时候没有@WAN或者pppoe-WAN,但其实可以直接在文件里面改
https://github.com/lisaac/blog/issues/4#issuecomment-603069862
三网口(卡)及以上需要注意顺序
与我情况不同
-
是N100双网口但是指令有问题但未提及宿主机通信问题,且网关的指令都会报错(也可能是我Ubuntu22.04要求必须.x.0)
旁路由:
https://zy.hn/2023/02/23/deploy-openwrt-with-docker/
经测试,纯网卡似乎不能做旁路由,纯网线是可以的,也可能是我操作有问题
-
(虽然这个网站的镜像构建很好用,但是这篇教程指令都有问题)
镜像选择
1.下载镜像后导入
官网:https://archive.openwrt.org/releases/23.05.3/targets/
资源站:https://github.com/kiddin9/openwrt-packages
资源站:https://openwrt.ai/?target=x86%2F64&id=generic(最下面)
选
xxx-rootfs.tar.gz
,是可解压固件,一般用于Docker
1
2 gunzip xxx-rootfs.tar.gz
docker xxx-rootfs.tar openwrt:rootfs如 https://archive.openwrt.org/releases/23.05.3/targets/x86/64/openwrt-23.05.3-x86-64-rootfs.tar.gz
2.docker镜像拉取
docker pull sulinggg/openwrt:x86_64
,这个镜像虽然不维护了但是还是很棒,预装了很多插件,本教程使用这个进行演示
3.自己编译
OP 启动!
一、开启网口混杂模式
1.查看网口名字
1 | ➜ ~ ifconfig |
如上,我的网口是enp2s0
和enp4s0
,wlp1s0
是无线网卡,先不管
我这里选择enp2s0
是LAN口负责本地分派IP,enp4s0
为WAN口负责拨号上网
2.开启网口混杂
1 | sudo ip link set enp4s0 promisc on |
然后上面的ifconfig
输出后面会新增PROMISC
字段,就是开启成功
1 | enp2s0: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST> mtu 1500 |
3.开机自自动
一重启网口混杂就会消失,所以需要写进开机脚本,这里我用systemctl
实现
先写脚本,vim /home/{your_name}/sh/network_op.sh
,写入下面的内容,your_name替换成你的
1 | sudo ip link set enp4s0 promisc on |
再新建system,sudo vim /etc/systemd/system/network_op.service
,写入下面的内容,your_name替换成你的
1 | [Unit] |
运行一次服务并设置开启自启动
1 | sudo systemctl start network_op |
二、创建网络并启动OP
这里我们使用 docker 的 macvlan,从物理网口虚拟出一个新的网口,并且挂载进 openwrt 镜像中
1 | # 创建 LAN 口虚拟网络,指定网段为 100.x,网关是 100.1,设备使用 enp2s0,名字叫 op_lan |
实际过程
1 | (base) ➜ python_and_sh docker network create -d macvlan --subnet=192.168.100.0/24 --gateway=192.168.100.1 -o parent=enp2s0 op_lan |
三、配置LAN&WAN网络
接下来要进入容器内修改配置
1 | # 进入openwrt镜像内部 |
把 lan 改为下面的参数,删掉多余的字段
1 | config interface 'lan' |
重启网络
1 | /etc/init.d/network restart |
!!!!!然后第一个小坑,固件默认 lan 口不开启 DHCP,所以插上 lan 口需要自行设定 IP 和网关!!!!!
然后浏览器输入192.168.100.1
即可进入 openwrt 的后台管理页面
这么说起来我当时直接输了我自己密码就登进去了,难道他是自动把第一次输入的密码当密码?如果没有的话就试试root、pass、password什么的
我们先把 lan 口 DHCP 打开,网络->接口->lan->修改->最下面->忽略此接口->取消勾选
,高级设置->强制
也勾选上,保存&应用
网络
->DHCP/DNS->基本设置->取消勾选重绑定保护
,不然一些域名解析的结构是192.x
和10.x
的保留地址不会被返回!!!!!!仅本地服务业
也可以关了
再配置 wan 口,添加新接口
填入账号和密码 !!!!在 wan 的防火墙设置 选中 wan!!!!,不然一切端口转发都会失效
有时候会自动选中 但有时候不会
如果卡住可以重启docker,docker restart openwrt
这时候 wan 口可以正常拨号获得 IP,LAN 口也会自动分配 ip 了,但是,宿主机是无法使用网络,我们需要给宿主机也分配一个192.168.100.x
的地址
四、宿主机使用 openwrt 的网络
这里我们使用 ip 指令给网卡创建 macvlan,因为 macvlan 的安全机制,宿主机与容器内不能通过 macvlan 数据互通,但是 macvlan 之间可以互通
1 | # 先创建一个名叫 me_to_op 的 macvlan,使用设备 enp2s0 |
配置完成之后就可以互相 ping
宿主机到 openwrt:ping 192.168.100.1
openwrt 到宿主机:docker exec -it openwrt bash -c "ping 192.168.100.100 -c 3"
这时候路由正确(route -n
)但是域名解析不对,能 ping ip 但是不能上网,我们接着配置 DNS
1 | sudo sh -c 'echo "nameserver 192.168.100.1" > /etc/resolv.conf' |
改
/etc/systemd/resolved.conf
的 dns 字段是更加规范的操作,但是怕以后换网络环境忘记了,所以直接改/etc/resolv.conf
宿主机联网测试:curl baidu.com
1 | (base) ➜ ~ curl www.baidu.com |
为了使上面的修改重启后一直生效,修改/home/{your_name}/sh/network_op.sh
文件为如下内容
1 | sudo ip link set enp4s0 promisc on |
Tips:两个怪问题
1.LAN 口不插东西宿主机就 ping 不通 192.168.100.1,就是这么的神奇,必须得要 LAN 口有一个设备,不然就是 ping 不通,我的理解是 LAN 口不插东西就没有被激活,所以上面设置的 macvlan 没有生效,比如接个电脑是可以的,接个交换机(交换机不接其他东西)也是可以的,只要 LAN 口灯亮着就是可以的,没亮就是不行的
其实还有个方案是不用
enp2s0
而用wlp1s0
,也就是用网卡开一个macvlan,然后就不用一直插一个东西了1
2
3
4
5
6
7
8
9
10
11
12sudo ip link set enp4s0 promisc on
sudo ip link set enp2s0 promisc on
sudo ip link set wlp1s0 promisc on
sleep 10
sudo ip link del me_to_op
sudo ip link add me_to_op link wlp1s0 type macvlan mode bridge
sudo ip addr add 192.168.200.200 dev me_to_op
sudo ip link set me_to_op up
sudo ip route add 192.168.200.1 dev me_to_op
sudo route add default gw 192.168.200.1 me_to_op
sudo sh -c 'echo "nameserver 192.168.200.1" > /etc/resolv.conf'这里加了
sleep 10
是因为不知道为啥会设置不成功,加上就好了2.LAN 口下的网络不能正常访问域名解析到 WAN 口 IP 上的内容,具体点来说是,我的 openwrt 的 80 端口转发到了宿主机
192.168.100.100
的 80 上,然后由 nginx 反代,op.xx.xx
代理到 op 的管理页面,files.xx.xx
代理到 GoWebDav 上,跟 WAN 口同网段的10.x.x.x.
的设备可以正常使用,但是 LAN 口下的设备用域名不能访问,而直接端口 + IP 是可以的,需要做如下改动(是与桥接网络过滤器有关的内容,具体原因不是很清楚)1
2
3
4
5
6
7
81.ssh连接openwrt系统后,编辑/etc/sysctl.d/11-br-netfilter.conf文件。
net.bridge.bridge-nf-call-arptables=0
net.bridge.bridge-nf-call-ip6tables=0
net.bridge.bridge-nf-call-iptables=0
确认后面的值是0,如果不是,需要改为0
2.编辑/etc/sysctl.conf文件。文件内容可能是空的,把上面的内容复制进sysctl.conf文件,保存退出。
3.ssh内输入sysctl -p命令,查看输出结果是不是上面提到的那三行内容。
4.重启
参考教程:https://www.right.com.cn/forum/forum.php?mod=redirect&goto=findpost&ptid=8192269&pid=16637078
部分教程提及了 80 端口转发的
NAT 环回
,请勿关闭
1 NAT环回(NAT loopback)是指在网络中使用网络地址转换(NAT)时,当内部主机尝试通过其外部公共IP地址访问在同一内部网络中的另一台主机时发生的情况。简单来说,当内部主机试图通过公共IP地址访问自己所在的内部网络中的另一台主机时,数据包被NAT路由器接收并重新发送给内部网络中的相应主机,这种情况就被称为NAT环回。这种行为可能会影响网络性能和行为,因此需要在NAT路由器上进行适当的配置来处理这种情况。一旦关闭
NAT 环回
,所有的访问到 WAN 的 IP 会直接打到 op 后台,不会被端口转发,宿主机上的 nginx 将无法生效
五、插件&其他一些使用
系统
1.管理权
Dropbear 实例
按需修改
2.挂载点&启动项
我这里需要持久化挂载一块硬盘到 openwrt 里面,试了下挂载点的操作不生效,我就直接把mount /dev/sda1 /mnt/sda1
写到启动项最下面的本地启动脚本里面了
服务
1.微信推送
微信pushplus不限制条数,好用。但在 op 的实际推送中感觉用处不大,IPV4 和 IPV6 变动可以用 DDNS解决。
2.DDNS/动态DNS
修改->启用,然后按需修改即可,我这里 IPV4 来源选的是接口
->pppoe-wan
,查询主机名
和域名
都直接填xxx.xxx.xxx
就行,成功配置后上次更新
下次更新
那会变成两行时间,出现问题可以查看日志
如果你的域名是
192.x
或10.x
等保留地址,全局设置->允许非公网 IP
一定要勾选上!!!!!!!!
NAS
1.GoWebDav
简单使用,点击即用,但是有个开关叫只读模式
,但是我没发现应该怎么往上上传😭
2.网络共享
Samba,好用,踩了点小坑,如果要在 WAN 口同网段下使用需要把 445 和 139 端口转发到内部 192.168.100.1 的 445 和 139,排错参考教程
先进行命令行操作:
1 | # 更新源 |
然后在网页控制界面中添加文件夹,名称随便取,路径看你定,用户用上面的,新文件0666(可读可写不可执行),目录0777
Windows 下载资源管理器输入\\{IP}
即可访问,可以映射到网络驱动器方便使用
其他的
1.使用IPV6
如果你的网络不发放 IPV6,改了也没有的
在 openwrt 中安装组件
1 | opkg update |
修改vim /etc/config/network
追加如下内容
1 | config interface 'wan6' |
详细解释 ipv6:https://post.smzdm.com/p/awzodmpp/
如果要实现 ipv6 转发到 ipv4 端口,socat软件包能直接在
软件包
里面点一下安装,socat 教程如果要监听 80 和 443 端口,因为被
uhttpd
占住了所以需要改一下设置,让uhttpd
不监听 IPV6 地址
1
2
3
4
5
6
7
8 # 查看uhttp监听情况
netstat -tlnp | grep uhttpd
# 修改配置,注释掉ipv6的监听
vi /etc/config/uhttpd
# 重启uhttpd
/etc/init.d/uhttpd restart
# 再次查看
netstat -tlnp | grep uhttpd如果要在 LAN 网络下使用 IPV6 域名解析,
网络
->DHCP/DNS
->高级设置
->禁止解析 IPV6 DNS 记录
测试端口通断
nmap -6 {IPV6 地址} -p 80,4438080,20000,30004 -Pn
clash 开着会影响 ipv6 地址的访问,无敌了,后面发现原因是会域名代理,如果你买的机场的这个节点有 IPV6,甚至可以用代理脸上,即使你自己没有 IPV6 网络
不知道为啥我的 IPV6 防火墙没生效,可以直接访问内网的设备,发现 IPV4 也是一样的,防火墙没有阻断,有点奇怪,这个教程有 nmap 使用方法,哎不管了,开就开吧
2.加入无线网卡
题外话一句,我买的 N100 自带 AX101 网卡,是 WiFi6 但是很垃圾 ,最重要的是官方没有适配驱动,在 Ubuntu22.04 系统上开机即可使用,但是带宽甚至跑不满百兆,个人猜测是识别成了其他网卡能用但是调度不好,跑不满千兆也能理解,但是跑不满百兆就有点离谱了。
最后从室友的泡水机上取了个 MT7921,无线发射带宽实测刚好 100M,能用还行
有尝试使用 macvlan 等操作挂进 openwrt,不过想了想好像用处不大,最终的方法是直接开一个热点,把192.168.100.100
获得的网络共享出去
1 | # 使用nmcli启用WiFi |
也是重启会失效,所以加入之前写的开机脚本里
最终的脚本内容,为了以防万一又加入了两句删除指令sudo ip link del me_to_op
和 nmcli connection delete nmcli-wifi
1 | sudo ip link set enp4s0 promisc on |
因为使用的是热点,所以ifconfig
中无线会变成一个10.x
的网段,链接上WiFi的设备也会获得10.x
的网段,不过跟我的 WAN 口地址不冲突,所以我也就不管了,应也该可以改网段的。(后记:这样似乎能连上但不能上网,我已经换成下面的方式了)
如果要把 WiFi 挂进 openwrt 而非上面那样,则需操作如下
先按上面的方法把 WiFi 打开后再使用下面的操作
1
2 docker network create -d macvlan --subnet=192.168.200.0/24 --gateway=192.168.200.1 -o parent=wlp1s0 op_wifi
docker network connect op_wifi openwrt修改
/etc/config/network
1
2
3
4
5
6
7 config interface 'lanwifi'
option type 'bridge'
option ifname 'eth2'
option proto 'static'
option netmask '255.255.255.0'
option ip6assign '60'
option ipaddr '192.168.200.1'同样设置防火墙到 LAN
似乎这样做链接上 WIFI 的设备先会得到
10.x
的 IP,然后变成一个192.168.200.x
的 IP,我感觉应该找一找 WiFi 热点能发送但是不分配 IP 的方案,然后直接让 op 来发 IP,跟 LAN 就一样的了,而且这样就不会像 LAN 一样还的插个东西才能工作。或许还可以考虑一下都分进 100 网段里面,两个 DHCP 服务器各发各的,或许也不会冲突?
后记
从购入到今天刚好十天,终于捯饬的差不多了,爽!从昨天开始狂写 4K 字的教程,必须狠狠地记录!我终将成为 op 高手!
以及感谢 zzsqwq 的分析排错,神!还有 KirCute 的一问:“这灯怎么没亮”,从而想到 LAN 口不插东西就不工作,无敌!
最后看到这个视频【正片】面对校园网的多设备检测,「我」的解决方案是—— 真的很强啊