All systems operational 12 elite locations · Europe & Asia Pay with crypto · 0 KYC
首页 / 指南 / 在 VPS 上搭建 Tor v3 洋葱服务
指南

在 VPS 上托管 Tor 洋葱服务(v3)

VPSbit Tor still: three relay nodes chained under a lock

五行 torrc 配置、仅监听本地的后端、密钥备份与客户端鉴权。Core 套餐标价 $6/月,年付 $4.80,支持加密货币付款。今天就部署你的洋葱服务。

简答

在 root 权限的 VPS 上运行 v3 洋葱服务:五行 torrc 配置、仅监听本地的后端、密钥备份与客户端鉴权。Core 套餐标价 $6/月,年付仅 $4.80。

地址是一对密钥,而不是一台服务器

服务器工作中几乎所有东西都挂在一个你从别人那里租来的名字上。v3 洋葱服务恰恰相反:.onion 字符串是算出来的——由 Tor 首次启动时生成的 ed25519 密钥对推导而来,而底下的机器只是可随意更换的硬件。把地址当作你拥有的一个文件,而不是你租用的一项资源,许多经典的隐藏服务事故在你还没来得及犯之前就失去了意义。

v3 格式把一个 32 字节公钥、一个两字节校验和一个单字节版本字段打包进地址,再对结果做 base32 编码,得到我们熟悉的以 d 结尾的 56 位字符串。整个构造过程不涉及任何注册机构、证书颁发机构或解析器——RFC 1035 里描述的那套机制对这个名字根本不会运行,所以也永远不需要 DNS 记录或端口转发。

发布过程同理,只是隔了一步:服务对描述符签名并上传到冗余的目录中继;客户端取回该描述符,得知服务当前使用的引入点(introduction point),然后构建一条会合(rendezvous)电路,让双方在中间碰头。服务器的 IPv4 自始至终不出现在其中任何环节——v3 会合规范定义了整套流程,主机上不需要一个公开的套接字。落到磁盘上的东西也很少:HiddenServiceDir 里只放着 hostname、公钥和私钥,仅此而已。

典型的错误正是这个反转关系的直接后果:运维把 hostname 文件复制进密码管理器,在一次例行重建中抹掉了机器,重装 Tor,然后眼睁睁看着 /var/lib/tor/ 里冒出一个全新的地址。旧字符串仍然存在——它依然是有效的算术结果——但赋予它归属权的那对密钥没了,也没有任何恢复流程,因为根本无物可恢复。所有已发布的链接、二维码和书签,从此都指向一个幽灵。

接下来的所有内容——五行 torrc、绑定到 localhost 的套接字、冻结备份、客户端鉴权——都只是围绕这一个事实展开的细节:身份活在你的文件里,服务器不过是这些文件这个月碰巧运行的地方。

VPS $4.80* 起(年付期限),存储 1–5 TB NVMe 年付折合 $24/月起,带 IPMI 的独立服务器 $39.20/月起。加密货币账单,免 KYC。

立即启动

机房位置是运维决策,不是可达性决策

由于解析器从不查询机架的地址,全部十二个机房城市对 .onion 的服务效果完全相同:不存在值得追逐的“对 Tor 友好”的标签,也没有为了可达性而值得付的位置溢价。位置选项真正决定的是你深夜改配置时的往返延迟、管辖这块磁盘的刑法,以及账单系数——雷克雅未克和奥斯陆为 x1.2,苏黎世为 x1.35,卢森堡为 x1.15,其余站点均按基准标价计费。

可达性反而由电路构建决定。客户端经过三个中继组装一条通往会合点的路径,服务自己也构建一条三中继路径通往同一点,两条路径在那里会合——端到端六个中继,而机架只会与自己的守卫(guard)通信。你在浏览器里感受到的延迟主要由客户端路径和会合跳决定,而不是数据中心坐落在 Tokyo 还是 Frankfurt。

