跳至内容

Tor 节点

暂时搁置

tor 目前在 EPEL 中缺失。它可能会被构建。文档团队将在时间允许的情况下继续测试 EPEL 中的可用性。目前,您的唯一选择是从源代码构建 tor,并且相关的说明目前在此处缺失。

简介

Tor 是一项匿名服务和软件,它通过三个由志愿者运行的服务器(称为中继)路由流量。三跳设计旨在通过抵抗监视企图来确保隐私。

先决条件和假设

以下是使用此过程的最低要求

  • 一个公共 IPv4 地址,直接在服务器上或通过端口转发
  • 一个能够 24/7 运行的系统,对 Tor 网络有用
  • 能够以 root 用户身份运行命令或使用 sudo 提升权限
  • 熟悉命令行编辑器。作者在此使用 vivim,但可以替换为您喜欢的编辑器
  • 熟悉更改 SELinux 和防火墙设置
  • 无计量连接,或具有高带宽限制的连接
  • 可选:一个公共 IPv6 地址用于双栈连接

安装 Tor

要安装 Tor,您需要先安装 EPEL (Extra Packages for Enterprise Linux) 并运行更新

dnf -y install epel-release && dnf -y update

然后安装 Tor

dnf -y install tor

配置 Tor

在安装好软件包后,您需要配置 Tor。作者在此使用 vi,但如果您更喜欢 nano 或其他编辑器,请随意替换。

vi /etc/tor/torrc

默认的 torrc 文件已经相当详细,但如果您只想设置一个 Tor 中继,它可能会显得很长。一个最小的中继配置类似于这样:

Nickname TorRelay
ORPort 9001
ContactInfo you@example.com
Log notice syslog

仔细看看

  • Nickname 是您的 Tor 中继的一个(非唯一的)昵称。
  • ORPort 是您的 Tor 中继监听的 TCP 端口。默认值为 9001
  • ContactInfo 是您的联系信息,以防您的 Tor 中继出现问题。请将其设置为您的电子邮件地址。
  • Log 是您的 Tor 中继日志的严重性和目标。我们记录 notice 级别以防止记录敏感信息,并将日志输出到 systemd 日志。

系统配置

如果您选择的 TCP/IP 端口不是 9001(默认值),您需要调整 SELinux 的 tor_port_t 以将您的 Tor 中继端口列入白名单。操作方法如下:

semanage port -a -t tor_port_t -p tcp 12345

12345 替换为您在 ORPort 中设置的 TCP 端口。

您还需要在防火墙中打开您的 ORPort 端口。操作方法如下:

firewall-cmd --zone=public --add-port=9001/tcp
firewall-cmd --runtime-to-permanent

9001 替换为您在 ORPort 中设置的 TCP 端口。

限制带宽

如果您不想将所有带宽都用于 Tor,例如您的 ISP 有公平使用政策,您可以限制您的带宽。您可以按带宽(例如,100 兆比特)或在一段时间内的流量(例如,每天 5GB)来限制。

为此,请编辑 torrc 文件:

vi /etc/tor/torrc

如果您想限制带宽,则需要在 torrc 文件中添加以下行:

RelayBandwidthRate 12500 KB

这将允许每秒 12500 KB 的带宽,大约相当于每秒 100 兆比特。

如果您更愿意在一个时间段内传输特定数量的流量,例如每天,则改为添加以下内容:

AccountingStart day 00:00
AccountingMax 20 GB

这些值意味着:

  • 您的带宽计费周期是每天从 00:00 系统时间开始。您也可以将 day 更改为 weekmonth,或将 00:00 替换为其他时间。
  • 在您的带宽计费周期内,您将传输 20 GB。如果您想允许更多或更少的带宽给您的中继,请增加或减少该值。

在使用了指定的带宽后会发生什么?您的中继将在该周期结束前阻止新的连接尝试。如果您的中继在该周期内未使用指定的带宽,计数器将毫无停顿地重置。

测试和启动

设置好 Tor 中继配置后,下一步就是启动 Tor 守护进程:

systemctl enable --now tor

在您的 systemd 日志中,您应该会看到一行类似这样的内容:

Jan 14 15:46:36 hostname tor[1142]: Jan 14 15:46:36.000 [notice] Self-testing indicates your ORPort A.B.C.D:9001 is reachable from the outside. Excellent. Publishing server descriptor.

这表明您的中继是可访问的。

几小时内,您的中继将出现在 Tor Relay Status 上,您可以通过输入您的昵称或公共 IP 地址来查找。

