Skip to content
/ seeker Public

通过使用 tun 来实现透明代理。实现了类似 surge 增强模式与网关模式。

License

Apache-2.0, MIT licenses found

Licenses found

Apache-2.0
LICENSE-APACHE
MIT
LICENSE-MIT
Notifications You must be signed in to change notification settings

gfreezy/seeker

Repository files navigation

Seeker

badge
badge

使用 Tun 实现透明代理(支持 Mac & Linux 系统),支持 TCP、UDP、ICMP(ping)。

Download

访问 https://github.com/gfreezy/seeker/releases 下载最新 release

chmod +x seeker-osx  # or  chmod+x seeker-linux

Usage

  1. 启动 seeker

    Seeker 0.5.0
    gfreezy <gfreezy@gmail.com>
    Tun to Shadowsockets proxy. https://github.com/gfreezy/seeker
    
    USAGE:
        seeker [FLAGS] [OPTIONS]
    
    FLAGS:
            --encrypt    Encrypt config file and output to terminal
        -h, --help       Prints help information
        -V, --version    Prints version information
    
    OPTIONS:
        -c, --config <FILE>              Sets config file. Sample config at
                                         https://github.com/gfreezy/seeker/blob/master/sample_config.yml
            --config-url <CONFIG_URL>    URL to config
            --key <KEY>                  Key for encryption/decryption
        -l, --log <PATH>                 Log file
        -u, --uid <UID>                  User id to proxy

    本地配置文件启动

    sudo seeker --config path/to/config.yml

    远程配置文件启动

    sudo seeker --config-url https://pastebin.com/raw/config --key encrypt-key

    生成远程配置文件

    sudo seeker --config path/to/config.yml --encrypt --key encrypt-key
  2. seeker 启动的时候会自动将本机 DNS 修改为 127.0.0.1,退出的时候将 DNS 设置为默认值

Config

  • seeker 直接使用的 clash 的规则。目前支持 DOMAIN DOMAIN-KEYWORD DOMAIN-SUFFIX MATCH 规则,不支持 IP 相关的规则。

  • 支持的 Action:

  • PROXY(proxy-group-name) 走 proxy-group-name 代理组

  • DIRECT 直连

  • REJECT 拒绝

  • PROBE(proxy-group-name) 默认尝试直连,如果超时,则走 proxy-group-name 代理组。

  • 确保系统没有重复的 tun_name

  • 确保 TUN 的网络 tun_iptun_cidr 与当前所处网络环境不在一个网段

  • seeker 支持 socks5 代理、http 代理和 shadowsocks 代理。优先级为 socks5 代理 > shadowsocks 代理 > http 代理。

  • redir 模式下使用 iptables 的 redirect 功能,只支持 tcp 流量。

服务器配置格式

seeker 支持两种服务器配置格式:

  1. Seeker 原生格式(使用 servers 字段):

    servers:
      - name: server-ss1
        addr: domain-to-ss-server.com:8388  # 也可以使用 server
        protocol: Shadowsocks                # 也可以使用 type
        method: chacha20-ietf                # 也可以使用 cipher
        password: password
  2. Clash 格式(使用 proxies 字段,与 servers 等价):

    proxies:
      - name: "[SS] Hong Kong-20"
        type: ss                             # 支持: ss, socks5, http, https
        server: fbxt0765gh0pielsss.ftisthebest.com
        port: 56020
        cipher: chacha20-ietf-poly1305
        password: e1v3fy6lnmh
        udp: true                            # 可选字段,会被忽略

两种格式可以混合使用,在同一个 servers (或 proxies) 列表中可以包含两种格式的配置。

注意:serversproxies 是同一个字段的不同名称(别名),不能在同一个配置文件中同时使用两者。

远程配置

seeker 提供两种方式从远程加载配置:

1. SS 订阅链接 (remote_config_urls)

在配置文件中使用 remote_config_urls 字段,从远程 URL 加载 Shadowsocks 服务器列表。支持标准 SS 订阅格式,兼容大多数 SS 服务商提供的订阅链接。

配置方式:

+

# 在配置文件中添加 SS 订阅地址
remote_config_urls:
  - https://your-ss-provider.com/subscription-url-1
  - https://your-ss-provider.com/subscription-url-2

