xukongyang 发表于 2024-4-24 16:49

RouterOS配置Container容器安装Sing-Box实现单路由器上网

本帖最后由 xukongyang 于 2024-4-26 20:15 编辑

RouterOS配置Container容器安装Sing-Box实现单路由器上网
之前写过2篇 https://www.right.com.cn/forum/thread-8280032-1-1.htmlMikrotik HAP AX3 通过Container安装Frpc,Clash以及Yacd网页界面
https://www.right.com.cn/forum/thread-8281383-1-1.htmlMikrotik HAP AX3通过container运行clash透明网关,抛弃旁路由,单机自由上网
发现感兴趣的小伙伴还是挺多的,但是查看回复基本都在说第2篇看不懂,确实,步骤很复杂,我这个写作者,实践了好多次的都觉得复杂,所以我后面没有用ax3了,跳出了这个坑:)。
因为觉得还是mini小主机安装:pve+虚拟机跑chr版本的ros+Openwrt旁路由+AP(或无线网卡)的方案 适合我,mini小主机系统资源多、性能强、玩法多,能折腾。:)
但是为了某些情况下,就是不想多用设备,一个路由器解决上网问题,还是重新查资料,解决了使用只有RouterOS系统的单路由器,就能完成上内外网的需求:)
而且步骤非常简单,装好Container中的Sing-box后(本例中ip地址配置为192.168.1.6),RouterOS中只需要执行一行命令: /iprouteadd 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.3ros系统chr版本 ip地址 192.168.1.2配置给Container中的sing-box的虚拟网卡 veth1 地址为192.168.1.6sirpdboy的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镜像到本地sudodocker pull gzxhwq/sing-box:latest@sha256:6af40e97fc9ac4cca80f741ccafac63160f1c3fd2d9a9b47350b44f0917f9372
导出docker镜像为文件sudodocker save gzxhwq/sing-box>./sing-box-chr.tar
将生成的sing-box-chr.tar 上传到ros系统的根目录执行如下命令将docker镜像文件导入ros系统/container/add file=sing-box-chr.tar interface=veth1root-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 mountsadd 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的错误/containeradd interface=veth1 logging=yes mounts=sing-box root-dir=/docker/sing-box workdir=/然后最重要的一条命令,将所有的fake ip都路由到sing-box中ip中(本例是192.168.1.6)达到访问外网的目的 /ip routeadd 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 我这里只是抛转引玉,给出一个能跑通的配置文件,之后大家可以按需修改自己的配置文件,达到更好的使用效果。

lutao114 发表于 2024-4-25 02:44

只看到一个标题。标题党么

xukongyang 发表于 2024-4-25 16:43

没有,以为ros+sing-box能直接上内外网了,结果不行,帖子又删不掉,只能清除内容了

xukongyang 发表于 2024-4-25 16:46

lutao114 发表于 2024-4-25 02:44
只看到一个标题。标题党么

没有,以为ros单路由+容器sing-box就能直接上内外网了,结果不行,帖子又删不掉,只能清除内容了,那我就简单写下装Container容器的步骤吧。

lutao114 发表于 2024-4-25 16:59

xukongyang 发表于 2024-4-25 16:46 static/image/common/back.gif
没有,以为ros单路由+容器sing-box就能直接上内外网了,结果不行,帖子又删不掉,只能清除内容了,那我就 ...

刚搞定了克隆盘,准备物理机搞一下ros,也不知道为啥ros不在开启Docker时自己生成一个网桥,都要自己新建,我看别的帖子,指定IP和网关各种各样的,也不知道和ros的网络有啥关系没。
因为我在别的设备上搞容器,容器一般都是单独的类似172.0.0这种的IP段

xukongyang 发表于 2024-4-26 21:44

本帖最后由 xukongyang 于 2024-4-27 14:37 编辑

config.json 内容