所以要按经得起日常使用考验的标准来选。每周推二十次配置变更时,管理延迟很重要;一个从欧洲管理的欧洲站点,单凭打字时间就足以证明欧洲机架的价值。机房法律更重要:冰岛没有强制的数据留存要求,瑞士在欧盟之外运行自己的联邦数据保护法,而欧盟城市则让任何投诉者都能援引 GDPR 判例法。Tor Project 的洋葱服务 FAQ 回答协议层面的问题;司法管辖层面则是你的决定——在第一张账单到来之前,以书面形式、一次性想清楚。

常见翻车点:有人出于玄学理由选了一个遥远站点,然后在项目的整个生命周期里为每次按键支付 180 毫秒;也有人每个月把服务在不同国家之间搬来搬去,然后想不通为什么守卫轮换让地址时好时坏。频繁迁移带来的电路搅动还会反复重新发布描述符,毫无收益,却让每次重启后多出数十秒的启动延迟。

按你能忍受的延迟和你真正读过的法律,一次性选好站点,然后别再碰地图,把省下的注意力花在套接字层上——真正的暴露面通常藏在那里。

五行 torrc,其中没有一行是难点

人们以为洋葱托管是一座迷宫,而实际的搭建路径只是一个软件源、两条指令和一次重载。迷宫在别处——在世界可读的套接字里,在从未备份的密钥里,在年久失修的软件包里。一次把五行配置写对,剩下的一个钟头就是卫生工作,而真正决定服务能否活过第一年的恰恰是它。下文的一切都假设你使用一台 root 权限的 KVM 镜像:内核、包管理器和防火墙都在你手里,因为受限的容器会在这每一步上跟你作对。

从 Tor Project 官方软件源安装,而不是发行版的基础通道,因为守护进程功能迭代很快:引入点抗拒绝服务防御和现代客户端鉴权都要求 0.4.3 或更新版本。然后,最小声明只有两行——HiddenServiceDir /var/lib/tor/app/ 和 HiddenServicePort 80 127.0.0.1:8080——接着执行 systemctl reload tor@default,参见 systemctl 手册。几秒之内目录里就会出现 hostname 文件,即便应用还没写完,服务也已经可以通过隧道访问了。

两条小声明在一台纯服务用途的机器上值得一写:SocksPort 0 关闭你并不使用的本地 SOCKS 代理,免费从审计清单里去掉一个监听套接字;固定 HiddenServiceVersion 3 则让旧配置文件在守护进程升级之间保持可移植。三个引入点的默认值对大多数上线场景已经足够合理——只有当流量数据(而不是焦虑)这么说时才去调高。

经典的翻车方式:运维装了发行版自带的多年老版本守护进程,写上 v3 时代的指令,然后收到一条读起来像协议问题的配置错误。第二个经典:HiddenServicePort 指向的后端还没开始监听,看着 curl 失败,就断定洋葱坏了,其实只是应用没起来。动手改任何东西之前先看 journalctl -u tor@default;日志会明明白白告诉你拒绝连接的是隧道哪一端。

守护进程更新到位、两条指令就位之后,隧道就存在了——接下来整个项目的剩余工作,就是确保机器上没有任何东西会回应除这条隧道之外的任何人。

绑定到 localhost,否则洋葱只是装饰

给一个同时在 0.0.0.0 上监听的应用套上洋葱,就像把一扇上锁的门挂在一面敞开的墙上:Tor 尽职地把流量隧道到 127.0.0.1:8080,而同一个端口整夜都在回应每一个扫过 IPv4 段的扫描器。隧道增加了一个私密入口,却不会移除你虚掩的公开入口,而且你的流量再安静,也藏不住你付过钱的账单上印着的地址。

先审计监听套接字,因为它们才是地面真相:ss -tlnp 应该只显示应用绑定在 127.0.0.1:8080,而公共地址上别无其他。如果应用无法通过配置绑定到回环地址,就用 nft 在防火墙上把端口封掉,只保留回环这条路径。最干净的做法(在技术栈支持时)完全绕开 TCP:HiddenServicePort 80 unix:/run/app.sock 给应用一个根本没有网络存在的 Unix 套接字。

