RouterOS配置Container容器安装Sing-Box实现单路由器上网
之前写过2篇
Mikrotik HAP AX3 通过Container安装Frpc,Clash以及Yacd网页界面
Mikrotik HAP AX3通过container运行clash透明网关,抛弃旁路由,单机自由上网
发现感兴趣的小伙伴还是挺多的,但是查看回复基本都在说第2篇看不懂,确实,步骤很复杂,我这个写作者,实践了好多次的都觉得复杂,所以我后面没有用ax3了,跳出了这个坑:)。
因为觉得还是mini小主机安装:pve+虚拟机跑chr版本的ros+Openwrt旁路由+AP(或无线网卡)的方案 适合我,mini小主机系统资源多、性能强、玩法多,能折腾。:)
但是为了某些情况下,就是不想多用设备,一个路由器解决上网问题,还是重新查资料,解决了使用只有RouterOS系统的单路由器,就能完成上内外网的需求:)
而且步骤非常简单,装好Container中的Sing-box后(本例中ip地址配置为192.168.1.6),RouterOS中只需要执行一行命令:
/iproute
add disabled=no distance=1 dst-address=198.18.0.0/15 gateway=192.168.1.6pref-src="" routing-table=main scope=30 suppress-hw-offload=no target-scope=10
不用像之前的操作要维护国内ip地址文件,ros系统还要执行很多设置路由的命令,现在统统不需要了。
然后再将需要上外网的电脑的:
1、网关设置成运行在Container中的sing-box的ip地址(本例中是192.168.1.6),就能正确上内网和外网了:)
2、dns服务器随便设置成一个公网的dns例如 223.5.5.5 即可
如果不想手工指定电脑的网关和dns服务器,可以设置dhcp option,配置好网关和dns(随便一个公网dns 例如223.5.5.5),将需要上内外网的电脑固定ip后,分配做好的dhcp option即可。
或者简单粗暴,在dhcp的配置中,
1、将网关指定为运行在Container中的sing-box的ip地址(本例中是192.168.1.6),
2、dns服务器随便设置成一个公网的dns例如 223.5.5.5 即可
达成效果:
国内外自动分流,国内外访问均正常,丝般流畅:)
Tele运行正常
微信,贴吧等图片显示正常
browserleaks.com/ip 的dns泄露检测通过
系统环境:
正版 ros chr(Cloud Hosted Router) 7.14.3 (p1 千兆)版本
使用wincp软件上传文件到ros系统(ros系统要打开ftp服务)
网络拓扑如下:
pve宿主机系统 ip地址 192.168.1.3
ros系统chr版本 ip地址 192.168.1.2
配置给Container中的sing-box的虚拟网卡 veth1 地址为192.168.1.6
sirpdboy的openwrt作为旁路由 ip地址 192.168.1.1
内网电脑的网关和dns都配置成openwrt旁路由的 192.168.1.1
(配置好Container中的sing-box后,测试机的网关配置为192.168.1.6,dns配置为223.5.5.5 这样可以再不影响内网其他电脑的情况下进行测试)
好像好多小伙伴初次折腾ros的Container容器,都还不知道怎么配置和安装,这里就简单说一下:
1、在ros的终端窗口中执行
/system/device-mode/update container=yes
然后给ros设备断电,注意,是断电!!!ros设备直接断电,装在mini小主机pve系统中的ros系统直接拔mini小主机的电源,切记切记。
2、下载对应设备ros系统的Extra packages软件包,将里面的Container-版本号.npk上传到ros的Files中,然后重启ros系统(只需在winbox中执行reboot即可,不用断电),ros在重启后会自动安装这个npk。
做完这2个操作后,在ros的winbox界面中,能在左侧看到Container菜单即可。(如果重启后还是看不到,再重复第2步的上传、重启操作应该就能看到了)
然后是添加Container容器需要的虚拟网卡veth1,自行按需添加即可,本例中是veth1,配置ip为 192.168.1.6 网关为ros系统的192.168.1.2
注意添加的虚拟网卡veth一定要指定网关,本例中是ros所在的192.168.1.2,确保关闭openwrt旁路由,测试sing-box上外网时能正常上网。
/interface/veth/add name=veth1 address=192.168.1.6/24 gateway=192.168.1.2
(虚拟网卡 veth1 的 ip地址 和 网关 按需修改)
然后将此veth1加入bridge1,切记切记
注意一定要加到对应的bridge中,否则后面启动sing-box会提示不能连接到外网下载规则文件,导致sing-box容器无法启动!!!
下面再简单说下如何制作能在ros的Container中运行的docker镜像
sudo docker images
sudo docker rmi (IMAGE ID)
本例中使用的是gzxhwq 提供的sing-box镜像,版本1.9.0-rc.9,linux/amd64版本,使用arm64的ros设备的小伙伴自行制作arm64版本
https://registry.hub.docker.com/layers/gzxhwq/sing-box/1.9.0-rc.9/images/sha256-709d5da259428c22f7232c939cf5f73c44415773be8ab6c55cdbc97797def6a6?context=explore
下载docker镜像到本地
sudo docker pull gzxhwq/sing-box:latest@sha256:6af40e97fc9ac4cca80f741ccafac63160f1c3fd2d9a9b47350b44f0917f9372
导出docker镜像为文件
sudo docker save gzxhwq/sing-box > ./sing-box-chr.tar
将生成的sing-box-chr.tar 上传到ros系统的根目录
执行如下命令将docker镜像文件导入ros系统
/container/add file=sing-box-chr.tar interface=veth1 root-dir=/docker/sing-box logging=yes
因为使用的sing-box的docker镜像中,没有在/etc/sing-box中生成config.json配置文件,自己上传一个config.json文件进去sing-box启动会报没有读取的权限,
因此需要自己在ros中新建一个目录,例如 /docker/config/sing-box 然后将自己的config.json配置文件上传到这个目录,这样sing-box启动时才能读取config配置文件
所以要执行下面的这条新增1个mounts命令
/container mounts
add dst=/etc/sing-box name=sing-box src=/docker/config/sing-box
然后使用winscp在ros系统的根目录下新建一个docker目录,再在docker目录下新建一个config目录,再在config目录下新建sing-box目录
也就是新建目录的结构为 /docker/config/sing-box
然后将sing-box的配置文件config.json修改其中的上外网的服务器信息后,上传到这个目录 /docker/config/sing-box 中
再执行下面这条将这个mount设置到sing-box容器的命令,否则sing-box容器启动时会报找不到config.json的错误
/container
add interface=veth1 logging=yes mounts=sing-box root-dir=/docker/sing-box workdir=/
然后最重要的一条命令,将所有的fake ip都路由到sing-box中ip中(本例是192.168.1.6)达到访问外网的目的
/ip route
add disabled=no distance=1 dst-address=198.18.0.0/15 gateway=192.168.1.6 pref-src="" routing-table=main scope=30 suppress-hw-offload=no target-scope=10
然后在ros系统的ip的dns中,将dns设置为空
也可不设置为空,我这里是为了确保能上外网时不受其他干扰
file:///C:/Users/xukon/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg
我这里只是抛转引玉,给出一个能跑通的配置文件,之后大家可以按需修改自己的配置文件,达到更好的使用效果。