Alpine 安装 sing-box-server 并支持 tcp-brutal

在 Alpine Linux 上从 Edge community 临时安装 sing-box,编译加载 tcp-brutal,并配置 VLESS Reality 服务端。

本文记录在 Alpine Linux 上搭建 sing-box 服务端的完整流程:从 Edge community 临时安装 sing-box,编译并加载 tcp-brutal 内核模块,然后配置 VLESS Reality 入站。

本文不需要申请域名证书,Reality 会伪装到指定的 TLS 站点,例如 mirrors.kernel.org

一、准备系统和组件

建议使用 Alpine virt 内核环境,并以 root 用户执行下面的命令。

先安装基础工具:

apk update
apk add curl wget bash vim nano jq openssl ca-certificates iproute2

从 Edge community 临时安装 sing-box。这种方式只对本次安装使用 Edge community,避免把系统仓库永久混用。

apk update
apk add --repository http://dl-cdn.alpinelinux.org/alpine/edge/community sing-box

设置 sing-box 开机自启:

rc-update add sing-box default

确认版本:

sing-box version

二、升级 virt 内核

安装 tcp-brutal 前,先确保包索引是最新的,并升级 virt 内核:

apk update
apk add --upgrade linux-virt

升级内核后必须重启。否则系统仍然运行旧内核,后面编译或加载模块时容易失败。

reboot

重启后确认当前内核:

uname -r

三、安装编译依赖

重启进入新内核后,安装编译工具链、内核头文件和 Git:

apk update
apk add build-base linux-virt-dev git sudo

如果你的内核不是 virt,需要安装与当前内核匹配的 linux-*-dev 包。可以先看当前内核:

uname -r

例如内核名称里带 virt,就安装:

apk add linux-virt-dev

四、下载并编译 tcp-brutal

使用 Git 下载项目源码:

git clone https://github.com/apernet/tcp-brutal.git
cd tcp-brutal
git pull origin master

项目主分支可能是 mainmaster,如果 master 拉取失败,可以直接运行:

git pull

编译并加载模块:

make
make load

make 会生成 brutal.komake load 会把模块加载到当前系统。

五、检查 brutal 模块

检查 brutal 模块是否已经加载:

lsmod | grep brutal

查看当前可用的拥塞控制算法:

sysctl net.ipv4.tcp_available_congestion_control

输出里应该能看到 brutal

也可以看内核日志:

dmesg | grep -i brutal

六、设置 brutal 开机自动加载

tcp-brutal 源码目录下执行:

mkdir -p /lib/modules/$(uname -r)/extra
cp brutal.ko /lib/modules/$(uname -r)/extra/brutal.ko
depmod -a

写入 /etc/modules,让系统启动时自动加载:

echo "brutal" >> /etc/modules
cat /etc/modules

重启后再次检查:

lsmod | grep brutal
sysctl net.ipv4.tcp_available_congestion_control

如果能看到 brutal,说明开机自动加载配置成功。

七、生成 Reality 所需参数

下面这些值不要直接复制别人的,要在自己的服务器上生成。

生成 UUID:

sing-box generate uuid

生成 Reality 密钥对:

sing-box generate reality-keypair

输出示例类似:

PrivateKey: YOUR_REALITY_PRIVATE_KEY
PublicKey: YOUR_REALITY_PUBLIC_KEY

服务端配置只填写 PrivateKey,客户端连接时填写 PublicKey

生成 short ID:

openssl rand -hex 8

你最终会得到三类参数:

UUID:             YOUR_UUID
Reality private:  YOUR_REALITY_PRIVATE_KEY
Reality public:   YOUR_REALITY_PUBLIC_KEY
Short ID:         YOUR_SHORT_ID

八、编写 sing-box 配置

进入配置目录:

mkdir -p /etc/sing-box /var/lib/sing-box
cd /etc/sing-box

备份原配置:

cp -a config.json config.json.bak 2>/dev/null || true

编辑配置文件:

vim /etc/sing-box/config.json

写入下面的配置,并替换其中的占位符:

  • YOUR_UUID:替换为 sing-box generate uuid 生成的 UUID
  • YOUR_REALITY_PRIVATE_KEY:替换为 sing-box generate reality-keypair 生成的 PrivateKey
  • YOUR_SHORT_ID:替换为 openssl rand -hex 8 生成的 short ID
  • mirrors.kernel.org:可以按需替换为其他 Reality 伪装目标站点
{
  "log": {
    "level": "warn",
    "timestamp": true
  },
  "inbounds": [
    {
      "type": "vless",
      "tag": "vless-reality-in",
      "listen": "::",
      "listen_port": 443,
      "users": [
        {
          "uuid": "YOUR_UUID",
          "flow": ""
        }
      ],
      "tls": {
        "enabled": true,
        "server_name": "mirrors.kernel.org",
        "reality": {
          "enabled": true,
          "handshake": {
            "server": "mirrors.kernel.org",
            "server_port": 443
          },
          "private_key": "YOUR_REALITY_PRIVATE_KEY",
          "short_id": ["YOUR_SHORT_ID"]
        }
      },
      "multiplex": {
        "enabled": true,
        "padding": true,
        "brutal": {
          "enabled": true,
          "up_mbps": 900,
          "down_mbps": 900
        }
      }
    }
  ],
  "outbounds": [
    {
      "type": "direct",
      "tag": "direct"
    },
    {
      "type": "block",
      "tag": "block"
    }
  ],
  "route": {
    "rules": [
      {
        "inbound": "vless-reality-in",
        "action": "sniff",
        "timeout": "300ms"
      },
      {
        "ip_is_private": true,
        "outbound": "block"
      },
      {
        "rule_set": ["geoip-cn", "geosite-cn"],
        "outbound": "block"
      }
    ],
    "rule_set": [
      {
        "tag": "geoip-cn",
        "type": "remote",
        "format": "binary",
        "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geoip/cn.srs",
        "download_detour": "direct",
        "update_interval": "7d"
      },
      {
        "tag": "geosite-cn",
        "type": "remote",
        "format": "binary",
        "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geosite/cn.srs",
        "download_detour": "direct",
        "update_interval": "7d"
      }
    ],
    "final": "direct"
  },
  "experimental": {
    "cache_file": {
      "enabled": true,
      "path": "/var/lib/sing-box/cache.db"
    }
  }
}

九、检查配置并启动服务

检查配置文件是否正确:

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

启动服务:

rc-service sing-box start

查看服务状态:

rc-service sing-box status

查看日志:

tail -f /var/log/messages

确认 443 端口监听:

ss -lntup | grep ':443'

如果机器有防火墙或云服务器安全组,记得放行 TCP 443

十、客户端需要填写的参数

客户端配置时,常用参数如下:

协议:VLESS
地址:你的服务器 IP 或域名
端口:443
UUID:YOUR_UUID
TLS:Reality
SNI / Server Name:mirrors.kernel.org
Public Key:YOUR_REALITY_PUBLIC_KEY
Short ID:YOUR_SHORT_ID
Flow:留空
Mux / Multiplex:开启
Brutal:按客户端支持情况开启

注意:服务端配置里放的是 Reality PrivateKey,客户端配置里放的是 Reality PublicKey,不要写反。

十一、常见排查

如果 sing-box 启动失败,先检查配置:

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

如果 443 端口被占用:

ss -lntup | grep ':443'

如果 brutal 没有出现在拥塞控制列表里:

lsmod | grep brutal
uname -r
apk info | grep linux

通常是当前运行内核和安装的 linux-virt-dev 版本不匹配,或者升级内核后没有重启。