校园 Tor Relay 架设 SOP
本页补充Tor Relay 架设指南没有涵盖的校园网络情境,内容整理自社群伙伴 NZ 在台湾师范大学的实践经验,搭配校园 Tor Relay 提案范本与给校方与法务的校园 Tor Relay FAQ使用。
本页假设你已经取得学校的上线许可。还在评估是否要做、如何说服学校时,先从校园 Tor Relay 提案范本开始。
校园与个人架设的差异
校园网络与家庭网络、个人 VPS 有几个结构上的差异,会直接影响技术选择:
- IP 由学校分配:通常是一个固定的 IPv4 地址,需走信息中心的申请流程
- IPv6 另外申请:多数学校默认不开放 IPv6,双栈需要额外提出申请
- 对外服务需申请例外开放:台湾学术网络(TANet)的校园网络默认不开放对外服务,每一项都要走例外开放的申请
- SSH 限校内 VPN 网段:管理连接只开放校内 VPN 网段接入,不直接暴露在互联网上
- 每项配置都要能向校方说明:每个对外开放的端口、每一段流量都要能对应到计划书里的描述
- 长期运维需考虑毕业交接:ContactInfo 不使用个人的主要邮箱
项目范围与范围外事项
与信息中心沟通时,先说明不做哪些事,比说明要做什么更重要。
范围内
- 只建设非出口节点(Non-Exit Relay),也就是入口节点(Entry Guard)与中间节点(Middle Relay)
- 对外公开的只有节点状态页,不含用户数据
范围外
- 不提供 VPN、代理上网与 Tor 客户端服务(SocksPort、DNSPort)
- 不提供 Onion Services(.onion 服务)
- 不变更校园边界防火墙、DNS 解析与内容过滤的策略
- 不执行深度包检测(DPI)
可逆性
任何时间都可以在 10 分钟内下线,做法是停止 systemd 服务并关闭 ORPort。
服务与连接一览
对外公开的端口(Inbound)
| 服务 | 端口与协议 | 来源 | 说明 |
|---|---|---|---|
| Tor ORPort | 9001/tcp | Internet | Relay 之间的 TLS 连接,唯一必要的对外端口 |
| HTTP(ACME) | 80/tcp | Internet | Let's Encrypt 证书签发与 301 重定向 |
| HTTPS(状态页) | 443/tcp | Internet | 对外的状态网页 |
| SSH | 22/tcp | 校内 VPN 网段 | 管理用,限校内网段 |
| DirPort | 不开放 | – | 不开 DirPort,减少攻击面 |
Tor 相关的 TCP 端口只对外开放 ORPort 一个。443 没有被状态网页或其他服务占用时,也可以把 ORPort 改成 443,审查严格地区的用户比较容易连上。
对外主动连接(Outbound)
| 用途 | 端口与协议 | 去向 |
|---|---|---|
| 获取目录共识、连接其他 Relay | TCP 443、9001 等(动态) | Tor 目录权威(directory authority)与各 Relay |
| 系统更新 | TCP 80、443 | 软件包镜像站 |
| 时间同步 | UDP 123 | 指定的 NTP 服务器 |
明确封锁的项目
- 所有 UDP(指定的 NTP 服务器除外)
- 邮件端口 SMTP 25、465、587
- IRC 6667、6697 与 P2P 常用的端口
- SocksPort、DNSPort、HTTPTunnelPort 一律不启用
操作系统与安全基准
操作系统建议使用 Ubuntu Server 24.04 LTS 的最小安装(minimal install),再完成以下配置:
- 最小化安装:只安装
tor、nginx、certbot、fail2ban、unattended-upgrades、rsyslog、auditd、chrony,视需要加上prometheus-node-exporter - SSH 配置
- 只允许密钥登录:
PasswordAuthentication no - 禁止 root 直接登录:
PermitRootLogin no - 限定用户:
AllowUsers <你的账号> - 连接超时:
ClientAliveInterval 300
- 只允许密钥登录:
- 自动安全更新:启用
unattended-upgrades - 时间同步:使用
chrony,事件调查的时间一律以 UTC 记录 - 系统加固:启用 AppArmor,设置
fs.protected_*参数 - 日志持久化:
journald设为Storage=persistent,可以再通过rsyslog转发到校内的 SIEM - 文件完整性(可选):部署 AIDE,定期比对文件基准
- 磁盘加密(可选):硬件允许时以 LUKS 加密整块磁盘,至少保护
/var/lib/tor - 备份:离线或异地备份
/etc/tor/torrc与/var/lib/tor/keys/,身份密钥需严格保密
Tor 的安装
- 软件包来源:优先使用 Tor Project 官方软件源,发行版自带的版本通常落后一两版
- 服务账号:以软件包默认的
debian-tor账号运行,不要用 root - 只运营非出口节点:以
ExitRelay 0与ExitPolicy reject *:*明确声明,避免成为 Exit Relay
torrc 参考配置
配置文件位置:/etc/tor/torrc
# 基本身份
Nickname <YourSchoolRelayName>
ContactInfo <[email protected]> - Non-exit relay at <Dept/School>; Abuse: <[email protected]>
# 只做 Guard 与 Middle(非出口)
ExitRelay 0
ExitPolicy reject *:*
# ORPort:对外服务唯一必要的入口
ORPort 0.0.0.0:9001
# 不需要目录镜像时关闭 DirPort
DirPort 0
# 不提供本机 Socks 代理
SocksPort 0
SocksPolicy reject *
# 控制端口(仅限本机,供 nyx 与运维使用)
ControlPort 127.0.0.1:9051
CookieAuthentication 1
CookieAuthFileGroupReadable 1
DataDirectoryGroupReadable 1
# 带宽与突发流量(依学校政策调整)
# 例:持续 80 MB/s,突发 120 MB/s
RelayBandwidthRate 80 MB
RelayBandwidthBurst 120 MB
# 日志(notice 级别即可,避免记录敏感细节)
Log notice file /var/log/tor/notices.log
# MetricsPort(可选):只给本机或内网监控,绝不对外
# MetricsPort 127.0.0.1:9035
# MetricsPortPolicy accept 127.0.0.1
ContactInfo 的写法
- 不使用个人的主要邮箱,改用项目邮箱或社团的共用邮箱
- 留下 abuse 联系邮箱,Tor 的 Network Health 团队才能联系到运维者
- 字段内容会公开显示在 Relay Search,写入前就当成公开信息处理
MetricsPort 的安全考量
MetricsPort 让 Prometheus 可以采集 relay 的统计指标。依 Tor 官方的说明,公开 MetricsPort 会危及 Tor 网络的用户。需要远程采集时,以防火墙与 MetricsPortPolicy 严格限制来源,并经过 TLS Proxy。
UFW 防火墙规则
默认策略:
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw logging on
SSH 只开放校内 VPN 网段(把 <学校 IP 段> 换成学校的 CIDR):
sudo ufw allow from <学校 IP 段> to any port 22 proto tcp comment 'SSH from campus VPN'
sudo ufw limit 22/tcp comment 'Rate-limit SSH'
状态网页的 Web 服务:
sudo ufw allow 80/tcp comment 'HTTP for ACME/redirect'
sudo ufw allow 443/tcp comment 'HTTPS status site'
Tor ORPort(Guard 与 Middle 唯一需要开放的端口):
sudo ufw allow 9001/tcp comment 'Tor ORPort'
MetricsPort 默认不开放,有内网监控主机 <监控主机 IP> 时才加上:
sudo ufw allow from <监控主机 IP> to any port 9035 proto tcp comment 'Prometheus -> Tor MetricsPort'
启用并确认规则:
sudo ufw enable
sudo ufw status numbered
对外状态网页
校方与外部人士可以从公开网页确认 relay 正在运行,有助于建立信任。以下两种架构任选其一即可。
方案 A,Nginx 与 Onionoo
- 以 Nginx 提供 HTTPS 状态页
- 页面向 Tor Onionoo API 获取自身 fingerprint 的公开数据(流量、标志、上线状态)
- 只显示公开信息,不暴露任何内部 endpoint
推荐采用方案 A,架构简单,数据全部由前端向公开 API 获取,不涉及内部服务。缺点是图表的灵活性较低。
方案 B,MetricsPort、Prometheus 与 Grafana
需要完整的可观测性时采用方案 B:
- 本机启用
MetricsPort 127.0.0.1:9035,不对外开放 - 在本机或内网架设 Prometheus 采集
/metrics - 以 Grafana 制作图表
- 对外只能公开 Grafana,并且必须符合以下条件:
- 只读账号,搭配强密码或 SSO
- HTTPS
- 只放公开、不含敏感信息的图表
- Prometheus 不直接对外
- MetricsPort 绝不对外
Nginx 与 TLS 配置
- 以
certbot --nginx自动签发与续期证书 - 只启用 TLS 1.2 与 1.3,关闭弱加密套件(cipher)
- 启用 HSTS、
X-Content-Type-Options: nosniff、Content-Security-Policy - 加上
X-Robots-Tag: noindex, nofollow,避免被搜索引擎索引 /.well-known/acme-challenge/走 80/TCP,其余 80 端口的请求全部以 301 重定向到 443
监控、日志与事件处置
日志
journald持久化,视需要以rsyslog转发- Nginx 与 Tor 的日志各自写入独立文件,以
logrotate轮转 - Tor 建议使用
Log notice级别,避免记录敏感细节 - 事件发生时可以临时调高级别,处理完再恢复
主机层的可观测性
node_exporter绑定127.0.0.1:9100- 由本机的 Prometheus 采集、Grafana 显示,对外公开时限只读
变更审计
auditd记录关键文件的变更:/etc/tor/torrc、/var/lib/tor/keys/- AIDE 定期比对,结果发送到运维邮箱
备份与密钥保全
- 离线或异地备份
torrc与/var/lib/tor/keys/ - 身份密钥丢失时,relay 只能以新的身份重新加入网络,先前累积的稳定度记录无法延续
事件处置 Runbook
收到异常告警时依序处理:
- 初步判断(Triage):
sudo ss -tnlp | egrep ':22|:80|:443|:9001|:9035' sudo journalctl -u tor@default -n 200 sudo ufw status numbered - 停止服务:
并保留sudo systemctl stop tor@default/var/log与/var/lib/tor/的完整快照 - 内部通报:30 分钟内提交初步事故报告,内容包含影响范围、起因、处置与预计恢复时间
- 疑似遭入侵:依序封存证据、隔离主机、重建系统,确定密钥没有泄露时,才使用备份的身份密钥恢复
下线条件:影响校务网络、发生网络安全异常,或主管、导师要求下线。
验收与连接测试
- 本机配置检查:
sudo -u debian-tor tor --verify-config - ORPort 可达性:
Tor 日志出现 ORPort 无法确认可达(reachability)的警告时,通常是防火墙或例外开放的申请还没生效# 从校外的另一台主机执行 nmap -p 9001 <你的公网 IP> # 或 telnet <你的公网 IP> 9001 - Relay 上线确认:启动约 3 小时后,到 Tor Metrics Relay Search 以 fingerprint 查询状态
IPv6 配置(可选)
要支持 IPv6 时,先向信息中心申请 IPv6 地址,再在 torrc 加入:
ORPort [<你的 IPv6>]:9001
UFW 也要放行对应的 IPv6 流量。IPv6 虽然是可选项目,对 Tor 网络的多样性有明显帮助,建议向学校争取。
交接与毕业后的运维
运维者会毕业是校园 Relay 与个人 Relay 最大的差别,从上线第一天就要准备交接:
- 共用的 ContactInfo 邮箱:使用社团邮箱、项目邮箱或共用邮箱,不使用个人的主要邮箱
- 两份以上的密钥备份:一份在运维者手上,一份放在导师的实验室
- 交接清单:torrc、UFW 规则、SSH 密钥、CDN 与监控账号、ContactInfo 邮箱的密码
- 提早寻找接手者:毕业前一学期就要确定接手的人
- 交接手册:记录主机的历史、遇到过的问题与约定的运维频率
上线之后
- 回报案例:通过服务页面的渠道联系匿名网络社群 anoni.net,我们会把你的案例加进Tor Relay 校园建立研究专题的「已完成的工作」,让之后加入的学校有更多参考
- 长期运维:Tor Relay 架设指南有 nyx 监控的配置,常见问题一节补充了软件更新与入口节点的选定方式
- 其他贡献方式:另外运行 Tor Snowflake 的代理,协助受审查地区的用户连上 Tor
相关阅读
- Tor Relay 架设指南:个人与家庭环境的基础安装
- 校园 Tor Relay 提案范本:与学校沟通用的提案文档
- 给校方与法务的校园 Tor Relay FAQ:校方常见的疑虑与回答
- Tor Relay 校园建立研究专题:社群推动校园 Relay 的入口
- Tor Project Relay Operator Guides:官方的运营指南
- Tor Relay Post-install and good practices:上线后的注意事项
资料来源与致谢
本页的原始设计文档与实践经验由社群伙伴 苏恩立(NZ) 提供,整理自他在台湾师范大学的部署过程。NZ 同意原始材料以 CC-BY 4.0 授权发布。
按照本页操作时,若发现步骤不适用于你的学校环境,或有可以补强的细节,欢迎通过服务页面列出的渠道反馈,我们会持续更新本页的内容。