跳转至

使用 sing-box 搭建 SS 节点

sing-box 是一个开源的、跨平台的通用代理与网络转发工具,常用于科学上网、流量分流、透明代理、流媒体解锁和多协议代理服务部署。它可以看作是新一代的高性能代理核心之一,设计目标是高性能、模块化、可扩展。它可以:

  • 作为代理客户端使用

  • 作为代理服务器部署

  • 做透明代理网关

  • 实现分流策略

  • 解锁流媒体

  • 构建家庭或服务器网络出口

本文主要介绍如何使用 sing-box 作为代理服务器,并部署一个 ss 节点。

1. 安装 sing-box

这里以 Redhat 系列发行版为例,更多平台安装方式,请参考 sing-box 官方文档,或之前讲 sing-box 作为代理客户端教程中 sing-box 安装部分。

对于 Redhat 系列发行版(Centos, Fedora, AlmaLinux, Rocky Linux 等)

sudo dnf config-manager addrepo --add-repo=https://sing-box.app/sing-box.repo
sudo dnf makecache
sudo dnf install sing-box

# 确认版本
sing-box version

# 设置为开机自启动
sudo systemctl enable --now sing-box.service

# 查看服务状态
systemctl status sing-box.service

# 如果启动过程中出现任何错误,查看日志并进行修复
journalctl -u sing-box

2. 配置 SS 代理服务器

sing-box 的配置文件位于 /etc/sing-box/config.json

安装后在默认的配置文件中已经为我们生成了一段 ss 代理服务器的配置,

你唯一要做的就是根据你的网络安全需求,修改其中的配置。

{
  "log": {
    "level": "info"
  },

  "inbounds": [
     {
      "type": "shadowsocks",
      "listen": "::",
      "listen_port": 8080,
      "network": "tcp",
      "method": "2022-blake3-aes-128-gcm",
      "password": "xxxxxddssdsfsfds==",
      "multiplex": {
        "enabled": true
      }
    }
  ],

  "outbounds": [
    {
      "type": "direct"
    }
  ]
}

唯一需要修改的是端口、加密方法、以及 password。

2.1. 端口配置

端口不难修改,但是需要注意在防火墙中放下端口,本文实验环境为 Redhat 系 linux, 所以需要使用 firewall-cmd 放行端口

sudo firewall-cmd --add-port=8080/tcp --permanent
sudo firewall-cmd --reload

如果你的服务器安装的是 debian 系 linux, 请使用 ufw 放行端口。

2.2. 加密方式(encryption)

这里对 SS 的加密方式先做一个简单介绍, 早期 SS 加密建立在 OpenSSL 的基础之上,使用 OpenSSL 提供的加密方式,例如:aes-256-cfb、aes-128-cfb、aes-256-ctr、rc4-md5、bf-cfb, 在当前网络环境下存在严重的问题,安全性逐渐不足、容易被流量识别,我们暂且称之为第一代加密方式,这种加密方式已经淘汰了,在各大代理客户端中已经很难找到这些加密选项了,在服务器中配置这些加密方式也会报错。

后来 Shadowsocks 引入 AEAD(Authenticated Encryption)代表算法,AES 系列:aes-128-gcm、aes-192-gcm、aes-256-gcm; ChaCha 系列、chacha20-ietf-poly1305、xchacha20-ietf-poly1305 可以同时做到加密和数据完整性校验(防篡改)这些加密算法依然是当前的主流。由于其流量特征已经能被 GFW 精准识别,但是在不过 GFW 的网络中这些算法仍然被大量使用。我们暂且称这类加密方式为为第二代加密方式。

在 2022 年推出的 Shadowsocks 2022 规范中定义了自己专用的加密方法,只用于 Shadowsocks 协议。2022-blake3-aes-128-gcm、2022-blake3-aes-256-gcm、2022-blake3-chacha20-poly1305 等等。主要解决长期存在的四个问题:密码长期不变带来的安全风险、nonce 使用风险、抗重放能力弱、高并发服务器性能问题。我们暂且称这类加密方式为为第三代加密方式。第三代加密方式在安全和性能方面做了很多加强,但是在扛抗封锁能力方面依然有待提高。