订阅格式要求:

  • 远程 URL 返回的内容必须是 Base64 编码的文本

  • Base64 解码后,每行一个 ss:// 格式的 Shadowsocks URL

  • 示例原始内容(解码前):

    c3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2TVRFeEB0ZXN0LnNzLmNvbTozMDAwMi8jSEsrMDE=
    c3M6Ly9ZV1Z6TFRJMU5pMW5ZMjA2TVRFeEB0ZXN0LnNzLmNvbTozMDAwMy8jSEsrMDI=
  • 解码后内容:

    ss://YWVzLTI1Ni1nY206MTEx@test.ss.com:30002/#HK+01
    ss://YWVzLTI1Ni1nY206MTEx@test.ss.com:30003/#HK+02

工作流程:

  1. seeker 启动时自动从 remote_config_urls 拉取订阅内容

  2. Base64 解码后,解析每个 ss:// URL 为服务器配置

  3. 远程订阅的服务器会自动添加到本地 servers 列表中

  4. 本地配置和远程订阅的服务器会合并使用

示例:

+

# config.yml
dns_start_ip: 11.0.0.10
tun_ip: 11.0.0.1
# ... 其他配置 ...

# 本地服务器配置
servers:
  - name: local-socks5
    addr: 127.0.0.1:1080
    protocol: Socks5

# SS 订阅链接(会自动拉取并合并到 servers 中)
remote_config_urls:
  - https://your-ss-provider.com/subscribe

2. 加密配置文件 (--config-url)

使用命令行参数从远程 URL 加载完整的加密配置文件(整个 YAML 配置)。

使用方式:

+

# 1. 生成加密配置(使用 ChaCha20-IETF 加密)
seeker --config config.yml --encrypt --key mypassword > encrypted-config.txt

# 2. 将 encrypted-config.txt 上传到你的服务器
# 例如:https://your-server.com/encrypted-config.txt

# 3. 使用远程加密配置启动 seeker
sudo seeker --config-url https://your-server.com/encrypted-config.txt --key mypassword

特点:

  • 使用 ChaCha20-IETF 加密算法保护配置内容

  • 必须配合 --key 参数使用

  • 远程配置是完整的 YAML 配置文件(加密后 Base64 编码)

  • 适合需要保密配置的场景

超时配置

seeker 支持以下超时配置:

  • read_timeout: 首次读取数据的超时时间(默认 10 秒)。连接建立后,首次读取数据时使用此超时。

  • idle_timeout: 连接空闲超时时间(默认 300 秒)。连接建立后,后续读取数据时使用此超时。如果连接空闲时间超过此值,连接将被关闭。

  • write_timeout: 写入超时时间(默认 30 秒)。多久没有数据写入则认为超时。

  • connect_timeout: 连接超时时间(默认 100 毫秒)。

  • ping_timeout: ping 超时时间(默认 3 秒)。

  • probe_timeout: 探测超时时间(默认 3 秒)。用于 PROBE 规则判断是否走代理。

服务器切换优化

seeker 在代理组中自动选择最佳服务器时,采用以下优化策略以减少频繁切换:

  • 切换阈值: 新服务器分数需比当前服务器低 10% 以上才会切换,避免因微小差异频繁切换。

  • 最小切换间隔: 两次服务器切换之间至少间隔 60 秒,防止短时间内多次切换。

  • 连续失败保护: 只有连续失败 3 次才会触发服务器切换,避免因偶发错误导致不必要的切换。

这些优化确保了代理连接的稳定性,同时仍能在服务器真正出现问题时及时切换到更好的服务器。

Sample Config

里面有详细的配置文件说明。

支持的 method

Table
Plain

Aes128Cfb
Aes128Cfb1
Aes128Cfb8
Aes128Cfb128
Aes192Cfb
Aes192Cfb1
Aes192Cfb8
Aes192Cfb128
Aes256Cfb
Aes256Cfb1
Aes256Cfb8
Aes256Cfb128
Aes128Ctr
Aes192Ctr
Aes256Ctr

Camellia128Cfb
Camellia192Cfb
Camellia256Cfb
Camellia128Cfb1
Camellia192Cfb1
Camellia256Cfb1
Camellia128Cfb8
Camellia192Cfb8
Camellia256Cfb8
Camellia128Cfb128
Camellia192Cfb128
Camellia256Cfb128

Rc4
Rc4Md5

ChaCha20
Salsa20
XSalsa20
ChaCha20Ietf

