Tor

出自 ArchWiki
(重定向自 Tor Browser

Tor 项目 (The onion routing) 是 洋葱路由 的开源实现,提供对匿名代理网络的免费访问。其主要目标是通过防止 流量分析 攻击来启用 在线匿名性

Tor 网络的用户在其机器上运行洋葱代理软件,该软件为其客户端提供 SOCKS 接口。该软件连接到 Tor,定期协商通过 Tor 网络的虚拟电路。Tor 以分层方式(因此得名“洋葱”)使用密码学,确保路由器之间的前向保密。

通过此过程,洋葱代理管理终端用户的网络流量以实现匿名性。它通过加密流量、通过 Tor 网络的其他节点发送流量并在接收您流量的最后一个节点解密流量,然后再将其转发到您指定的服务器,从而保持用户的匿名性。一个权衡是,由于大量的流量重新路由,使用 Tor 可能比常规直接连接慢得多。此外,虽然 Tor 提供了针对流量分析的保护,但它无法阻止在 Tor 网络边界(即进出网络的流量)处的流量确认。有关更多信息,请参见 Wikipedia:Tor (anonymity network)

注意: Tor 本身不是维护匿名性所需的全部。有几个主要的陷阱需要注意(参见 如果我使用 Tor,我是否完全匿名?)。

安装

安装 torbrowser-launcher 软件包以使用 Tor 浏览器,这是使用 Tor 匿名浏览网络的唯一受支持方式。

打算手动将 Tor 与其他软件一起使用、运行中继或托管 Onion 服务的用户应安装 tor 软件包。本文的大部分内容涵盖了这种用法。

Nyx 是 Tor 的命令行监视器,它提供带宽使用情况、连接详细信息和即时配置编辑。要使用它,安装 nyx 软件包。

使用

启动/启用 tor.service。或者,以 tor 用户身份手动启动它

[tor]$ /usr/bin/tor

要通过 Tor 使用程序,请将其配置为使用 127.0.0.1localhost 作为 SOCKS5 代理,端口为 9050,用于具有标准设置的普通 Tor。

该代理支持远程 DNS 解析:使用 socks5h://127.0.0.1:9050 从出口节点进行 DNS 解析(而不是 socks5 进行本地 DNS 解析)。

要检查 Tor 是否正常运行,请访问 https://check.torproject.org/

配置

默认情况下,Tor 从文件 /etc/tor/torrc 读取其配置,如果找不到该文件,则从 $HOME/.torrc 读取。配置选项在 tor(1) 中进行了解释。默认配置应该适用于大多数 Tor 用户。

要在更改后重新加载配置,重新加载 tor.service

中继配置

Tor 可以打开的最大文件描述符数量可以使用 tor.service 中的 LimitNOFILE 进行设置。快速中继可能需要增加此值。

如果您的计算机未运行 Web 服务器,并且您未设置 AccountingMax,请考虑将您的 ORPort 更改为 443 和/或将您的 DirPort 更改为 80。许多 Tor 用户被限制在仅允许他们浏览网络的防火墙后面,此更改将使他们能够访问您的 Tor 中继。如果您已经在使用端口 80443,其他有用的端口是 221101439001[1] 1024 以下的端口是特权端口,因此要使用这些端口,必须以 root 身份运行 Tor,方法是在 tor.service 中设置 User=root,并在 torrc 中设置 User tor

您可能希望查看 Tor 文档

打开 Tor ControlPort

大多数用户不需要这个。但某些程序会要求您打开您的 Tor ControlPort,以便它们获得对您的 Tor 节点的底层访问权限。

通过 ControlPort,其他应用程序可以更改和监视您的 Tor 节点,在 Tor 运行时修改您的 Tor 配置,或获取有关 Tor 网络状态和 Tor 电路的详细信息。

追加到您的 torrc 文件

ControlPort 9051

来自 Tor 控制协议

为了安全起见,[Tor 控制] 流不应被不受信任的各方访问。

因此,为了更高的安全性,我们将限制对 ControlPort 的访问,可以使用Cookie 文件控制密码或两者都使用。

警告: 仅向受信任的进程和用户提供密码或 Cookie 访问权限,因为它们可用于修改服务的任意配置选项。

设置 Tor Control Cookie 文件

添加到您的 torrc

CookieAuthentication 1
CookieAuthFile /var/lib/tor/control_auth_cookie
CookieAuthFileGroupReadable 1
DataDirectoryGroupReadable 1

重启 tor.service 以应用更改。

使用Cookie 认证,对 ControlPort 的访问受到文件权限的限制,这些权限指向 Tor Cookie 文件和 Tor 数据目录。

将用户添加到 tor 用户组,以使他们能够访问 Tor Cookie 文件。

您可以使用此命令检查权限

$ stat -c%a /var/lib/tor /var/lib/tor/control_auth_cookie

它应该打印 750640

设置 Tor Control 密码

将您的纯文本密码转换为哈希值

$ set +o history # unset bash history
$ tor --hash-password your_password
$ set -o history # set bash history

并将该哈希值添加到您的 torrc

HashedControlPassword your_hash

bash 历史命令可防止您的明文密码被写入您的 bash $HISTFILE

打开 Tor ControlSocket

如果某些程序需要访问您的 Tor ControlSocket(如 Unix 域套接字),请将以下内容添加到您的 torrc

ControlSocket /var/lib/tor/control_socket
ControlSocketsGroupWritable 1
DataDirectoryGroupReadable 1
CacheDirectoryGroupReadable 1 # workaround for tor bug #26913

将要运行该程序的用户添加到 tor 用户组

重启 tor.service 并重新启动该程序。

要验证控制套接字的权限

$ stat -c%a /var/lib/tor /var/lib/tor/control_socket

它应该打印 750660

测试您的 Tor Control

要测试您的 ControlPort,请使用以下命令运行 gnu-netcat

$ echo -e 'PROTOCOLINFO\r\n' | nc 127.0.0.1 9051

要测试您的 ControlSocket,请使用以下命令运行 socat

$ echo -e 'PROTOCOLINFO\r\n' | socat - UNIX-CLIENT:/var/lib/tor/control_socket

两个命令都应打印

250-PROTOCOLINFO 1
250-AUTH METHODS=COOKIE,SAFECOOKIE,HASHEDPASSWORD COOKIEFILE="/var/lib/tor/control_auth_cookie"
250-VERSION Tor="0.4.8.12"
250 OK
514 Authentication required.

有关更多命令,请参见 Tor 控制协议

在浏览器中使用系统 Tor 服务

当使用 Tor 浏览器时,可以使用正在运行的系统服务,而不是启动到 Tor 网络的第二个连接。说明包含在浏览器的启动器文件中,默认情况下该文件位于 ~/.local/share/torbrowser/tbb/x86_64/tor-browser/Browser/start-tor-browser

0.3.7 版本开始,可以按照以下步骤操作

  1. /etc/tor/torrc 中,查找设置 #SOCKSPort 并复制地址和端口。如果未给出地址,则默认值为 127.0.0.1,如果未给出端口,则默认值为 9050
  2. 按照 #打开 Tor ControlPort#设置 Tor Control 密码 中的步骤操作,并复制您设置的密码和控制端口。
  3. 在 Tor 浏览器中,导航到 about:config 并设置以下标志
    # SETTING NAME                             VALUE
    # network.proxy.socks                      <SocksAddress>
    # network.proxy.socks_port                 <SocksPort>
    # extensions.torbutton.inserted_button     true
    # extensions.torbutton.launch_warning      false
    # extensions.torbutton.loglevel            2
    # extensions.torbutton.logmethod           0
    # extensions.torlauncher.control_port      <ControlPort>
    # extensions.torlauncher.loglevel          2
    # extensions.torlauncher.logmethod         0
    # extensions.torlauncher.prompt_at_startup false
    # extensions.torlauncher.start_tor         false
  4. 编辑 Tor 浏览器的启动文件,默认情况下该文件为 ~/.local/share/torbrowser/tbb/x86_64/tor-browser/Browser/start-tor-browser。在以下行中,将单词 secret 替换为控制密码
    setControlPortPasswd ${TOR_CONTROL_PASSWD:='"secret"'}
    警告: 请勿修改单词 secret 周围的两组引号。
  5. 重启 Tor 浏览器。如果成功,启动页面上应该会显示一条消息,说明连接不由 Tor 浏览器管理,并且 tor.service 应该记录一行消息,显示 New control connection opened from <SocksAddress>

在 chroot 中运行 Tor

注意: 当在 chroot 中运行 Tor 时,使用 telnet 连接到本地 ControlPort 似乎已损坏

出于安全目的,可能需要在一个 chroot 中运行 Tor。以下脚本将在 /opt/torchroot 中创建一个合适的 chroot

~/torchroot-setup.sh
#!/bin/sh
export TORCHROOT=/opt/torchroot

mkdir -p $TORCHROOT
mkdir -p $TORCHROOT/etc/tor
mkdir -p $TORCHROOT/dev
mkdir -p $TORCHROOT/usr/bin
mkdir -p $TORCHROOT/usr/lib
mkdir -p $TORCHROOT/usr/share/tor
mkdir -p $TORCHROOT/var/lib
mkdir -p $TORCHROOT/var/log/tor/

ln -s /usr/lib  $TORCHROOT/lib
cp /etc/hosts           $TORCHROOT/etc/
cp /etc/host.conf       $TORCHROOT/etc/
cp /etc/localtime       $TORCHROOT/etc/
cp /etc/nsswitch.conf   $TORCHROOT/etc/
cp /etc/resolv.conf     $TORCHROOT/etc/

cp /usr/bin/tor         $TORCHROOT/usr/bin/
cp /usr/share/tor/geoip* $TORCHROOT/usr/share/tor/
cp /lib/libnss* /lib/libnsl* /lib/ld-linux-*.so* /lib/libresolv* /lib/libgcc_s.so* $TORCHROOT/usr/lib/
cp $(ldd /usr/bin/tor | awk '{print $3}'|grep --color=never "^/") $TORCHROOT/usr/lib/

### /var/log/tor/notices.log is only needed if you run hidden services
# cp /var/log/tor/notices.log $TORCHROOT/var/log/tor/

cp -r /var/lib/tor      $TORCHROOT/var/lib/
cp /etc/tor/torrc       $TORCHROOT/etc/tor/

chown tor:tor $TORCHROOT
chmod 700 $TORCHROOT
chown -R tor:tor $TORCHROOT/var/lib/tor
chown -R tor:tor $TORCHROOT/var/log/tor

sh -c "grep --color=never ^tor /etc/passwd > $TORCHROOT/etc/passwd"
sh -c "grep --color=never ^tor /etc/group > $TORCHROOT/etc/group"

mknod -m 644 $TORCHROOT/dev/random c 1 8
mknod -m 644 $TORCHROOT/dev/urandom c 1 9
mknod -m 666 $TORCHROOT/dev/null c 1 3

if [ "$(uname -m)" = "x86_64" ]; then
  cp /usr/lib/ld-linux-x86-64.so* $TORCHROOT/usr/lib/.
  ln -sr /usr/lib64 $TORCHROOT/lib64
  ln -s $TORCHROOT/usr/lib ${TORCHROOT}/usr/lib64
fi

以 root 身份运行脚本后,可以使用以下命令在 chroot 中启动 Tor

# chroot --userspec=tor:tor /opt/torchroot /usr/bin/tor

或者,如果您使用 systemd,请重载该服务

/etc/systemd/system/tor.service.d/chroot.conf
[Service]
User=root
ExecStart=
ExecStart=/usr/bin/sh -c "chroot --userspec=tor:tor /opt/torchroot /usr/bin/tor -f /etc/tor/torrc"
KillSignal=SIGINT

在使用虚拟网络接口的 systemd-nspawn 容器中运行 Tor

在本示例中,我们将创建一个名为 tor-exitsystemd-nspawn 容器,该容器具有虚拟 macvlan 网络接口。

有关完整文档,请参见 systemd-nspawnsystemd-networkd

主机安装与配置

在本示例中,容器将驻留在 /srv/container

# mkdir /srv/container/tor-exit

安装 arch-install-scripts

按照 systemd-nspawn#创建并启动最小 Arch Linux 容器 中的说明安装 basetornyx

# pacstrap -K -ci /srv/container/tor-exit base tor nyx

如果目录不存在,则创建目录

# mkdir /var/lib/container

按照 systemd-nspawn#管理 中的说明创建符号链接以在主机上注册容器

# ln -s /srv/container/tor-exit /var/lib/container/tor-exit

虚拟网络接口

为容器创建一个 drop-in 配置文件

/etc/systemd/nspawn/tor-exit.nspawn
[Network]
MACVLAN=interface

[Exec]
LimitNOFILE=65536

MACVLAN=interface 创建一个名为 mv-interface 的“macvlan”接口,并将其分配给容器,有关详细信息,请参见 systemd-nspawn#使用“macvlan”或“ipvlan”接口。为了安全起见,建议这样做,因为它允许您为容器提供私有 IP,并且容器将不知道您机器的 IP 是什么。这可以帮助混淆 DNS 请求。

LimitNOFILE=65536,根据 #提高最大打开文件描述符数量

根据您的网络在 /srv/container/tor-exit/etc/systemd/network/mv-interface.network 中设置 systemd-networkd

启动并启用 systemd-nspawn

启动/启用 systemd-nspawn@tor-exit.service

容器配置

登录到容器(参见 systemd-nspawn#machinectl

# machinectl login tor-exit 

启动并启用 systemd-networkd

启动 并启用 systemd-networkd.servicenetworkctl 显示 systemd-networkd 是否配置正确。

配置 Tor

参见 #运行 Tor 服务器

提示: 从主机使用您的常用编辑器编辑容器中的文件会更容易。

网页浏览

匿名浏览的唯一方法是使用受支持的 Tor Browser Bundle,它使用 Firefox 的修补版本。可以使用 torbrowser-launcher 软件包安装它。

Tor 也可以与常规浏览器一起使用:参见 #Firefox#Chromium 以通过 Tor 网络运行这些浏览器。请注意,即使在“隐私浏览”模式下,这也不是匿名浏览的方式:指纹识别、插件、DNS 泄漏和其他缺点可能会泄露您的 IP 地址或身份。[2]

Firefox

首选项 > 常规 > 网络设置 > 设置... 中,选择手动代理配置,然后输入 SOCKS 主机 localhost,端口为 9050 (SOCKS v5)。

Chromium

您可以简单地运行

$ chromium --proxy-server="socks5://myproxy:8080" --host-resolver-rules="MAP * ~NOTFOUND , EXCLUDE myproxy"

--proxy-server="socks5://myproxy:8080" 标志告诉 Chrome 通过 SOCKS 代理服务器 "myproxy:8080" 发送所有 http://https:// URL 请求,使用 SOCKS 协议的第 5 版。这些 URL 的主机名将由代理服务器解析,而不是由 Chrome 本地解析。

注意: 通过 SOCKS 代理代理 ftp:// URL 尚未实现[3]

--proxy-server 标志仅适用于 URL 加载。Chrome 的其他组件可能会直接发出 DNS 解析,从而绕过此代理服务器。最值得注意的此类组件是“DNS 预取器”。因此,如果在 Chrome 中未禁用 DNS 预取,那么即使您已指定 SOCKS v5 代理服务器,您仍然会看到 Chrome 发出本地 DNS 请求。禁用 DNS 预取可以解决此问题,但这是一种脆弱的解决方案,因为需要意识到 Chrome 中发出原始 DNS 请求的所有区域。为了解决这个问题,下一个标志 --host-resolver-rules="MAP * ~NOTFOUND , EXCLUDE myproxy" 是一种通用的方法,可防止 Chrome 通过网络发送任何 DNS 请求。它表示所有 DNS 解析都应简单地映射到(无效)地址 ~NOTFOUND(可以将其视为 0.0.0.0)。"EXCLUDE" 子句为 "myproxy" 创建了一个例外,因为否则 Chrome 将无法解析 SOCKS 代理服务器本身的地址,并且所有请求都必然会因 PROXY_CONNECTION_FAILED 而失败。

要防止 WebRTC 泄漏,您可以安装扩展程序 WebRTC Network Limiter

注意: 对于 Electron 应用程序,您不需要 --host-resolver-rules

调试

调试时要检查的第一件事是查看 about:net-internals 上的“代理”选项卡,并验证有效的代理设置是什么:chrome://net-internals/#proxy

接下来,查看 about:net-internals 的“DNS”选项卡,以确保 Chrome 未发出本地 DNS 解析:chrome://net-internals/#dns

扩展

与 Firefox 一样,您可以设置快速切换,例如通过 Proxy SwitchySharp

安装后,进入其配置页面。在代理配置文件选项卡下,添加一个新配置文件Tor,如果已勾选,则取消勾选为所有协议使用相同的代理服务器选项,然后添加 localhost 作为 SOCKS 主机,9050 作为相应端口,然后选择 SOCKS v5

(可选)您可以启用常规选项卡下的快速切换,以便仅通过左键单击 Proxy SwitchySharp 的图标即可在正常导航和 Tor 网络之间切换。

Electron

参见 #Chromium

Luakit

注意: 观察者通过罕见的用户代理字符串识别您并不困难,并且 Flash、JavaScript 或类似技术可能存在更多问题。

您可以简单地运行

$ torsocks luakit

HTTP 代理

Tor 提供内置的隧道 HTTP 代理,也可以与 HTTP 代理(如 Privoxy)一起使用,但 Tor 开发团队建议使用 SOCKS5 库,因为浏览器直接支持它。

Tor

将以下行添加到您的 torrc 文件,以将端口 8118 在您的 localhost 上设置为 HTTP 代理

HTTPTunnelPort 127.0.0.1:8118

有关更多信息,请参阅 Tor 手册

Firefox

FoxyProxy 附加组件允许您为不同的 URL 或所有浏览指定多个代理。重启 Firefox 后,手动将 Firefox 设置为 localhost 上的端口 8118,这是 Privoxy 正在运行的位置。可以在添加 > 标准代理类型下访问这些设置。选择代理标签(例如 Tor),然后在HTTP 代理SSL 代理字段中输入端口和主机。要检查 Tor 是否正常运行,请访问 Tor 检查 网站并切换 Tor。

Privoxy

您也可以在其他应用程序(如消息传递应用程序)(例如 JabberIRC 客户端)中使用此设置。支持 HTTP 代理的应用程序可以连接到 Privoxy(即 127.0.0.1:8118)。要直接使用 SOCKS 代理,您可以将您的应用程序指向 Tor(即 127.0.0.1:9050)。但是,这种方法的一个问题是,自行进行 DNS 解析的应用程序可能会泄漏信息。考虑使用 Socks4A(例如,与 Privoxy 一起使用)来代替。

即时通讯

为了将即时通讯客户端与 tor 一起使用,我们不需要像 privoxy 这样的 HTTP 代理。我们将直接使用 tor 的守护程序,该守护程序默认监听端口 9050。

Pidgin

您可以设置 Pidgin 以全局或按帐户使用 Tor。要全局使用 Tor,请转到工具 -> 首选项 -> 代理。要为特定帐户使用 Tor,请转到帐户 > 管理帐户,选择所需的帐户,单击“修改”,然后转到“代理”选项卡。代理设置如下

Proxy type: SOCKS 5
Host: 127.0.0.1
Port: 9050

Irssi

本文或章节已过时。

原因: cap_sasl.plperl 5.20 中已损坏;SSL 也无法与 torsocks 一起使用(在 Talk:Tor 中讨论)

Libera Chat 建议直接连接到 .onion。它还需要 SASL 在连接期间向 NickServ 标识身份;请参见 Irssi#使用 SASL 验证身份。启动 irssi

$ torsocks irssi

将您的身份验证设置为 nickserv,这将在连接时读取。支持的机制是 ECDSA-NIST256P-CHALLENGE(参见 ecdsatool)和 PLAIN。DH-BLOWFISH 不受支持

/sasl set network username password mechanism

禁用 CTCP 和 DCC 并设置不同的主机名以防止信息泄露:[4]

/ignore * CTCPS
/ignore * DCC
/set hostname fake_host

连接到 Libera Chat

/connect -network network libera75jm6of4wxpxt4aynol3xjmbtxgfyjpu34ss4d7r7q2v5zrpyd.onion

有关更多信息,请查看 通过 Tor 访问 Libera.Chat使用 SASLIRC/SILC Wiki 文章

Pacman

Pacman 下载操作(仓库数据库、软件包和公钥)可以使用 Tor 网络完成。

优点

  • 可以监视您的 Internet 连接并专门针对您的机器的攻击者无法再监视更新,因此,他们无法推断出您已安装的软件包、它们的更新程度、您何时或多久更新一次它们。攻击者仍然可以通过其他方式了解您使用的软件和版本,例如监视来自您的 HTTP 服务器的数据包或探测机器将显示您已安装 HTTP 服务器及其版本。
  • 如果镜像不是 Onion 站点,那么您正在通过的恶意出口节点可以监视更新,并可能决定攻击您,但是他们可能无法知道他们正在攻击谁。
  • 攻击者试图让你的机器认为没有新的更新,以阻止其获取安全修复,这样做会更加困难,因为他们无法专门针对你的机器。

缺点

  • 由于更长的延迟和更低的吞吐量,更新时间更长。如果/当需要尽快完成更新时,这可能是一个很大的安全风险,尤其是在直接连接到互联网的机器上。当存在巨大的安全漏洞,并且漏洞很容易被探测、容易被利用,以及攻击者已经开始在系统更新之前尽可能多地攻击系统时,情况就是如此。

Tor 的可靠性

  • 你不再需要工作的 DNS。
  • 你依赖于 Tor 网络和出口节点不阻止更新。
  • 你依赖于 Tor 守护进程正常工作。如果 Tor 守护进程没有足够的磁盘空间可用,则可能无法工作。ext4 中的“保留块 gid:”、配额或其他方法可以解决这个问题。
  • 如果你所在的国家/地区 Tor 被阻止,或者几乎没有或根本没有 Tor 用户,你应该使用网桥。

关于 GPG 的注意事项:在原版 Arch 系统上,pacman 只信任由你签名的密钥(可以使用 pacman-key --lsign-key 完成)或由 5 个 Arch 主密钥中的 3 个签名的密钥。如果恶意出口节点用其密钥签名的软件包替换软件包,pacman 将不允许用户安装该软件包。

注意: 这对于从 ARCH 派生的其他发行版、非官方存储库和 AUR 可能不适用
/etc/pacman.conf
...
XferCommand = /usr/bin/curl --socks5-hostname localhost:9050 --location --continue-at - --fail --output %o %u
...
注意: 由于数据库签名正在进行中,你可能会收到 404 错误。根据你的Pacman/软件包签名#配置 pacman,这应该是无害的。

Java

可以通过附加以下命令行选项,确保 Java 应用程序代理 通过 Tor 运行其连接

export JAVA_OPTIONS="$JAVA_OPTIONS -DsocksProxyHost=localhost -DsocksProxyPort=9050"

运行 Tor 服务器

Tor 网络依赖于人们贡献带宽和设置服务。有几种方法可以为网络做出贡献。

运行 Tor 网桥

Tor 网桥是一个未在公共 Tor 目录中列出的 Tor 中继,因此当政府或 ISP 阻止所有公共 Tor 中继时,人们可以连接到 Tor 网络。访问 https://bridges.torproject.org/ 以获取更多信息和关于如何获取网桥地址的说明。

要运行 Tor 网桥,请使你的 torrc 配置文件仅包含以下四行(另请参阅 Tor 项目运行网桥

SOCKSPort 0
ORPort 443
BridgeRelay 1
ExitRelay 0

运行 Tor 中继

这意味着你的机器将充当入口节点或转发中继,并且与网桥不同,它将被列在公共 Tor 目录中。你的 IP 地址将在 Tor 目录中公开可见,但中继只会转发到其他中继或 Tor 出口节点,而不会直接转发到互联网。

要运行 Tor 中继,请将以下选项添加到 torrc 配置文件,你至少应共享 20KiB/s 的带宽

Nickname tornickname
ORPort 9001                  # This TCP-Port has to be opened/forwarded in your Firewall
BandwidthRate 20 KB          # Throttle traffic to 20KB/s
BandwidthBurst 50 KB         # But allow bursts up to 50KB/s
ExitRelay 0                  # Disallow exits from your relay

运行 Tor 出口节点

任何来自 Tor 用户到常规互联网的请求显然都需要在某个地方退出网络,而出口节点提供了这项至关重要的服务。对于被访问的主机,请求将显示为源自你的机器。这意味着运行出口节点通常被认为比运行其他形式的 Tor 中继在法律上更麻烦。在成为出口中继之前,你可能需要阅读 Tor 项目 - 运行出口节点的提示

配置

使用 torrc,你可以配置希望允许哪些服务通过你的出口节点。

使中继成为出口中继

ExitRelay 1

允许所有流量

ExitPolicy accept *:*

仅允许 IRC 端口 6660-6667 出口,但不允许其他任何端口从节点出口

ExitPolicy accept *:6660-6667,reject *:*

默认情况下,Tor 将阻止某些端口。你可以使用 torrc 来覆盖此设置,例如接受 NNTP

ExitPolicy accept *:119

+100Mbps 出口中继配置示例

本文或章节已过时。

原因: 应该可能从旧的 iptables 切换到 nftables。此外,审查在今年仍然被认为是“快速中继”的标准。(在 Talk:Tor 中讨论)

如果你运行一个快速出口中继(+100Mbps),使用 ORPort 443DirPort 80,以下配置更改可能作为灵感,用于设置 Tor 以及 iptables 防火墙和 pdnsd 作为 DNS 缓存。重要的是首先阅读 中继安装后设置和良好实践

注意: 有关在带有虚拟网络接口的 systemd-nspawn 容器中安装 Tor 的说明,请参阅 #在带有虚拟网络接口的 systemd-nspawn 容器中运行 Tor
Tor
提高最大打开文件描述符数

为了处理超过 8192 个连接,可以提高 LimitNOFILE [5]

/etc/systemd/system/tor.service.d/increase-file-limits.conf
[Service]
LimitNOFILE=65536

为了成功提高 nofile 限制,你可能还需要附加以下内容

/etc/security/limits.conf
...
tor     soft    nofile    65536
tor     hard    nofile    65536
@tor    soft    nofile    65536
@tor    hard    nofile    65536

以 tor 用户身份使用 ulimit -Hn 检查 nofile(文件描述符)限制是否成功提高。

以 root 身份启动 tor.service 以将 Tor 绑定到特权端口

要将 Tor 绑定到特权端口,必须以 root 身份启动服务。请在 /etc/tor/torrc 中指定 User tor 选项。

/etc/systemd/system/tor.service.d/start-as-root.conf
[Service]
User=root
Tor 配置

配置示例

/etc/tor/torrc
SOCKSPort 0                                       ## Pure relay configuration without local socks proxy

Log notice stdout                                 ## Default Tor behavior

ControlPort 9051                                  ## For nyx connection
CookieAuthentication 1                            ## For nyx connection

ORPort 443                                        ## Service must be started as root

Address $IP                                       ## IP or FQDN
Nickname $NICKNAME                                ## Nickname displayed in Tor Relay Search

RelayBandwidthRate 500 Mbits                      ## bytes/KBytes/MBytes/GBytes/KBits/MBits/GBits
RelayBandwidthBurst 1000 MBits                    ## bytes/KBytes/MBytes/GBytes/KBits/MBits/GBits

ContactInfo $E-MAIL                               ## Tor Relay good practices suggests an email

DirPort 80                                        ## Service must be started as root
DirPortFrontPage /etc/tor/tor-exit-notice.html    ## Original

MyFamily $($KEYID),$($KEYID)...                   ## Remember $ in front of keyid(s) ;)

ExitPolicy reject XXX.XXX.XXX.XXX/XX:*            ## Block domain of public IP in addition to std. exit policy

User tor                                          ## Return to tor user after service started as root

DisableDebuggerAttachment 0                       ## For nyx connection

### Performance related options ###
AvoidDiskWrites 1                                 ## Reduce wear on SSD
DisableAllSwap 1                                  ## Service must be started as root
HardwareAccel 1                                   ## Look for OpenSSL hardware cryptographic support
NumCPUs 2                                         ## Only start two threads

有关详细信息,请参阅 tor(1)

Tor 默认在端口 9050 上打开一个 socks 代理——即使你没有配置。如果你计划仅将 Tor 作为中继运行,而不进行任何本地应用程序连接,请设置 SOCKSPort 0

Log notice stdout 将日志记录更改为 stdout,这也是 Tor 的默认设置。

ControlPort 9051CookieAuthentication 1DisableDebuggerAttachment 0 启用 nyx 连接到 Tor 并显示连接。

ORPort 443DirPort 80 使 Tor 监听端口 443 和 80。

DirPortFrontPage 在端口 80 上显示 tor-exit-notice.html

ExitPolicy reject XXX.XXX.XXX.XXX/XX:* 应反映你的公共 IP 和网络掩码,可以使用命令 ip addr 获取,以便出口连接无法连接到主机或相邻机器的公共 IP 并绕过防火墙。

AvoidDiskWrites 1 减少磁盘写入和 SSD 磨损。

DisableAllSwap 1 “将尝试锁定所有当前和未来的内存页,以便内存不会被换出”。

如果 grep aes /proc/cpuinfo 返回你的 CPU 支持 AES 指令,并且 lsmod | grep aes 返回模块已加载,你可以指定 HardwareAccel 1,它会尝试“在可用时使用内置(静态)加密硬件加速”,请参阅 https://www.torservers.net/wiki/setup/server#aes-ni_crypto_acceleration

ORPort 443DirPort 80DisableAllSwap 1 需要你以 root 身份启动 Tor 服务,如 #以 root 身份启动 tor.service 以将 Tor 绑定到特权端口 中所述。

使用 User tor 选项来正确降低 Tor 的权限。

nyx

如果在 /etc/tor/torrc 中指定了 ControlPort 9051CookieAuthentication 1,则 nyx 可以作为 tor 用户启动

[tor]$ nyx

如果你想在 nyx 中观看 Tor 连接,则还必须指定 DisableDebuggerAttachment 0

如果你想以不同于 tor 的用户身份运行 nyx,请阅读 #设置 Tor 控制 cookie 文件 部分

iptables

设置并学习使用 iptables。与其成为 简单有状态防火墙(其中连接跟踪必须跟踪 tor 出口中继上的数千个连接),不如说此防火墙配置是无状态的。

/etc/iptables/iptables.rules
*raw
-A PREROUTING -j NOTRACK
-A OUTPUT -j NOTRACK
COMMIT

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -p tcp ! --syn -j ACCEPT
-A INPUT -p udp -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -i lo -j ACCEPT
COMMIT

-A PREROUTING -j NOTRACK-A OUTPUT -j NOTRACK 禁用 raw 表中的连接跟踪。

:INPUT DROP [0:0] 是默认的 INPUT 目标,并丢弃我们没有专门 ACCEPT 的输入流量。

:FORWARD DROP [0:0] 是默认的 FORWARD 目标,仅当主机是普通路由器时才相关,当主机是 onion 路由器时则不相关。

:OUTPUT ACCEPT [0:0] 是默认的 OUTPUT 目标,并允许所有传出连接。

-A INPUT -p tcp ! --syn -j ACCEPT 允许每个以下规则的已建立的传入 TCP 连接,以及从出口节点建立的 TCP 连接。

-A INPUT -p udp -j ACCEPT 允许所有传入 UDP 连接,因为我们不使用连接跟踪。

-A INPUT -p icmp -j ACCEPT 允许 ICMP

-A INPUT -p tcp --dport 443 -j ACCEPT 允许传入到 ORPort 的连接。

-A INPUT -p tcp --dport 80 -j ACCEPT 允许传入到 DirPort 的连接。

-A INPUT -i lo -j ACCEPT 允许环回接口上的所有连接。

pdnsd
警告: 此配置假定你的网络 DNS 解析器是受信任的(未审查的)。

你可以使用 pdnsd 在本地缓存 DNS 查询,以便出口中继可以更快地解析 DNS,并且出口中继不会将所有 DNS 查询转发到外部 DNS 递归器。

/etc/pdnsd.conf
...
perm_cache=102400                       ## (Default value)*100 = 1MB * 100 = 100MB
...
server {
    label= "resolvconf";
    file = "/etc/pdnsd-resolv.conf";    ## Preferably do not use /etc/resolv.conf
    timeout=4;                          ## Server timeout, this may be much shorter than the global timeout option.
    uptest=query;                       ## Test availability using empty DNS queries. 
    query_test_name=".";                ## To be used if remote servers ignore empty queries.
    interval=10m;                       ## Test every 10 minutes.
    purge_cache=off;                    ## Ignore TTL.
    edns_query=yes;                     ## Use EDNS for outgoing queries to allow UDP messages larger than 512 bytes. May cause trouble with some legacy systems.
    preset=off;                         ## Assume server is down before uptest.
 }
...

此配置存根显示了如何将查询缓存到本地的普通 DNS 递归器,并将 pdnsd 缓存大小增加到 100MB。

未审查的 DNS

如果你的本地 DNS 递归器在某种程度上受到审查或干扰 DNS 查询,请参阅 备用 DNS 服务 以获取替代方案,并按照 Pdnsd#DNS 服务器 中的说明,在单独的 server-section 中添加它们。

确保中继正常工作

首先检查 tor.service 是否已正确启动,可以使用 日志 或检查 单元状态

如果没有错误,可以运行 nyx 以确保你的中继正在建立连接。如果你的 新中继 最初速度较慢,请不要担心;这是正常的。大约 3 小时后,你的中继应该会被发布,并且可以在 中继搜索 上搜索到。

TorDNS

可以使用 tor-resolve 通过命令行界面执行 DNS 查询。例如

$ tor-resolve archlinux.org
66.211.214.131

Tor 0.2.x 系列还提供了一个内置的 DNS 转发器。要启用它,请将以下行添加到 Tor 配置文件并重启守护进程

/etc/tor/torrc
DNSPort 9053
AutomapHostsOnResolve 1
AutomapHostsSuffixes .exit,.onion

这将允许 Tor 像常规 DNS 服务器一样接受 DNS 请求(在本例中监听端口 9053),并通过 Tor 网络解析域名。

这两种方法的缺点是它们只能解析 A、AAAA 和 PTR 记录的 DNS 查询;MX 和 NS 查询永远不会得到解答。有关更多信息,请参阅此 基于 Debian 的介绍

系统范围使用 TorDNS

如果需要,可以配置你的系统,以便系统进行的任何 A、AAAA 和 PTR 查询都使用 TorDNS,无论你最终是否使用 Tor 连接到最终目的地。为此,请配置你的系统使用 127.0.0.1 作为其 DNS 服务器,并编辑 /etc/tor/torrc 中的 DNSPort 行以显示

DNSPort 53

或者,你可以使用本地缓存 DNS 服务器,例如 dnsmasqpdnsd,这也将补偿 TorDNS 比传统 DNS 服务器稍慢的缺点。以下说明将展示如何为此目的设置dnsmasq。注意,如果你正在使用NetworkManager,你需要将你的配置文件添加到 NetworkManager#dnsmasq 中概述的位置。

更改 tor 设置以监听端口 9053 中的 DNS 请求,并安装 dnsmasq

修改其配置文件,使其包含

/etc/dnsmasq.conf
no-resolv
port=53
server=127.0.0.1#9053
listen-address=127.0.0.1

这些配置将 dnsmasq 设置为仅监听来自本地计算机的请求,并将 TorDNS 用作其唯一的上游提供商。现在有必要编辑 /etc/resolv.conf,以便你的系统将仅查询 dnsmasq 服务器。

/etc/resolv.conf
nameserver 127.0.0.1

启动 dnsmasq 守护进程。

最后,如果你使用 dhcpcd,你需要更改其设置,使其不会更改 resolv 配置文件。只需在配置文件中添加此行

/etc/dhcpcd.conf
nohook resolv.conf

如果你已经有 nohook 行,只需添加以逗号分隔的 resolv.conf

Torsocks

torsocks 将允许你通过 Tor 网络使用应用程序,而无需对所涉及的应用程序进行配置更改。来自 torsocks(1)

torsocks 是 torsocks 库和应用程序之间的包装器,目的是使每个互联网通信都通过 Tor 网络。

有关 torsocks 与其前身的比较,请参阅 此处。请注意,包装器故意且冗长地使某些系统调用失败。因此,某些应用程序无法完全使用它。请参阅 torsocks-and-unsupported-syscalls

使用示例

$ torsocks elinks checkip.dyndns.org
$ torsocks wget -qO- https://check.torproject.org/ | grep -i congratulations

透明 Tor 化

在某些情况下,透明地 Tor 化整个系统比配置单个应用程序以使用 Tor 的 socks 端口更安全且通常更容易,更不用说防止 DNS 泄漏了。透明 Tor 化可以使用 iptables 以这样一种方式完成,即所有出站数据包都通过 Tor 的 TransPort 重定向,除了 Tor 流量本身。一旦就位,应用程序无需配置为使用 Tor,尽管 Tor 的 SOCKSPort 仍然有效。这也适用于通过 Tor 的 DNSPort 的 DNS,但要意识到 Tor 仅支持 TCP,因此 DNS 以外的 UDP 数据包无法通过 Tor 发送,因此必须完全阻止以防止泄漏。

使用 iptables 透明地 Tor 化系统提供了相对强大的泄漏保护,但这不能替代虚拟化 Tor 化应用程序,例如 Whonix 或 TorVM [6]。透明 Tor 化本身也不能防止指纹识别攻击,因此建议使用像 Tails 这样的失忆解决方案。应用程序仍然可以了解你计算机的主机名、MAC 地址、序列号、时区等,并且具有 root 权限的应用程序可以完全禁用防火墙。换句话说,使用 iptables 的透明 Tor 化可防止配置错误的软件的意外连接和 DNS 泄漏,但不足以防止恶意软件或具有严重安全漏洞的软件。

当使用透明代理时,可以从客户端以及透明代理启动 Tor 会话,从而创建“Tor over Tor”场景。这样做会产生未定义且可能不安全的行为。理论上,用户可以在 Tor 网络中获得六跳而不是三跳。但是,不能保证收到的三个附加跳是不同的;用户最终可能会得到相同的跳,可能以相反或混合的顺序排列。Tor 项目的观点是,这是不安全的 [7] [8]

要启用透明 Tor 化,请对 iptables-restoreip6tables-restore 使用以下文件(在内部由 systemdiptables.serviceip6tables.service 使用)。

注意: 此文件使用 NAT 表强制传出连接通过 TransPort 或 DNSPort,并阻止任何无法 Tor 化的内容。
  • 现在对协议特定的更改使用 --ipv6--ipv4iptables-restoreip6tables-restore 现在可以使用相同的文件。
  • 如果明确定义了 --ipv6--ipv4,则 ip*tables-restore 将忽略不适用于正确协议的规则。
  • ip6tables 不支持 --reject-with

确保你的 torrc 包含以下行

SOCKSPort 9050
DNSPort 5353
TransPort 9040

请参阅 iptables(8)

注意: 如果你收到此错误:iptables-restore: unable to initialize table 'nat',你必须加载相应的内核模块
# modprobe ip_tables iptable_nat ip_conntrack iptable-filter ipt_state
/etc/iptables/iptables.rules
*nat
:PREROUTING ACCEPT [6:2126]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [17:6239]
:POSTROUTING ACCEPT [6:408]

-A PREROUTING ! -i lo -p udp -m udp --dport 53 -j REDIRECT --to-ports 5353
-A PREROUTING ! -i lo -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j REDIRECT --to-ports 9040
-A OUTPUT -o lo -j RETURN
--ipv4 -A OUTPUT -d 192.168.0.0/16 -j RETURN
-A OUTPUT -m owner --uid-owner "tor" -j RETURN
-A OUTPUT -p udp -m udp --dport 53 -j REDIRECT --to-ports 5353
-A OUTPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j REDIRECT --to-ports 9040
COMMIT

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]

-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
--ipv4 -A INPUT -p tcp -j REJECT --reject-with tcp-reset
--ipv4 -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
--ipv4 -A INPUT -j REJECT --reject-with icmp-proto-unreachable
--ipv6 -A INPUT -j REJECT
--ipv4 -A OUTPUT -d 127.0.0.0/8 -j ACCEPT
--ipv4 -A OUTPUT -d 192.168.0.0/16 -j ACCEPT
--ipv6 -A OUTPUT -d ::1/8 -j ACCEPT
-A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -m owner --uid-owner "tor" -j ACCEPT
--ipv4 -A OUTPUT -j REJECT --reject-with icmp-port-unreachable
--ipv6 -A OUTPUT -j REJECT
COMMIT

此文件也适用于 ip6tables-restore,因此你可以符号链接它

# ln -s /etc/iptables/iptables.rules /etc/iptables/ip6tables.rules

然后确保 Tor 正在运行,并启动/启用 iptablesip6tables systemd 单元。

你可能希望将 Requires=iptables.serviceRequires=ip6tables.service 添加到任何 systemd 单元中,该单元记录你的用户登录(很可能是显示管理器),以防止任何用户进程在防火墙启动之前启动。请参阅 systemd

技巧和窍门

内核 capabilities

如果你想以非 root 用户身份运行 tor,并使用低于 1024 的端口,你可以使用内核 capabilities 允许 /usr/bin/tor 绑定到低于 1024 的端口

# setcap CAP_NET_BIND_SERVICE=+eip /usr/bin/tor
注意: 任何 tor 软件包的升级都将重置权限,请考虑使用 pacman#Hooks,以便在升级后自动设置权限。

如果你使用 systemd 服务,也可以使用 systemd 为 tor 进程提供适当的权限。这样做的好处是,每次 tor 升级后都不需要重新应用权限

/etc/systemd/system/tor.service.d/netcap.conf
[Service]
CapabilityBoundingSet=
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=
AmbientCapabilities=CAP_NET_BIND_SERVICE

有关更多解释,请参阅 superuser.com

故障排除

用户值问题

如果 tor 守护进程启动失败,则以 root 身份运行以下命令(或使用 sudo

# tor

如果你收到以下错误

May 23 00:27:24.624 [warn] Error setting groups to gid 43: "Operation not permitted".
May 23 00:27:24.624 [warn] If you set the "User" option, you must start Tor as root.
May 23 00:27:24.624 [warn] Failed to parse/validate config: Problem with User value. See logs for details.
May 23 00:27:24.624 [err] Reading config failed--see warnings above.

那么这意味着问题出在 User 值上,这很可能意味着你的 /var/lib/tor 目录中的一个或多个文件或目录不归 tor 所有。可以使用以下 find 命令确定这一点

# find /var/lib/tor/ '!' -user tor

从此命令的输出中列出的任何文件或目录都需要更改其所有权。可以像这样为每个文件单独完成此操作

# chown tor:tor /var/lib/tor/filename

或者要更改上述 find 示例列出的所有内容,请将命令修改为这样

# chown -R -v tor:tor /var/lib/tor

Tor 现在应该可以正确启动了。

如果仍然无法启动 tor 服务,请使用 root 运行服务(这将切换回 tor 用户)。为此,请更改 /etc/tor/torrc 文件中的用户名

User tor

现在编辑 tor.service 如下

[Service]
User=root
Group=root
Type=simple

该进程将以 tor 用户身份运行。为此,请将用户和组 ID 更改为 tor,并使其可写

# chown -R tor:tor /var/lib/tor/
# chmod -R 700 /var/lib/tor

现在执行 daemon-reload,然后启动 tor.service

Tor 浏览器代理问题

Tor 浏览器通常应该在没有重大自定义的情况下工作。如果先前安装/配置的捆绑代理对于任何网站都失败并显示 proxy server is refusing connections,请考虑通过移动或删除 ~/.local/share/torbrowser/ 目录来重置设置。

tor-browser 空白黑屏

如果使用 AppArmor,请更新 torbrowser 配置文件以允许访问所需资源 [9][10]

/etc/apparmor.d/local/torbrowser.Browser.firefox
owner /{dev,run}/shm/org.mozilla.*.* rw,

另请参阅