如果必须保留一个明网(clearnet)镜像,就把这件事告诉 Tor Browser:像 Onion-Location 指南描述的那样,在 HTTPS 站点上发布 Onion-Location 头,浏览器就会向能够使用洋葱版的访客主动提供洋葱版本。这个头在 Web 服务器配置里只占一行,却能把最容易受伤害的读者——那些需要洋葱却不知道它存在的人——引到隧道上来,一个跳转页都不需要。

要提防的假通过:在机器上用 curl 自测成功,于是宣布服务已封闭,而 ss 显示端口一直都在公共接口上应答。暂存面板和指标导出器是惯犯——监听在 9090 上的 node exporter,或者绑定过宽的数据库管理界面,能在每一次洋葱迁移中幸存,因为它们从头就不在隧道里。按 $6/月标价订购 Core——年付 $4.80——在真实流量提出要求之前,把整个技术栈留在一台小机器上。

一旦唯一的入口就是隧道,之后的每一个决定——密钥、防御、鉴权——都会复利式地叠加,而不是互相补偿,这正是你希望项目所处的位置。

像保管凭据一样备份密钥,而不是像对待配置文件

洋葱托管中最常见的不可逆故障不是硬件损坏,而是一次重新生成了密钥对的重新部署。磁盘镜像被重建,/var/lib/tor 被格式化,数月积累的已发布链接随着一次 apt 事务的副作用失去了目的地。硬件坏掉时动静很大,一小时内就能换新;被抹掉的密钥对则是悄无声息地死去,并把地址一起带走——对你而言这是严格更糟的组合。

用一个刻意的流程来冻结身份:用 systemctl stop tor@default 停掉守护进程,用 tar czf 把整个服务目录——hostname、公钥和 hs_ed25519_secret_key——打包归档,再按 GnuPG 文档用 gpg 加密归档,然后把它存到一个既不是服务器、也不是你工作站下载文件夹的地方。同一个归档日后还能把服务搬到新硬件上——零停机迁移模式正是从这里开始。恢复就是走反路:同样的目录、同样的属主、重启,地址就会逐字节原样回来。在守护进程启动之前,先把目录设为 700、文件设为 600。

泄露方向是它的镜像,而且更糟。任何持有 hs_ed25519_secret_key 的人都能为你的地址发布描述符,并毫无破绽地接收你的客户端——一个不需要 DNS 劫持、也不需要证书欺诈的克隆,因为地址本身就是密钥。轮换意味着生成新服务、把新地址发布到所有地方、然后烧掉旧的;没有吊销列表,所以备份的存储位置和备份本身同样重要。

典型错误:只归档 hostname 文件——那是公开字符串,单独存在毫无价值;或者把密钥目录提交进 git 图个安心——git log 会在之后的每一次删除中把它保留下来,而公开仓库的爬虫会按部就班地收割洋葱密钥。离线介质上的加密归档只花你十分钟;轮换地址则让你失去发布过的每一条链接。

把这三件密钥当成机器上最有价值的文件组——比应用、数据库和日志加起来还值钱——因为在地址的生命周期里,事实正是如此。

没有 IP 可洪泛,不等于没有东西需要防御

容量型攻击找不到可以瞄准的地址——机架从不绑定公开服务端口,所以千兆级洪水只能打到服务商的边缘,这是设计层面的结构性属性,而不是你买来的过滤产品。剩下的威胁更安静、也更贴近应用层:引入点请求洪水、会合搅动,以及一次一条、伪装成合法电路的 CPU 耗尽——每一分钟都记在你的账上。

新版守护进程恰好为这一层内置了防御。HiddenServiceEnableIntroDoSDefense 1 开启引入点的速率限制,HiddenServiceEnableIntroDoSRatePerSec 25 加上 200 的突发额度是可以先对着真实流量调的起点值。压力更大时,会合点的工作量证明(proof-of-work)防御让客户端为连接支付少量 CPU 代价,从而让发送便宜、吸收昂贵的洪水在经济上不成立——该机制在会合规范中与协议其余部分一并定义。