中继注意事项

您还可以扩展配置,使您的 Tor 中继成为出口或桥接中继。您还可以在每个公共 IP 地址上设置最多 8 个中继。EPEL 中的 Tor systemd 单元文件并非设计用于多个实例,但该单元文件可以被复制和修改以适应多中继设置。

出口中继是 Tor 电路的最后一个节点,直接连接到网站。桥接中继是未列出的中继,它们帮助那些遭受互联网审查的用户连接到 Tor。

torrc 文件的选项可以在 man page 中找到。在此,我们将描述一个基本的出口和桥接中继配置。

运行出口中继

警告

如果您打算运行出口中继,请确保您的 ISP 或托管公司对此持开放态度。出口中继的滥用投诉非常普遍,因为它是 Tor 电路中连接到网站的最后一个节点,代表 Tor 用户进行连接。因此,许多 ISP 和托管公司不允许 Tor 出口中继。

如果您不确定您的 ISP 是否允许 Tor 出口中继,请查看服务条款或询问您的 ISP。如果您的 ISP 表示不允许,请考虑更换 ISP 或托管公司,或者考虑运行中间节点或桥接中继。

如果您想运行出口中继,您需要在 torrc 文件中添加以下内容:

ExitRelay 1

但是,这将使用以下默认出口策略:

ExitPolicy reject *:25
ExitPolicy reject *:119
ExitPolicy reject *:135-139
ExitPolicy reject *:445
ExitPolicy reject *:563
ExitPolicy reject *:1214
ExitPolicy reject *:4661-4666
ExitPolicy reject *:6346-6429
ExitPolicy reject *:6699
ExitPolicy reject *:6881-6999
ExitPolicy accept *:*

此出口策略仅阻止了极少数 TCP 端口,允许来自 BitTorrent 和 SSH 的滥用,而许多 ISP 对此感到不适。

如果您想使用 缩减的出口策略,您可以在 torrc 文件中进行设置:

ReducedExitPolicy 1

您也可以设置一个更严格的出口策略,例如只允许 DNS、HTTP 和 HTTPS 流量。这可以设置为:

ExitPolicy accept *:53
ExitPolicy accept *:80
ExitPolicy accept *:443
ExitPolicy reject *:*

这些值意味着:

  • 我们使用 ExitPolicy accept 行允许出口流量到 TCP 端口 53(DNS)、80(HTTP)和 443(HTTPS)。
  • 我们使用通配符 ExitPolicy reject 行拒绝出口流量到任何其他 TCP 端口。

如果您想要一个不限制的出口策略,只阻止 SMTP 流量,可以这样设置:

ExitPolicy reject *:25
ExitPolicy reject *:465
ExitPolicy reject *:587
ExitPolicy accpet *:*

这些值意味着:

  • 我们在 ExitPolicy reject 行中拒绝出口流量到标准的 SMTP TCP 端口 25、465 和 587。
  • 我们使用通配符 ExitPolicy accept 行允许出口流量到所有其他 TCP 端口。

我们也可以像这样允许或阻止一系列端口:

ExitPolicy accept *:80-81
ExitPolicy reject *:993-995

这些值意味着:

  • 我们允许出口流量到 TCP 端口 80-81。
  • 我们拒绝出口流量到 TCP 端口 993-995,这些端口用于 SSL 加密的 IMAP、IRC 和 POP3 变体。

如果您想允许出口流量到 IPv6 地址,前提是您的服务器具有双栈连接:

IPv6Exit 1

运行 obfs4 桥接器

在世界的许多地方,包括中国、伊朗、俄罗斯和土库曼斯坦,直接连接 Tor 是被禁止的。在这些国家,Tor 客户端使用未列出的桥接中继。

Tor 使用 可插拔传输系统运行,该系统允许 Tor 流量被伪装成其他协议,例如无法识别的虚假流量 (obfs4)、WebRTC (snowflake) 或到 Microsoft 服务的 HTTPS 连接 (meek)。

由于其多功能性,obfs4 是最流行的可插拔传输。

要设置 obfs4 桥接器,由于 obfs4 不在 EPEL 仓库中,我们需要从头开始编译它。让我们先安装必要的软件包:

dnf install git golang policycoreutils-python-utils

接下来,我们将下载并解压 obfs4 源代码:

wget https://gitlab.com/yawning/obfs4/-/archive/obfs4proxy-0.0.14/obfs4-obfs4proxy-0.0.14.tar.bz2
tar jxvf obfs4-obfs4proxy-0.0.14.tar.bz2
cd obfs4-obfs4proxy-0.0.14/obfs4proxy/