其名称中各字段的含义如下

2022        -> Shadowsocks 2022 新协议规范
blake3      -> 密钥派生函数(KDF)
aes-128-gcm -> 数据加密算法

在协议选择方面,第一代加密协议已经被淘汰,可以不做考虑; 第二代安全设计较旧,但是有广泛的客户端支持; 第三代在安全和性能方面有增强,但老客户端不支持。

本文主要针对自建节点,所以在可能的条件下尽量使用 2022-blake3-aes-128-gcm; 给别人用 aes-256-gcm 因为用户客户端五花八门; 手机用户 2022-blake3-chacha20-poly1305,ARM 上更快、省电、延迟低; 路由器透明代理:chacha20-ietf-poly1305 或者 2022-blake3-chacha20-poly1305 适合 CPU 较弱的场景。

为什么选 AES-128 而不是 256? AES-128 已经足够安全, 速度更高。

3. 设置密码

3.1. 如何生成 SS 密码

在 sing-box 中,可以直接使用 CLI 生成 Shadowsocks 密钥(密码),尤其是 SS 2022 需要使用固定长度的随机密钥,而不是普通字符串密码。

sing-box 提供内置生成工具:

sing-box generate rand --base64 16

# 或者

sing-box generate rand --base64 32

由于不同加密方式需要不同的密钥长度,AES-128-GCM(推荐)推荐使用第一种方式生成,AES-256 / ChaCha20 使用第二种方式生成。

参数含义:

rand        生成随机数据
--base64    输出为 base64 格式
16 / 32     原始字节长度

修改好以上配置后,使用sing-box check检查配置文件

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

然后重启

systemctl restart sing-box

此时即可使用代理客户端进行连接。如果连接过程中出现任何问题,可以查看客户端日志,服务端可以使用journalctl -u sing-box 查看错误日志。

测试

V2rayN 测试,将以下连接字符串中域名替换成真实域名,粘贴到 v2rayN 节点分组,然后测试节点真连接延迟:

别名:"ss-on-sing-box",
地址(address): "ss.example.top",
端口(port):"8080"
密码: "xxxxxddssdsfsfds==",
加密方式:"2022-blake3-aes-128-gcm",

如果使用 clash 系列客户端, 可以将以下配置中的 ss.example.top 替换成真实域名, 导入到客户端进行测试:

mixed-port: 7890
allow-lan: true
bind-address: '*'
mode: rule
log-level: info
external-controller: '127.0.0.1:9090'
dns:
    enable: true
    ipv6: false
    default-nameserver: [223.5.5.5, 119.29.29.29]
    enhanced-mode: fake-ip
    fake-ip-range: 198.18.0.1/16
    use-hosts: true
    nameserver: ['https://doh.pub/dns-query', 'https://dns.alidns.com/dns-query']
    fallback: ['https://doh-pure.onedns.net/dns-query', 'https://ada.openbld.net/dns-query', 'https://223.5.5.5/dns-query', 'https://223.6.6.6/dns-query']
    fallback-filter: { geoip: true, ipcidr: [240.0.0.0/4, 0.0.0.0/32] }
proxies:
    - { name: 'ss-on-sing-box', type: ss, server: ss.example.top, port: 8080, cipher: 2022-blake3-aes-128-gcm, password: xxxxxddssdsfsfds==, udp: true }

proxy-groups:
    - { name: ss-group, type: select, proxies: ['ss-on-sing-box'], url: 'http://www.gstatic.com/generate_204', interval: 86400 }
    - { name: 自动选择, type: url-test, proxies: ['ss-on-sing-box'], url: 'http://www.gstatic.com/generate_204', interval: 86400 }
    - { name: 故障转移, type: fallback, proxies: ['ss-on-sing-box'], url: 'http://www.gstatic.com/generate_204', interval: 7200 }
rules:
    - 'DOMAIN-SUFFIX,cn,DIRECT'
    - 'DOMAIN-KEYWORD,-cn,DIRECT'
    - 'GEOIP,CN,DIRECT'
    - 'MATCH,ss-group'

4. 参考文档



📅 Created 1 year ago ✏️ Updated 1 month ago

评论