要弄清内置的 DDoS 防护覆盖什么、不覆盖什么:它保护的是你的 SSH 和监控所依赖的明网 IP,在数据中心边缘、数据包到达你之前完成清洗。洋葱路径永远不会触及那个清洗设备,因为它从不经过公共接口,所以它的防御住在上一层——守护进程和应用里。像为缓存预算内存那样为工作量证明校验预算 CPU——那是服务的成本,不是异常。

错误会朝两个方向发生。一些运维以为结构性属性包办一切,完全跳过应用层限速,等到第一场引入点洪水来临时,Web 服务器里连一个 limit_req 区块都没有,参见 nginx 模块文档。另一些人装上过于激进的过滤,把 Tor 出口流量当敌情处理,反而把这个服务为之存在的读者锁在门外。照日志调优,别照恐惧调优。

这条路径上的防御既便宜又乏味——一个开关、两个速率、一个请求区块——而它们只在某一天真正起作用:不速之客的流量到来的那一天。

客户端鉴权关门,不必开一个端口

私有洋葱——只有列入名单的读者才能解析——听上去似乎需要 VPN、防火墙和用户数据库。在 v3 上这些一概不需要:面向一列客户端密钥的描述符加密意味着未授权的 Tor Browser 用户什么都取不到,而机器上开放端口的数量精确保持在零。鉴权发生在应用流量的第一个字节之前,所以从未被授权的扫描器连敲门的机会都没有,你也不必向审计者解释这一切。

机制很小。为每个客户端生成一对 x25519 密钥;把公钥那一半以 .auth 文件的形式放进服务的 authorized_clients/ 目录;把私钥那一半以 .auth_private 形式交给读者,放进他们自己的 ClientOnionAuthDir。从那时起,描述符就只对这一组密钥加密,服务目录里清楚显示谁被允许——应用层连一个用户账号都不用建。客户端鉴权指南把文件格式从头到尾讲了一遍。

运维上,每人或每设备一对密钥优于共享密钥,因为吊销变成了删文件加重载:移除 .auth 文件、重载守护进程,下一个描述符周期就会在几分钟内把该客户端挡在门外。把密钥文件与真人之间的对应关系,和服务的密钥存放在同一个加密存储里,否则一年之内访问名单就会变成考古现场,你将不得不重新签发自己都无法审计的凭据。

常见的故障是版本错乱:HiddenServiceAuthorizeClient 是 v2 时代的指令,对 v3 服务毫无作用,把两者混在一个配置里的服务会在完全无鉴权的状态下安静运行。第二种故障在客户端侧——命名错误的 .auth_private 文件产生的表象和服务挂掉一模一样,人们去排查隧道,问题却出在文件名上。两端都需要 0.4.3 或更新版本的守护进程。

对任何带账单页面、管理面板或内测受众的东西,鉴权比任何替代方案都便宜,而且按设计默认失败关闭。

政策层在隧道的两端读起来一模一样

地址的匿名性不会让磁盘搬家。可接受使用政策对隐藏服务和明网站点一视同仁——仅限合法内容,禁止 CSAM、钓鱼、垃圾邮件和攻击流量——针对 .onion 的滥用投诉同样会落到主机商头上。完整的论述属于离岸托管合法性指南;这里运维层面的要点很简单:隧道不是司法管辖区,torrc 里的任何指令都从未修改过任何成文法。

滥用处理按机房位置的法律运行,所以你在第二节选的那个选项,同时也是你的磁盘所服从的法典。这不是可以一目十行的形式条款:冰岛在留存问题上与欧盟城市的读法不同,而位置列表公布了每个机房的层级、上行带宽和适用法律。每个项目读一次,而不是一辈子读一次——因为机房法律是这套技术栈里唯一一个不经你参与、也没有变更日志就会改变的变量。

机器上的卫生属于同一姿态:SSH 用密钥而不是密码——在 sshd_config 里设置 PasswordAuthentication no,参见 sshd 手册;仪表盘通过隧道访问而不是对外监听;一台机器一个角色,因为中继和洋葱的老化方式不同,彼此没有可共享的有用状态。迁移或限速 22 端口,比任何设备都更便宜地换来清净,而且完全碰不到洋葱路径。

