OpenWrt + olcRTC:在白色列表限制下通过 LTE 实现稳定上网

显示原文

OpenWrt + olcRTC + Sing-box:LTE稳定互联网

适用于以下情境的实用设置没有有线互联网,仅有LTE通信,传统的VPN/VLESS配置不稳定,且需要多个设备同时正常上网,包括通过企业VPN运行。

这不是通用的说明,也不是“适合所有场合的正确架构”。以下是我目前运行的具体配置,可以作为起点。

您可以支持:

  • BTCbc1q6r9tdctf2wjrhj03w0u8lrg3gs2m8fkvcv4953
  • USDT(TRC20)TK29wf2q2pBtm4rFDPkVqfBoNKdKR7qMXS
  • ETH0x6e6ec7Bea1dF21f836310EB6B86D26738907A382
  • 土壤E1GPt8SGKLamSPiRRDFzSSdcwKgjop766bVbYoPw6sGx

您可以通过评论或Telegram联系:@swekonstantin

问题

我到达村庄时,没有有线互联网,只有LTE。

白名单不再关闭——耐心点,矮人们。

VLESS 配置经常失败且工作不稳定。同时,你需要访问普通互联网,以免使用 VK 导致疯狂,工作时也需要。

除了互联网接入本身,我还想解决几个问题。

企业VPN

企业VPN尤其不方便:

  • 在已有绕过之上搭建复杂的企业VPN;
  • 同一台机器上的两个VPN并不能很好地连接;
  • 手动配置路线和隧道——出血;
  • 由于多个隧道层同时工作,连接变得不稳定。

我希望这个装置能不知道绕行路的存在,企业VPN也像往常一样连接。

连接新设备

另一个问题是那些尚未配置VPN或根本无法安装VPN的设备。

比如,我曾经重置手机,无法正常进行初始设置,除非连接工作Wi-Fi。

此外:

  • 并非所有设备都有最新的VPN客户端;
  • 每换一台新设备,你都必须重复配置;
  • 有些物联网/嵌入式设备只能做普通的Wi-Fi。

因此,我想把所有逻辑都放在路由器上。

经济

某个时候,我有4 个并发VPN订阅.

每个服务设置都有些不同,且时不时会掉下来。一个在工作时,其他的都处于空闲状态。

总共,我花了大约每月1500₽仅限VPN订阅。

现在固定成本主要是租用VPS。

发生了什么

目前情况:

  • 设备连接到Wi-Fi无需客户端额外设置;
  • 关于同时使用5个设备使用外交服务;
  • 除了连接,你还可以连接企业VPN:
    • WireGuard;
    • 基于IPsec的L2TP;
    • 其他VPN;
  • 如有需要,也可以使用 VLESS 服务器;
  • 初始投资——大约每台路由器5000₽加上VPS租赁;
  • 在稳定性方面,该方案并不比之前的基于CDN的爬虫更差。

从客户的角度看,一切看起来都很简单:

Устройство
    │
    │ Wi-Fi
    ▼
OpenWrt Router
    │
    ├── sing-box
    │      │
    │      ▼
    │    SOCKS5
    │      │
    │      ▼
    └── olcRTC
           │
           │ WebRTC / Telemost
           ▼
          VPS
           │
           ▼
        Internet

已知问题 / 待办事项

解决方案还不理想。

UDP、ICMP和DNS

有时会出现以下问题:

  • UDP;
  • ICMP;
  • DNS流量。

很可能问题出在我目前的路由器配置上。到目前为止,我对此没什么问题,因为有个简单的辅助工具。

拐杖:在有问题的设备上连接另一个VPN。

MetricRTC и WebRTC

olcRTC会定期掉落。

到目前为止,我认为这有两个原因:

  1. 仪器本身的wicode;
  2. WebRTC提供商的功能。

olcRTC的尺寸

olcRTC结果发现这是一个相当大的二元。

你需要考虑如何减少路由器的体积和资源消耗。

也许将来我会专门为嵌入式/OpenWrt场景做一个轻型分支。

你需要什么

下面我会描述只有你自己的设备.你可以专注于它,或者尝试重复它。

组成部分 我用的是什么
路由器 Cudy TR3000 256 MB v1,中文版
操作系统 OpenWrt 25.12.5
交通 olcRTC
布线 sing-box 1.13.18
互联网 通过安卓LTE / USB网络
VPS 2 vCPU / 4 GB 内存
附加内容 安卓手机+USB线缆

