sing-box
前言
sing-box 以“简洁、强大、灵活”为核心理念,支持多种协议(如 VLESS、VMess、Trojan、Shadowsocks、HTTP、SOCKS 等),并提供 DNS 增强、规则路由、透明代理、TUN 模式等高级功能。其配置采用清晰的 JSON 格式,易于理解与维护;同时支持 Windows、macOS、Linux、Android、iOS 等主流操作系统,真正实现“一套配置,全平台通行”。
我们这里就以在基于alpine的lxc容器搭建sing-box服务端为示例。
pve创建lxc容器
首先,我们需要一个干净的 Alpine Linux 容器。
- 在 PVE Web 界面中,创建一个新的LXC容器。
- 模板: 选择最新的
alpine-....-default模板。 - 资源:
- 磁盘:
1GB 就绰绰有余。 - CPU:
1核心。 - 内存:
128MB 或256MB 即可。
- 磁盘:
- 网络: 静态IPv4,
192.168.x.x/24;IPv6选择SLAAC。 - 创建并启动容器。
安装sing-box
更新,安装工具
1 | # 更新软件包源 |
1 | # 下载 Sing-box 压缩包 (请将下面的链接替换为GitHub上最新的版本) |
配置文件
1 | mkdir -p /etc/sing-box/ |
配置文件示例:
wireguard
1 | { |
hysteria2
1 | { |
tuic
1 | { |
vless
1 | { |
1 | { |
创建 OpenRC 服务 (Alpine的服务管理)
这是 Alpine 与 Debian/Ubuntu 最大的不同之处。Alpine 使用 OpenRC 而不是 systemd。
创建 OpenRC 服务脚本文件:
1
vim /etc/init.d/sing-box
将以下脚本内容完整地粘贴进去:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#
# openrc service script for sing-box
#
# Sing-box可执行文件的路径
command="/usr/local/bin/sing-box"
# 运行参数,-c 指定配置文件路径
command_args="run -c /etc/sing-box/config.json"
# 以root用户运行
command_user="root"
# PID文件的位置,用于服务管理
pidfile="/run/${RC_SVCNAME}.pid"
# 告诉服务管理器将程序放入后台并为创建PID文件
start_stop_daemon_args="--background --make-pidfile"
name="sing-box"
description="Sing-box Service"
# 定义依赖,表示需要在网络启动后才启动本服务
depend() {
need net
after firewall
}wq保存并退出。
给服务脚本添加执行权限,这是必须的步骤:
1 | chmod +x /etc/init.d/sing-box |
将服务添加到开机自启:
1 | rc-update add sing-box default |
立即启动服务:
1 | rc-service sing-box start |
检查服务状态:
1 | rc-service sing-box status |
如果一切正常,您会看到 * status: started 的提示。
如何排错和查看日志?
Alpine 没有像 journalctl 那样集中的日志系统。如果服务启动失败,或者您想查看 Sing-box 的实时输出:
先停止后台服务:
1
rc-service sing-box stop
在前台手动运行程序,这样所有日志都会直接打印在当前窗口:
1
/usr/local/bin/sing-box run -c /etc/sing-box/config.json
排查完毕后,按
Ctrl + C停止,然后用rc-service sing-box start重新在后台启动服务。
hysteria2端口跃迁
假设监听端口为udp 443,通过DNAT实现
在 Alpine 容器内安装 iptables
1 | apk update |
在容器内执行您的重定向命令 这条命令完全不需要修改,直接在容器内执行即可:
1 | iptables -t nat -A PREROUTING -i eth0 -p udp --dport 20000:30000 -j REDIRECT --to-ports 443 |
使规则持久化(非常重要) 直接执行的 iptables 规则在容器重启后会丢失。我们需要让开机自动加载。
1 | # 启动 iptables 服务并设置开机自启 |
执行保存后,您当前的规则会被写入 /etc/iptables/rules-save 和 rules6-save 文件中,并在下次启动时自动加载。