Aes128Gcm
Aes256Gcm

ChaCha20IetfPoly1305
XChaCha20IetfPoly1305

Aes128PmacSiv
Aes256PmacSiv

⚠️使用 Socks5 或 http 代理服务器

使用 socks5 代理的时候,需要将所有直连的域名设置在配置文件里面,如果使用 ss 或者 vmess 之类的,需要将 ss 或 vmess server 的域名也加入配置文件。否则有可能会导致死循环,没法正常使用。

⚠️ http 代理只支持 CONNECT 协议,而且不支持 UDP 协议。

指定 IP 或某网段走代理

在配置文件中增加 IP-CIDR 规则即可。默认情况下 IP 都是是直连,所以只需要添加 PROXYPROBE。如下:

rules:
  - 'IP-CIDR,19.23.212.0/16,PROXY'
  - 'IP-CIDR,19.23.21.0/16,PROBE'

代理局域网内其他机器

  1. 打开 gateway_modegateway_mode 开启后, dns_server 会自动覆盖为 0.0.0.0:53

    gateway_mode: true
  2. 查看本地 IP

    ifconfig
  3. 打开希望走代理的手机或者电脑的网络设置,将 DNS网关 修改为步骤2获取到的 IP

重置 DNS 分配

rm -rf seeker.sqlite

FAQ

  1. If you encountered "seeker" cannot be opened because the developer cannot be verified., you can go to System PreferencesSecurity & PrivacyGeneral and enable any blocked app from Allow apps downloaded from pane at the bottom of the window.

  2. Ubuntu 提示 Address already used, 查看这里 https://unix.stackexchange.com/questions/304050/how-to-avoid-conflicts-between-dnsmasq-and-systemd-resolved

Build (latest stable)

git clone https://github.com/gfreezy/seeker.git
cd seeker
OPENSSL_STATIC=yes cargo build --release

编译完成后,程序在 target/release/seeker

musl 编译

docker run -v $PWD:/volume -e OPENSSL_STATIC=yes --rm -t clux/muslrust cargo build --release

会在 target/x86_64-unknown-linux-musl/release 目录下生成 seeker 文件。

ICMP (Ping) 支持

seeker 支持 ICMP Echo Request(ping)的透明代理。由于 seeker 使用 Fake IP 模式,直接 ping 域名会 ping 到 Fake IP(如 11.0.0.x),无法得到真实的 ping 结果。

seeker 通过以下方式解决这个问题:

  1. 当 TUN 设备收到 ICMP Echo Request 时,seeker 会拦截该请求

  2. 根据目标 Fake IP 查找对应的原始域名

  3. 解析域名获取真实 IP 地址

  4. 使用原始的 ICMP identifier 和 sequence number 向真实 IP 发送 ping 请求

  5. 真实服务器的响应会直接返回给发起 ping 的应用

这样,即使在透明代理模式下,ping github.com 也能正确返回 GitHub 服务器的真实响应时间。

实现原理

seeker 参考了 Surge for Mac 的实现原理,基本如下:

  1. seeker 会在本地启动一个 DNS server,并自动将本机 DNS 修改为 seeker 的 DNS 服务器地址

  2. seeker 会创建一个 TUN 设备,并将 IP 设置为 10.0.0.1,系统路由表设置 10.0.0.0/16 网段都路由到 TUN 设备

  3. 有应用请求 DNS 的时候, seeker 会为这个域名返回 10.0.0.0/16 网段内一个唯一的 IP

  4. seeker 从 TUN 接受到 IP 包后,会在内部组装成 TCP/UDP/ICMP 数据

  5. seeker 会根据规则和网络连接的 uid 判断走代理还是直连

  6. 如果需要走代理,将 TCP/UDP 数据转发到 SS 服务器/ socks5 代理,从代理接受到数据后,在返回给应用;如果直连,则本地建立直接将数据发送到目标地址

如何发布新版本

$ cargo install cargo-release
$ ./add-tag.sh

Github Action 会自动编译并发布新的 release。

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

About

通过使用 tun 来实现透明代理。实现了类似 surge 增强模式与网关模式。

Resources

License

Apache-2.0, MIT licenses found

Licenses found

Apache-2.0
LICENSE-APACHE
MIT
LICENSE-MIT

Stars

Watchers

Forks

Packages

No packages published

Contributors 5

Languages