在这里悄然扼杀项目的假设,是“免 KYC 结算会修改政策层”。不会:禁用清单随每个套餐随行,试探底线的运维无论账单怎么付都会失去这台机器。当后端长出了独占 CPU 的需求,或者你想要一个不依赖网络栈也能用的控制台时,按 $49/月标价订购 Forge——年付 $39.20——该档位带 IPMI,政策同样适用。

政策、卫生和硬件选型是同一个主题戴的三顶帽子:按这个顺序一次性决定好,隧道就不再是项目里最需要操心的事。

洋葱服务:按此顺序执行

把整条路径一次性走完,会发现它比任何对它的描述都短。第一步,在十二个城市中按你的管理延迟和你对机房法律的解读挑选一个,开通一台普通的 KVM 机器——地理位置对地址毫无影响,存在的溢价(x1.2 雷克雅未克、x1.35 苏黎世)都是公开发布的,不必谈判。从首次开机起你就是 root,注册只要一个邮箱或一个令牌,结算流程从头到尾不会问你要姓名。

第二步,从项目软件源安装 Tor 以保证守护进程为最新版本,然后声明服务:HiddenServiceDir /var/lib/tor/app/ 和 HiddenServicePort 80 127.0.0.1:8080,重载,几秒内读取出现 的 hostname 文件。第三步,关闭公开入口:应用绑定到回环地址或 Unix 套接字,用 ss -tlnp 验证,防火墙丢弃变更后仍在公共地址上应答的一切。

第四步,在动任何其他东西之前先冻结身份:停掉守护进程,打包加密密钥三件套,存到机器之外,并演练一次恢复流程,让地址挺过未来每一次重建。第五步,打开那些你压力之下注定会忘记的防御——引入点上的 HiddenServiceEnableIntroDoSDefense 1,应用里的请求限速区块——并且,如果受众是私密的,就启用客户端鉴权,每个读者一对密钥,而不是共享一对。

第六步,把政策层面的点连起来:AUP 原样适用,机房法律管辖磁盘,而最少数据上线清单覆盖隧道管不到的层面——注册商记录、支付痕迹、证书。第七步,盯着日志看一个星期:描述符发布、电路计数、引入点流量,以及应用自身的报错——因为“隧道工作正常、后端一塌糊涂”正是仓促上线最常见的终态。

顺序比任何单个步骤都重要:先有隧道,第二关入口,第三冻密钥,第四上防御——因为每一阶段都以前一阶段为前提,跳过任何一阶段,都会把一个五分钟的修复变成一次换地址的重建。

VPSbit 允许搭建洋葱服务吗?

允许。Tor 托管(包括洋葱服务)是明确允许的工作负载;可接受使用政策对 .onion 地址与明网站点一视同仁,开启之前不需要任何特别许可或滥用押金。

VPS 需要特殊套餐吗?

不需要。任何套餐都能跑 Tor;小型服务放在入门档位就绰绰有余。高流量洋葱会先耗尽 RAM 再耗尽 CPU,所以当你在日志里看到电路堆积时就扩内存,不必等 CPU 曲线动起来。

中继和洋葱服务能共用一台机器吗?

技术上可以,但两种角色的老化方式不同:中继会招来滥用投诉邮件和带宽尖峰,而洋葱需要安静和稳定。分开的机器让一个角色的噪音不会污染另一个,各自也能按自己的节奏重建,不必与对方协商。

洋葱后端应该放在哪里?

放在你认真管理的任何一台机器上——地址向网络隐藏的是站点,而不是你对机器的 SSH 习惯。加固 sshd,仪表盘走隧道;如果服务真的需要独占 CPU,同一个结算页也出售带 IPMI 的<a href='../../dedicated/'>独立服务器</a>。

私钥丢失或泄露会怎样?

丢失不可恢复:地址是对密钥的算术运算,服务目录被抹掉就意味着一个全新的 .onion 和全部链接的重新发布。泄露则在另一个方向上更糟——任何持有密钥的人都能发布描述符,逐字节冒充你的服务。

准备启动?

配置主机 — VPS、存储或裸金属服务器 — 设置密码,支付随后生成的账单。