我的叉子olcRTC:

https://github.com/jojopko/olcrtc

Cudy TR3000 的 OpenWrt 说明:

https://openwrt.org/toh/cudy/tr3000

在设置过程中,最好能有某种形式的WAN访问权限。

如果无法使用,可以提前在其他设备上下载包和二进制文件,然后通过以下方式传输到路由器scp.

VPS要求

我有一个VPS:

2 vCPU
4 GB RAM

中央处理器

2+ vCPU 是理想的。

这对Yandex Telebridge很重要,因为处理器需要处理/解码帧。

内存

4GB 一个olcRTC多余。

如果服务器上其他方法都不行:

1 GB RAM — скорее всего достаточно
2 GB RAM — более чем достаточно

我觉得为了这个设置,没必要专门占用超过2GB。

安装

1. 安装OpenWrt

如何在Cudy TR3000上安装OpenWrt:

https://openwrt.org/toh/cudy/tr3000

我用的是:

OpenWrt 25.12.5

2. 必需套餐

以下是我需要的包裹清单。

也许他忘了什么。

sudo-1.9.17_p2-r3.apk

kmod-mii-6.12.94-r1.apk
kmod-usb-net-cdc-ether-6.12.94-r1.apk
kmod-tun-6.12.94-r1.apk
kmod-usb-net-rndis-6.12.94-r1.apk
kmod-usb-net-6.12.94-r1.apk

如果路由器处于完全的BS状态,无法下载依赖,你可以提前从这里下载这些包:

https://downloads.openwrt.org/releases/25.12.5/packages/

例如:

curl -LO https://downloads.openwrt.org/releases/25.12.5/packages/aarch64_cortex-a53/base/ca-bundle-20260601-r1.apk

3. 安装合唱盒

sing-box可在OpenWrt仓库中找到。

我更喜欢用现成的二进制。如果你愿意,也可以自己组装。

关于ARM64:

curl -fLO "https://github.com/SagerNet/sing-box/releases/download/v1.13.18/sing-box-1.13.18-linux-arm64-musl.tar.gz"

使用的版本:

sing-box 1.13.18

4. 将文件传输到路由器

文件可以通过以下方式传输scp.

没有-O,很可能不会成功:

scp -O  root@192.168.1.1:/tmp/

之后,手动安装APK:

apk --no-network --allow-untrusted add 

USB互联网设置

如果互联网出现,本节是必需的:

  • 通过USB网络连接安卓手机;
  • 或者通过兼容的USB/SIM调制解调器。

创建接口android:

uci set network.android=interface
uci set network.android.proto='dhcp'
uci set network.android.device='usb0'
uci commit network

将接口添加到防火墙区域:

uci add_list firewall.@zone[1].network='android'
uci commit firewall

重启网络和防火墙:

/etc/init.d/network restart
/etc/init.d/firewall restart

检查界面

ifstatus android

JSON必须具备:

{
  "up": true
}

检查路由

默认路线也应该通过usb0.

route show default

示例:

default via 192.168.156.48 dev usb0 src 192.168.156.92
172.19.0.0/30 dev singtun0 scope link src 172.19.0.1
192.168.1.0/24 dev br-lan scope link src 192.168.1.1
192.168.156.0/24 dev usb0 scope link src 192.168.156.92

之后,试试:

ping <какой-нибудь-доступный-хост>

或者发送常规的 HTTP 请求。

如果:

  • 手机数据已开启。
  • 互联网在手机本身上运行;
  • USB连接已激活;

那么路由器也必须能够访问网络。

安装olcRTC和单声盒

双人组:

olcrtc
sing-box

输入:

/usr/bin/

配置:

/etc/olcrtc/config.yaml
/etc/sing-box/config.json

olcRTC 配置

我的DNS操作很奇怪。

我用的是DNS,它能通过/etc/resolv.conf.

Yandex DNS:

77.88.8.8

虽然有效,但有些外国网站会穿透它。

谷歌DNS:

8.8.8.8

在BS的条件下,很可能在任何地方都行不通。

olcRTC 的独立用户

我建议跑步olcRTC代表个人用户。