{
    "log": {
      "level": "info",
      "timestamp": true
    },
    "dns": {
      "servers": [
            {
                "tag": "dns_proxy",
                "address": "https://1.1.1.1/dns-query",
                "address_resolver": "dns_resolver",
                "strategy": "ipv4_only",
                "detour": "proxy"
            },
            {
                "tag": "dns_direct",
                "address": "https://dns.alidns.com/dns-query",
                "address_resolver": "dns_resolver",
                "strategy": "ipv4_only",
                "detour": "proxy"
            },
            {
                "tag": "dns_resolver",
                "address": "223.5.5.5",
                "detour": "direct"
            }
      ],
      "rules": [
            {
                "outbound": "any",
                "server": "dns_resolver"
            },
            {
                "rule_set": "geosite-geolocation-!cn",
                "server": "dns_proxy"
            }
      ],
      "final": "dns_proxy"
    },
    "route": {
      "rule_set": [
            {
                "tag": "geosite-geolocation-!cn",
                "type": "remote",
                "format": "binary",
                "url": "https://raw.githubusercontent.com/SagerNet/sing-geosite/rule-set/geosite-geolocation-!cn.srs",
                "download_detour": "proxy"
            },
            {
                "tag": "geoip-cn",
                "type": "remote",
                "format": "binary",
                "url": "https://raw.githubusercontent.com/SagerNet/sing-geoip/rule-set/geoip-cn.srs",
                "download_detour": "proxy"
            }
      ],
      "rules": [
            {
                "protocol": "dns",
                "outbound": "dns-out"
            },
            {
                "port": 853,
                "network": "tcp",
                "outbound": "block"
            },
            {
                "port": [
                  443,
                  853
                ],
                "network": "udp",
                "outbound": "block"
            },
            {
                "type": "logical",
                "mode": "and",
                "rules": [
                  {
                        "rule_set": "geoip-cn",
                        "invert": true
                  },
                  {
                        "rule_set": "geosite-geolocation-!cn"
                  }
                ],
                "outbound": "proxy"
            },
            {
                "rule_set": "geoip-cn",
                "outbound": "direct"
            },
            {
                "ip_is_private": true,
                "outbound": "direct"
            }
      ],
      "final": "proxy",
      "auto_detect_interface": true
    },
    "inbounds": [
      {
            "type": "tun",
            "tag": "tun-in",
            "inet4_address": "192.168.1.1/30",
            //重要,修改为你自己的内网的网段,我家里是192.168.1.*的网段,所以这里写成192.168.1.1/30
            //如果是其他网段,估计写法是 *.*.*.1/30 的格式
            "inet6_address": "fd00::1/126",
            "mtu": 1492,
            "auto_route": true,
            "strict_route": true,
            "stack": "system",
            "sniff": true,
            "sniff_override_destination": false
      }
    ],
    "outbounds": [
            {
                "tag": "proxy",//重要,和上面配置的proxy名称一致
            "type": "hysteria2",//歇斯底里协议2
            "server": "1.2.3.4",
            "server_port": 5678,
            "up_mbps": 200,
            "down_mbps": 1000,
            "password": "Password",
            "tls": {
                "enabled": true,
                "server_name": "",
                "alpn": [
                  "h3"
                ],
            "insecure": true //重要,是否跳过证书验证,使用自己的签名时必须设置为ture
            }
      },
      /*
      {
            "tag": "proxy",
            "type": "shadowsocks",//丝丝协议
            "server": "1.2.3.4",
            "server_port": 5678,
            "method": "xchacha20-ietf-poly1305",
            "password": "Password"
      },
      */
      /*
      {
            "tag": "proxy",
            "type": "trojan",
            "server": "",
            "server_port": 443,
            "password": "",
            "tls": {
                "enabled": true,
                "server_name": "",
                "utls": {
                  "enabled": true,
                  "fingerprint": "chrome"
                }
            },
            "multiplex": {
                "enabled": true
            }
      },
      */
      /*
      {
            "tag": "proxy",
            "type": "vless",
            "server": "",
            "server_port": 443,
            "uuid": "",
            "tls": {
                "enabled": true,
                "server_name": "",
                "utls": {
                  "enabled": true,
                  "fingerprint": "chrome"
                },
                "reality": {
                  "enabled": true,
                  "public_key": "",
                  "short_id": ""
                }
            },
            "packet_encoding": "xudp",
            "transport": {
                "type": "grpc",
                "service_name": ""
            }
      },
      */
      {
            "type": "direct",
            "tag": "direct"
      },
      {
            "type": "block",
            "tag": "block"
      },
      {
            "type": "dns",
            "tag": "dns-out"
      }
    ],
    "experimental": {
      "cache_file": {
            "enabled": true,
            "path": "cache.db"
      }
    }
}

xukongyang 发表于 2024-4-26 21:46

本帖最后由 xukongyang 于 2024-4-26 22:28 编辑



http://rn-107.dynv6.net:81


config.json 配置文件实例 和 sing-box 的 chr 版本 和 arm64 版本的镜像文件我放到了上面的服务器,这台服务器2024年9月到期。

WeDone 发表于 2024-4-28 13:27

谢谢楼主,不过你这个方法到底是行还是不行,看你下面的楼层回复,我都懵逼了

谁谁 发表于 2024-4-26 13:27

值得实践一下,虽然我也是pve+ros+openwrt 的组合, pve里的ros里的container里,运行,总觉套娃很别扭,不过ros的container里也能做点其他的事情。 例如跑个alpine。

xukongyang 发表于 2024-4-26 13:27

WeDone 发表于 2024-4-28 13:27
谢谢楼主,不过你这个方法到底是行还是不行,看你下面的楼层回复,我都懵逼了 ...

行的,之前发的回复删除不掉清除不了,只能留下了

zhaofamily 发表于 2024-6-10 14:21

写的很好,不过还是更喜欢用xray,如果楼主也能出一个教程就好了

zswtc 发表于 2024-6-10 18:35

zhaofamily 发表于 2024-6-10 14:21
写的很好,不过还是更喜欢用xray,如果楼主也能出一个教程就好了

同样的想法.................

zhaofamily 发表于 2024-6-20 08:22

tun透明网关模式怎么实现

zyxl521 发表于 2024-8-11 10:59

配置文件在哪?

ziranww 发表于 2024-9-21 20:12

能用fake ip模式分流吗?
页: [1] 2
查看完整版本: RouterOS配置Container容器安装Sing-Box实现单路由器上网