Skip to content

分流控制

分流可以定义一组目标 IP 行为, 应用在一组客户端

有任何想法欢迎在此发布评论, 或者新建一个也是可以的: https://github.com/ThisSeanZhang/landscape/discussions/88

分流概述

  • Flow: 一组策略,拥有入口和出口,中文“流”
  • 入口: 一组内网客户端, 使用 IP 地址 + QoS 标识进行匹配
  • 出口: Docker 容器,之后将会增加多 WAN
  • 其他流:Flow 1~255,按入口规则匹配,匹配成功则进入此流
  • 默认流:Flow 0,所有未匹配的流量,默认进入此流
  • 流内规则匹配方式: 按照优先级,匹配上即发送至出口,后续规则不再进行匹配(只会与一条规则匹配上)

流 DNS 设置

  • 每一条DNS规则,可以指定上游DNS服务器,或域名重定向
  • 每一个Flow,拥有独立的DNS缓存
  • 任何Flow,应当至少有一条兜底DNS规则,用于配置上游默认 DNS 服务器

流出口设置

  • 默认流出口,在 Wan 网卡中设置中,开启 设置默认路由 选项即可
  • 其他流出口,在 流规则编辑 下方添加 分流出口规则

src 入口匹配规则设置

默认流 Flow 0 入口匹配规则设置

无需设置入口匹配规则,所有未匹配的流量都会进入默认流

其他流 Flow 1~255 入口匹配规则设置

通过侧边栏的 分流设置 进入配置,点击 加号 添加流

dst 目的匹配规则设置

默认流 Flwo 0 目的匹配规则 设置

通过主页右上方的 DNS卡片 进入配置
默认流

其他流 Flow 1~255 目的匹配规则 设置

通过侧边栏的 分流设置 进入配置

其他流

dst 目的匹配规则说明

  • 每个流中可添加DNS/IP 规则 共 2^16 条
  • 每个流拥有独立的 DNS 缓存
  • 可通过各流卡片上方的 DNS/目标IP 进行配置专属于该流的配置。

在 DNS / IP 中的每条规则拥有以下的 流量动作. 用于限制该组配置中的 入口流量 访问规则中的 目标 IP 时的动作( 对于DNS是域名查询后得到的地址 ).

以下的前提是建立在, 源 IP 匹配上了 该 Flow 的

其中

  • 无动作: 标识按照当前的 Flow 出口
  • 忽略 Flow 设置: 忽略当前 Flow 指定的出口, 将这个数据包按照默认行为进行处理
  • 禁止连接: 丢弃该数据包
  • 重定向至流: 使用另一个 Flow 的出口发送这个数据包

当前 Flow 的流量出口仅有 Docker 容器 (容器中的程序需要与接应程序配合使用), 当前还不支持 多WAN 作为流的出口.

Docker 容器作为流出口

  • 仅搭配 接应程序 进行打包的容器,可作为有效的流 出口容器
  • 可挂载任意程序在 /app/server 目录下作为 工作程序, 需要自行编写 /app/server/run.sh 脚本用于启动
  • 工作程序 需监听 12345 端口作为 tproxy 入口, 其他端口需要通过环境变量 LAND_PROXY_SERVER_PORT 修改 接应程序 默认监听端口
  • 接应程序 会将待处理流量转发到 工作程序 的 tproxy 入口
  • landscape 0.6.7+ 版本容器出口默认为 Flow 0 出口

接应程序(镜像)

项目提供了一个 测试接应程序 以便进行测试, 装有 接应程序 的镜像在此:

如果使用 UI 上的镜像运行界面运行, 记得点击按钮, 将会添加一个 label. (手动添加一个也可以, 后台运行时会自动添加,下方手动运行需要的设置)

当使用 UI 进行启动,并点击 label 添加后可以忽略, 如果使用第三方或者手动启动则需要注意添加以下参数:

  • docker run
shell
docker run -d \
  --name your_service \
  --sysctl net.ipv4.conf.lo.accept_local=1 \
  --cap-add=NET_ADMIN \
  --cap-add=BPF \
  --cap-add=PERFMON \
  --privileged \
  -v /root/.landscape-router/unix_link/:/ld_unix_link/:ro \ # 必要映射
  # 可挂载 任意工作程序及其启动脚本等所需文件
  ghcr.io/thisseanzhang/landscape-edge:amd64-xx # xx需修改为合适版本
  • compose
yaml
services:
  your_service:
    image: ghcr.io/thisseanzhang/landscape-edge:amd64-xx # xx需修改为合适版本
    sysctls:
      - net.ipv4.conf.lo.accept_local=1
    cap_add:
      - NET_ADMIN
      - BPF
      - PERFMON
    privileged: true
    volumes:
      - /root/.landscape-router/unix_link/:/ld_unix_link/:ro # 必要映射
      # 可挂载 任意工作程序及其启动脚本等所需文件

默认设置下, 容器有一个演示工作程序 放置在 /app/server 监听 12345 端口作为tproxy入口。

接应程序 是放置在 /app, 默认情况下是会将待处理流量转发到,演示 工作程序 监听端口 12345的tproxy入口。 可以通过设置容器的环境变量改变监听端口: LAND_PROXY_SERVER_PORT

可将需要的 工作程序 挂载在 /app/server 目录下以替换 演示工作程序,将 工作程序 启动脚本挂载为 /app/server/run.sh/app/start.sh 默认会去执行/app/server/run.sh以启动 工作程序演示工作程序

/app/start.sh 文件(非 工作程序 启动脚本)

测试接应程序镜像中已包含,无需自行添加/挂载

bash
#!/bin/bash

ip rule add fwmark 0x1/0x1 lookup 100
ip route add local default dev lo table 100

/app/server/run.sh /app/server &
/app/redirect_pkg_handler &

wait

分流在代码中的流程示意图