您也可以直接通过 git clone 获取 obfs4,但这依赖于比 AppStream 中更新的 Go 版本,所以我们不使用这种方法。

然后,我们将编译和安装 obfs4:

go build
cp -a obfs4proxy /usr/local/bin/

obfs4 安装完成后,我们将以下内容添加到我们的 torrc 文件中:

ServerTransportPlugin obfs4 exec /usr/local/bin/obfs4proxy
ServerTransportListenAddr obfs4 0.0.0.0:12345
ExtORPort auto

这些值意味着:

  • 我们在 ServerTransportPlugin 行中运行一个 obfs4 可插拔传输,该传输位于 /usr/local/bin/obfs4proxy
  • ServerTransportListenAddr 使我们的可插拔传输监听在 12345 端口。
  • 我们的 ExtORPort 行将监听一个随机选择的端口,用于 Tor 和我们的可插拔传输之间的连接。通常,此行不应更改。

如果您想监听其他 TCP 端口,请将 12345 替换为您所需的 TCP 端口。

我们还将允许您选择的 TCP 端口 12345(或您选择的端口)在 SELinux 和 firewalld 中通过。

semanage port -a -t tor_port_t -p tcp 12345
firewall-cmd --zone=public --add-port=12345/tcp
firewall-cmd --runtime-to-permanent

运行多个中继

如前所述,每个公共 IP 地址最多可以设置 8 个 Tor 中继。例如,如果我们有 5 个公共 IP 地址,我们可以在我们的服务器上最多设置 40 个中继。

但是,我们需要为每个运行的中继提供一个自定义的 systemd 单元文件。

现在让我们在 /usr/lib/systemd/system/torX 添加一个次要的 systemd 单元文件:

[Unit]
Description=Anonymizing overlay network for TCP
After=syslog.target network.target nss-lookup.target
PartOf=tor-master.service
ReloadPropagatedFrom=tor-master.service

[Service]
Type=notify
NotifyAccess=all
ExecStartPre=/usr/bin/tor --runasdaemon 0 -f /etc/tor/torrcX --DataDirectory /var/lib/tor/X --DataDirectoryGroupReadable 1 --User toranon --verify-config
ExecStart=/usr/bin/tor --runasdaemon 0 -f /etc/tor/torrcX --DataDirectory /var/lib/tor/X --DataDirectoryGroupReadable 1 --User toranon
ExecReload=/bin/kill -HUP ${MAINPID}
KillSignal=SIGINT
TimeoutSec=30
Restart=on-failure
RestartSec=1
WatchdogSec=1m
LimitNOFILE=32768

# Hardening
PrivateTmp=yes
DeviceAllow=/dev/null rw
DeviceAllow=/dev/urandom r
ProtectHome=yes
ProtectSystem=full
ReadOnlyDirectories=/run
ReadOnlyDirectories=/var
ReadWriteDirectories=/run/tor
ReadWriteDirectories=/var/lib/tor
ReadWriteDirectories=/var/log/tor
CapabilityBoundingSet=CAP_SETUID CAP_SETGID CAP_NET_BIND_SERVICE CAP_DAC_READ_SEARCH
PermissionsStartOnly=yes

[Install]
WantedBy = multi-user.target

tor/torrc 后面的 X 后缀替换为您想要的名称。作者为了简洁起见喜欢用数字命名,但可以是任何名称。

随后,我们将把实例的 torrc 文件放在 /etc/tor/torrcX。确保每个实例都有单独的端口和/或 IP 地址。

我们还将允许您选择的 TCP 端口 12345(或 torrcX 中的端口)在 SELinux 和 firewalld 中通过。

semanage port -a -t tor_port_t -p tcp 12345
firewall-cmd --zone=public --add-port=12345/tcp
firewall-cmd --runtime-to-permanent

之后,启用 torX systemd 单元:

systemctl enable --now torX

对您想要运行的每个中继重复这些步骤。

结论

与传统的 VPN 服务不同,Tor 利用志愿者运行的中继来确保隐私和匿名性,而这正是您刚刚设置的。

虽然运行 Tor 中继需要一个可靠的系统,并且对于出口中继还需要一个支持的 ISP,但增加更多中继有助于提高隐私,同时通过减少故障点使 Tor 运行得更快。

作者:Neel Chauhan

贡献者:Steven Spencer