这允许你在sing-box并避免交通环线olcRTC又掉进了同一条隧道。

创建用户,例如:

olcrtc

并且记住它UID.

接下来,该UID将在以下情况下被需要:

"exclude_uid": [
  1001
]

示例/etc/olcrtc/config.yaml

mode: cnc

auth:
  provider: telemost

room:
  id: "room_id"

crypto:
  key: "secret_key"

net:
  transport: vp8channel

  # DNS-варианты:
  # dns: "77.88.8.8:53"
  # dns: "8.8.8.8:53"

  dns: "192.168.156.48:53"

liveness:
  interval: 10s
  timeout: 15s
  failures: 4

socks:
  host: "127.0.0.1"
  port: 8808
  user: "admin"
  pass: "1111"

vp8:
  fps: 30
  batch_size: 64

debug: false

data: data/

单盒配置

在这种情况下,务必用与你的网络相关的DNS替换DNS。

我查看了以下DNS地址:

/etc/resolv.conf

伐木

在初始设置时,安装:

"level": "info"

或者:

"level": "debug"

但经过测试后,最好切换到:

"level": "warn"

或者:

"level": "error"

否则,木头很快就会被垃圾堵塞。

错误依然可见。

exclude_uid

参数:

"exclude_uid": [
  1001
]

必须包含其代表工作的用户的UIDolcRTC.

这是必要的,以确保交通本身olcRTC没有被驱回sing-box而且没有循环。

SOCKS出站

确保连接设置在outbounds匹配配置中的SOCKS设置olcRTC.

也就是说,这些值为:

127.0.0.1
8808
admin
1111

两个配置都必须匹配。

示例/etc/sing-box/config.json

{
  "log": {
    "level": "warn",
    "timestamp": true
  },

  "dns": {
    "servers": [
      {
        "type": "udp",
        "tag": "dns-direct",
        "server": "192.168.156.48",
        "server_port": 53,
        "bind_interface": "usb0"
      }
    ],
    "final": "dns-direct",
    "strategy": "ipv4_only"
  },

  "inbounds": [
    {
      "type": "tun",
      "tag": "tun-in",
      "interface_name": "singtun0",
      "address": [
        "172.19.0.1/30"
      ],
      "mtu": 1500,
      "auto_route": true,
      "auto_redirect": true,
      "strict_route": true,
      "stack": "system",

      "exclude_uid": [
        1001
      ],

      "route_exclude_address": [
        "192.168.0.0/16"
      ]
    }
  ],

  "outbounds": [
    {
      "type": "socks",
      "tag": "olcrtc",
      "server": "127.0.0.1",
      "server_port": 8808,
      "username": "admin",
      "password": "1111",
      "version": "5",
      "network": "tcp"
    },

    {
      "type": "direct",
      "tag": "direct",
      "bind_interface": "usb0"
    }
  ],

  "route": {
    "rules": [
      {
        "port": 53,
        "action": "hijack-dns"
      },

      {
        "ip_is_private": true,
        "action": "route",
        "outbound": "direct"
      },

      {
        "network": "udp",
        "action": "route",
        "outbound": "direct"
      },

      {
        "network": "tcp",
        "action": "route",
        "outbound": "olcrtc"
      }
    ],

    "final": "direct"
  }
}

手动启动

在创建系统服务之前,最好先手动检查所有内容。

运行olcRTC

sudo -u olcrtc /usr/bin/olcrtc /etc/olcrtc/config.yaml

检查单盒配置

sing-box check -c /etc/sing-box/config.json

如果没有错误:

sing-box run -c /etc/sing-box/config.json

之后,连接路由器的Wi-Fi,检查网络接入情况。

配置系统服务

如果手动启动没问题,那么把两个进程都转为OpenWrt服务是合理的。

然后他们会:

  • 路由器开机后自动启动;
  • 无需主动SSH/shell会话即可工作;
  • 跌落后自动重启;
  • 写stdout以及stderr系统日志。

配置前,确保手动启动的进程已停止:

ps w

单曲盒服务

创建文件:

vi /etc/init.d/sing-box

目录:

#!/bin/sh /etc/rc.common

START=95
STOP=10
USE_PROCD=1

PROG="/usr/bin/sing-box"
CONFIG="/etc/sing-box/config.json"

