目标
在mikrotik中使用container容器来部署cloudflare的warp服务,来代理我们访问OpenAI的接口来避免出现Access denied的问题
背景介绍
我们知道现在很多虚拟主机的IP都被OpenAI禁用了(用的cloudflare的技术),目前可以用的策略是通过cloudflare自己的warp来绕过限制。
目前我使用的上网方案是国内和国外有2台mikrotik路由器,国外的使用的是云服务器部署的mikrotik的chr版本。然后我在2台路由器之间搭建了专用链路,然后在国内使用策略路由来上网。
接上一篇文章的方案来说的话,我之前的方案是在国内的部署了一台Linux,然后配置路由让他通过国外的ros来上网,然后再在这个机器上面部署了一个cloudflare warp然后暴露一个代理端口出来,再在我国内的clash上面配置openai的域名策略到这个socket上来实现国内访问OpenAI。
这个方案的话目前来说可以用,但是强迫症患者有点强迫,莫名其妙的多了个依赖,多了个虚拟机,有点不爽。
新的方案
我们知道最新版本的mikrotik已经支持容器了,然后我国外的虚拟机只是部署一个mikrotik来说的话,资源确实有很大的浪费。
然后这个cloudflare warp从分类上面来说也属于上网一类的东西,他也依赖国外上网环境,帮他部署在国外这个mikrotik来说也更合理。
加上我也想尝试一下 mikrotik的container好不好用。所以各种理由让我想尝试一下在国外的这个mikrotik来部署cf的warp。
开始操作
找到mikrotik官方的一篇文章开始对着敲
https://help.mikrotik.com/docs/display/ROS/Container
上来就发现,我们软路由默认是不给用container的,即使你已经安装了这个包。
需要开启一下,使用下面这个命令。
/system/device-mode/update container=yes
然后非常坑的开始了,执行完这个命令,他提示你要去给机器断个电来生效配置。
我的云主机没有断电这个选项,只有重启或者关机,但是这两个选项都不行。
网上查了一堆资料,发现官方论坛有一篇文章在讨论这个
https://forum.mikrotik.com/viewtopic.php?t=188901
然后没啥结论,里面大概意思就是比较坑,对chr版本的不太友好,然后说aws上面有强制关机选项好像行,但是我的虚拟机提供商没有这个选项。
折腾半天都不行,实在没有办法了,提工单给云主机厂商,他们说 没有这个功能。。强制关机不得行。
然后注意到帖子里有个人说,他通过本地虚拟机开好这个container,然后再导出这个虚拟机,再dd到云端。虽然他没说步骤,但是感觉靠谱,我按照这个思路试了一通,帮我的虚拟机备份了一下,然后各种操作。。。最后没成功,导出的镜像死活搞不进去。。
哎,放弃了,不搞了,我帮我备份的虚拟机又回滚了回去。
当我百无聊赖的检查各种配置的看看我备份的配置是否有问题的时候,我鬼使神差的打了个命令:
/system/device-mode/print mode: enterprise container: yes
哎哟我擦,什么情况!
拼死拼活搞了半天的container,居然自己出来了。
我后来想想应该是这样的,我之前在敲了切换container启用命令之后打的备份,然后这个备份相当于强制关机嘞,然后再用这个备份恢复出来的机器,就自动启用了。。。真他妈是歪打正着。
后面就比较顺利了
按照
https://help.mikrotik.com/docs/display/ROS/Container
介绍的步骤一步一步操作:
官方文档是创建个什么鬼pihole容器,我不是要创建这个容器,就截取了其中有用的部分配置:
创建网络 为容器创建个veth网络: /interface/veth/add name=veth1 address=172.17.0.2/24 gateway=172.17.0.1 给容器创建一个网桥,然后帮veth加进去: 创建网桥 /interface/bridge/add name=dockers 给网桥一个路由器地址 /ip/address/add address=172.17.0.1/24 interface=dockers 帮之前给容器创建的地址加进网桥里面 /interface/bridge/port add bridge=dockers interface=veth1 给容器网段上网伪装: /ip/firewall/nat/add chain=srcnat action=masquerade src-address=172.17.0.0/24 给容器配置registry来拉取镜像 /container/config/set registry-url=https://registry-1.docker.io tmpdir=disk1/pull
至此,容器配置部分差不多了,我想先起一个NGINX来试试水

打开界面上面的container面板,点击加号,然后里面只要填上 镜像名称,给这个容器分配的网络接口,下面勾上开机启动和日志就行了。别的目前用不到都不需要配置。
注意这里只要填写镜像名称就行了,他会自动拼接到前面配置的 registry-url去拉取镜像,所以后面如果你要拉取的镜像不是这个官方源的,需要去那边修改下registry-url地址。
点击OK保存,开始拉取镜像,然后稍等下就会创建好,默认创建好的容器是stoped的,点击start就可以启动了。
我们可以通过命令/container/print
来查看容器列表,然后通过/container/shell 0
(这个0是容器id,print可以看到)来进入容器的控制台。
我们可以简单的配置个dstnat来帮这个容器端口暴露出来,或者帮容器的网络路由出来来访问这个NGINX。

牛逼,成了!
在container里面篇日志cloudflare warp
网上找到这个项目
https://github.com/Kab1r/cloudflare-warp-container
他们已经提供了一个镜像 ghcr.io/kab1r/cloudflare-warp-container:centos-main
我们注意到 他不是存储在官方仓库的,我们要去修改下我们container的registry-url为 https://ghcr.io ,不然他拉取镜像会报错。

简单配置下,这里我们要注意,要给这个container新增一个接口,这块概念和我们传统玩容器不太一样。mikrotik下面的容器,你要自己手动去给每个容器新建一个veth,然后手动给他安排上IP地址(我开始没注意到,还傻乎乎的去研究怎么给容器开启dhcp…)。
我们这边给建了个新的veth然后给他个IP地址,再帮他加入到我们docker网桥里面去。
点击OK,启动,一切正常大功告成!
后面就是简单的验证,由于我们还没打通这个docker网桥到国内的路由(临时用的172网段,没规划,后续应该是要打通),我帮这个容器的40001代理端口做了个dstnat,然后国内机器用代理验证,一切顺利,完美收官,做好备份结束!
参考资料:
https://help.mikrotik.com/docs/display/ROS/Container