5. 入站与流量接管#
入站决定流量如何进入 Link1。本章按从简单到高级的顺序介绍。
入站总览#
| 字段/配置 | 类型 | 适合场景 | 是否需要客户端显式配置 |
|---|---|---|---|
mixed-port | HTTP + SOCKS5 混合代理 | 本机浏览器、系统代理、局域网手动代理 | 需要 |
port | HTTP 代理 | 只需要 HTTP proxy 的客户端 | 需要 |
socks-port | SOCKS5 代理 | 支持 SOCKS5 的客户端 | 需要 |
redir-port | Linux REDIRECT 透明代理 | 路由器透明接管 TCP | 不需要 |
tproxy-port | Linux TPROXY 透明代理 | 路由器透明接管 TCP/UDP | 不需要 |
tun | 虚拟网卡 | 桌面端/路由器/移动端全局接管 | 不需要或由系统 VPN/TUN 配置 |
app-proxy | 应用透明代理 | 桌面端按应用/进程接管 | 不需要或由平台授权 |
listeners | 协议服务端 | Link1 作为 VLESS/Hysteria2 服务端 | 远端客户端需要配置协议 |
显式代理入口#
mixed-port#
mixed-port: 7890
含义:同一个端口同时接受 HTTP proxy 和 SOCKS5 请求。
实际影响:
- 最适合新手和桌面用户。
- 浏览器、系统代理、curl 都能用。
- 如果客户端是 SOCKS5,也可以连这个端口。
port#
port: 7891
含义:只开启 HTTP proxy 入口。
实际影响:
- 客户端必须使用 HTTP 代理协议。
- HTTPS 网站会通过 HTTP CONNECT 建立隧道。
socks-port#
socks-port: 7892
含义:只开启 SOCKS5 入口。
实际影响:
- 客户端可选择本地解析 DNS,或把域名交给 SOCKS5。
- 如果客户端把 IP 交给 Link1,域名规则可能无法命中。
监听地址与局域网访问#
allow-lan: true
bind-address: '*'
authentication:
- alice:password
skip-auth-prefixes:
- 127.0.0.1/32
lan-allowed-ips:
- 192.168.0.0/16
lan-disallowed-ips:
- 192.168.9.99/32
字段影响:
| 字段 | 含义 | 实际影响 |
|---|---|---|
allow-lan | 是否允许局域网访问显式代理入口 | false 更安全;true 才能给其他设备用 |
bind-address | 监听地址 | 127.0.0.1 仅本机;* / 0.0.0.0 对所有网卡开放 |
authentication | HTTP/SOCKS 用户名密码列表 | 客户端需要提供认证,格式 user:pass |
skip-auth-prefixes | 跳过认证的源 IP 段 | 常用于本机或可信内网 |
lan-allowed-ips | 允许访问的源 IP 段 | 缩小暴露面 |
lan-disallowed-ips | 禁止访问的源 IP 段 | 黑名单优先用于排除设备 |
透明代理入口#
透明代理让客户端无需手动设置代理,由系统路由或防火墙把流量送进 Link1。
redir-port#
redir-port: 7893
含义:Linux REDIRECT TCP 透明代理入口。
实际影响:
- 常用于 OpenWrt/路由器 TCP 透明代理。
- 需要 iptables/nftables 规则把 TCP 流量转到该端口。
- 主要处理 TCP,不是 UDP 的首选。
tproxy-port#
tproxy-port: 7894
含义:Linux TPROXY 透明代理入口。
实际影响:
- 更适合 TCP + UDP 透明代理。
- 需要 Linux policy routing 和 iptables/nftables 配合。
- 非 Linux 平台会在编译期拒绝。
与 TUN 的冲突#
如果启用 TUN 的 auto-route 或 auto-redirect,再同时使用 redir-port/tproxy-port,可能发生重复接管。Link1 会在配置编译阶段检查这类冲突。
应用透明代理 app-proxy#
app-proxy:
enable: true
bypass-self: true
fail-open: true
app-proxy 是面向桌面系统的按应用透明代理入口。它使用平台能力捕获应用发起的流量,把目标地址、进程名、进程路径、Bundle ID 等元数据交给 Link1 core,再由普通 rules 决定走哪个策略组或出站。
用户配置只感知 app-proxy 概念,不需要也不能指定底层 backend。Link1 会按运行平台选择内部实现:macOS/Darwin 使用 Network Extension,Windows 对齐 WinDivert,Linux 对齐 NFQUEUE。平台捕获层只负责把流量和进程元数据交给 core,不维护第二套规则引擎。
macOS App Proxy 需要宿主 App/Extension 具备 Apple Network Extension 相关 entitlement,例如 com.apple.developer.networking.networkextension 中的 App Proxy 能力。当前仓库的 Go core 已提供 app-proxy 接入、metadata 透传和自流量兜底保护;真正安装/授权 Network Extension 仍依赖 macOS App 打包与开发者账号配置。
字段影响:
| 字段 | 含义 | 默认/限制 |
|---|---|---|
enable | 开启应用透明代理 | 桌面平台可用;具体捕获能力取决于平台 bridge 是否随构建链接 |
bypass-self | 启用 Spark 自身流量兜底保护 | 默认 true;平台层仍应真正排除自身流量 |
fail-open | 平台 bridge 失败时优先恢复直连/网络可用 | 默认 true;具体行为取决于平台 bridge |
实际影响:
- 适合不想开全局 TUN、但希望按应用透明接管的桌面场景。
- 进程匹配仍写在
rules里,例如PROCESS-NAME、PROCESS-PATH;平台层不维护第二套规则引擎。
- 不能和
tun同时启用,避免同一流量被重复接管。
bypass-self是 core 侧防递归兜底:如果平台 bridge 漏掉 Spark 自身流量,Link1 会拒绝这类自捕获 flow,避免无限递归;真正的无感绕过仍需要平台 bridge 排除 Spark 进程。
- Windows 会使用 WinDivert 做 packet rewrite 并转入本地 app-proxy relay;需要管理员权限、可加载的 WinDivert 驱动/DLL。
- Linux 会使用 NFQUEUE + mark + REDIRECT 并转入本地 app-proxy relay;需要 root/CAP_NET_ADMIN、内核 NFQUEUE 支持和可用的
iptables。
TUN 入站#
TUN 创建一个虚拟网卡,让系统把 IP 包交给 Link1。
显式代理只接管“愿意使用代理”的应用;TUN 则更像在系统里插入一张虚拟网卡。系统把原本要发往外网的 IP 包先发给这张虚拟网卡,Link1 再根据 DNS、Sniffer、规则和策略组决定怎么出站。它适合不支持代理设置的应用、手机/桌面全局接管、路由器网关模式。
为什么 TUN 经常要配合 DNS 劫持和 Fake-IP#
初学者最容易遇到的问题是:TUN 开了,网页也能访问,但 DOMAIN-SUFFIX 规则不命中。原因是 TUN 层看到的天然是 IP 包,里面通常只有“目标 IP:端口”,不一定有原始域名。
DNS 劫持和 Fake-IP 的作用可以这样理解:
应用查询 www.example.com
-> Link1 DNS 返回一个 Fake-IP,例如 198.18.1.23
-> 应用连接 198.18.1.23:443
-> TUN 把连接交给 Link1
-> Link1 用 Fake-IP 映射表还原成 www.example.com
-> 域名规则可以命中
如果不接管 DNS,应用可能先从系统 DNS 拿到真实 IP,再直接把真实 IP 发进 TUN。Link1 仍然可以按 IP 规则处理,也可以尝试用 Sniffer 从 TLS SNI/HTTP Host/QUIC SNI 里补域名,但这不是每条连接都可靠:有些应用会加密 SNI、复用连接、直接访问 IP,或在 UDP/QUIC 阶段让嗅探失败。
因此,TUN 的推荐组合是:
dns.enable: true:让 Link1 负责 DNS。
dns.enhanced-mode: fake-ip:让域名和 Fake-IP 建立映射。
tun.dns-hijack: [any:53]:把设备发出的 DNS 查询导入 Link1。
sniffer.enable: true:作为补充,用连接内容辅助恢复域名,但不要把它当成 DNS 的替代品。
不适合 Fake-IP 的域名应写进 fake-ip-filter,例如路由器管理域名、局域网发现、打印机、投屏、.local / .lan 等。否则应用拿到 Fake-IP 后可能无法完成局域网发现。
最小 TUN 示例#
dns:
enable: true
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
tun:
enable: true
backend: auto
auto-route: true
auto-detect-interface: true
dns-hijack:
- any:53
TUN 核心字段#
| 字段 | 含义 | 实际影响 |
|---|---|---|
enable | 开启 TUN | 创建/使用虚拟网卡接管 IP 流量 |
backend | TUN 后端,auto/native/packet-tunnel | auto 会按平台选择;packet-tunnel 只适合 Darwin 平台 |
device | TUN 设备名 | Linux/native 常用;为空时平台可能自动命名 |
mtu | 虚拟网卡 MTU | 默认 1500;过大/过小会影响分片和吞吐 |
auto-route | 自动配置路由 | 让系统默认路由进入 TUN |
auto-detect-interface | 自动检测出口网卡 | 减少手写物理网卡名 |
strict-route | 更严格地约束路由 | 降低流量泄漏风险,但可能影响局域网访问 |
dns-hijack | 劫持 DNS 查询 | 让设备 DNS 进入 Link1,提高域名规则命中率 |
udp-timeout | UDP NAT 映射超时,秒 | 默认 300;影响 UDP 会话保持 |
endpoint-independent-nat | 端点独立 NAT | 改变 UDP NAT 复用语义 |
TUN 路由字段#
| 字段 | 含义 | 实际影响 |
|---|---|---|
route-address | 要接管的 CIDR | 只把这些目标网段导入 TUN |
route-exclude-address | 排除的 CIDR | 避免内网、保留地址或特殊服务走 TUN |
route-address-set | 引用 ipcidr 规则集作为接管网段 | 适合维护大量 CIDR |
route-exclude-address-set | 引用 ipcidr 规则集作为排除网段 | 适合维护大量排除 CIDR |
inet4-address / inet6-address | TUN 网卡自身地址 | 不写 IPv4 时会从 Fake-IP 网段推导 |
inet4-route-address / inet6-route-address | 按 IP 族接管路由 | 分开控制 IPv4/IPv6 |
inet4-route-exclude-address / inet6-route-exclude-address | 按 IP 族排除路由 | 分开控制 IPv4/IPv6 排除 |
默认排除会保护常见内网/保留地址,例如 10.0.0.0/8、192.168.0.0/16、127.0.0.0/8 等,避免把管理流量错误送入 TUN。
TUN 选择器字段#
这些字段只影响哪些本地流量进入 TUN,主要用于 Linux/Android:
| 字段 | 含义 |
|---|---|
include-interface / exclude-interface | 按网卡包含/排除 |
include-uid / include-uid-range | 按 UID 包含 |
exclude-uid / exclude-uid-range | 按 UID 排除 |
exclude-src-port / exclude-src-port-range | 按源端口排除 |
exclude-dst-port / exclude-dst-port-range | 按目标端口排除 |
include-android-user | Android 用户 ID 包含 |
include-package / exclude-package | Android 包名包含/排除 |
如果 auto-route=false,这些路由选择器会被归零或不生效,因为 Link1 不负责自动路由。
Linux policy routing 字段#
| 字段 | 含义 | 默认/限制 |
|---|---|---|
iproute2-table-index | Linux 路由表编号 | 默认 2022,不能用保留表 253/254/255 |
iproute2-rule-index | Linux rule 优先级 | 默认 9000 |
auto-redirect | 自动 redirect 规则 | Linux/Android 相关 |
auto-redirect-input-mark | 入站 mark | 默认跟 table index 相关 |
auto-redirect-output-mark | 出站 mark | 默认跟 table index 相关 |
auto-redirect-iproute2-fallback-rule-index | fallback rule index | 必须小于 iproute2-rule-index |
Sniffer#
Sniffer 从连接内容里识别域名。
sniffer:
enable: true
override-destination: true
force-dns-mapping: true
parse-pure-ip: true
sniff:
HTTP:
ports: [80, 8080]
override-destination: true
TLS:
ports: [443]
QUIC:
ports: [443]
force-domain:
- '+.example.com'
skip-domain:
- '+.lan'
skip-src-address:
- 192.168.0.0/16
字段影响:
| 字段 | 含义 |
|---|---|
enable | 开启嗅探 |
override-destination | 嗅探到域名后是否覆盖实际出站目标;关闭时仍可记录 SniffHost 供规则匹配/观测 |
force-dns-mapping | 尽量结合 DNS 映射恢复域名 |
parse-pure-ip | 是否解析纯 IP 目标 |
sniffing | 兼容字段,声明启用的嗅探协议 |
port-whitelist | 只在指定端口嗅探 |
sniff.HTTP/TLS/QUIC.ports | 分协议指定端口 |
force-domain | 命中已有目标域名时仍强制嗅探;不绕过 override-destination |
skip-domain | 跳过嗅探的域名模式 |
skip-src-address | 按源地址跳过 |
skip-dst-address | 按目标地址跳过 |
协议 listeners#
listeners 让 Link1 自己作为服务端接收协议连接。目前配置校验接受:mixed、http、socks、redir、tproxy、tun、vless、hysteria2。实际服务端协议重点是 VLESS 和 Hysteria2。
详见 出站协议配置:入站协议监听器。