start_service() {
    procd_open_instance

    procd_set_param command "$PROG" run -c "$CONFIG"

    # threshold timeout retry
    procd_set_param respawn 3600 5 5

    procd_set_param file "$CONFIG"

    procd_set_param stdout 1
    procd_set_param stderr 1

    procd_close_instance
}

reload_service() {
    stop
    start
}

service_triggers() {
    procd_add_reload_trigger "sing-box"
}

使可执行文件:

chmod +x /etc/init.d/sing-box

开启自动播放:

/etc/init.d/sing-box enable

启动:

/etc/init.d/sing-box start

olcRTC服务

我们创造:

vi /etc/init.d/olcrtc

目录:

#!/bin/sh /etc/rc.common

START=95
STOP=10
USE_PROCD=1

start_service() {
    procd_open_instance

    procd_set_param command /usr/bin/olcrtc /etc/olcrtc/config.yaml

    procd_set_param user olcrtc

    procd_set_param respawn 3600 5 5

    procd_set_param stdout 1
    procd_set_param stderr 1

    procd_close_instance
}

使可执行文件:

chmod +x /etc/init.d/olcrtc

开启自动播放:

/etc/init.d/olcrtc enable

启动:

/etc/init.d/olcrtc start

验证

两项服务上线后:

ps w

我们检查以下方法是否有效:

olcrtc
sing-box

如有必要,查看系统日志:

logread

或过滤特定工艺:

logread | grep sing-box
logread | grep olcrtc

进一步说明:

  1. 将设备连接到Wi-Fi;
  2. 我们不在客户端启用任何VPN;
  3. 开设必要的外交服务;
  4. 查查常规网络;
  5. 如果有必要,可以在此基础上连接一个企业VPN。

如果一切都设置得当,应该能正常工作。

稳定性特征

实际上,我注意到发射后最初几分钟可能会出现一些不稳定。

过一段时间,这种联系通常会对齐。

此外,连接新设备时有时会出现短暂中断,之后网络又会变得相对稳定。

一个有趣的观察:连接额外的VPN已经是在你的电脑上它几乎完全解决了不稳定的问题。

缺点是延迟会增加。

目前,我猜原因可能是在这种情况下,从外部网络角度看,大多数请求都指向一个IP地址,但目前尚无定论。

最终方案

                         ┌──────────────────────┐
                         │         VPS          │
                         │                      │
                         │    olcRTC server     │
                         └──────────▲───────────┘
                                    │
                                    │ WebRTC
                                    │
                         ┌──────────┴───────────┐
                         │  LTE (белые списки)  │
                         └──────────▲───────────┘
                                    │
                                    │ usb0
                                    │
┌─────────────┐          ┌──────────┴───────────┐
│  Laptop     │          │      OpenWrt         │
│             │── Wi-Fi ─▶                      │
│ Corp. VPN   │          │  sing-box            │
└─────────────┘          │      │               │
                         │      ▼ SOCKS5        │
┌─────────────┐          │    olcRTC            │
│   Phone     │── Wi-Fi ─▶                      │
└─────────────┘          └──────────────────────┘

这个设定的主要想法是把整整一轮送去路由器.

同时,客户端设备接收常规Wi-Fi,无需知道流量如何进一步传达全球网络。

结果如何

对于大约5000 ₽ 初始投资于路由器以及我买到的一个VPS的成本:

  • 所有家庭设备的单一网关;
  • 每台设备都缺乏VPN客户端;
  • 在该方案基础上安全使用企业VPN的能力;
  • 连接无法安装VPN的设备的能力;
  • 减少每月开销;
  • 即使在LTE和有限的网络接入条件下,稳定性也算可接受。

虽然不完美,但对我来说,这比分开多个VPN订阅明显好得多。

您可以支持:

  • BTCbc1q6r9tdctf2wjrhj03w0u8lrg3gs2m8fkvcv4953
  • USDT(TRC20)TK29wf2q2pBtm4rFDPkVqfBoNKdKR7qMXS
  • ETH0x6e6ec7Bea1dF21f836310EB6B86D26738907A382
  • 土壤E1GPt8SGKLamSPiRRDFzSSdcwKgjop766bVbYoPw6sGx

您可以通过评论或Telegram联系:@swekonstantin

有用链接

添加评论
点赞收藏
点踩分享查看原文
评论
?
参与讨论