跳转至内容

Tor

来自 ArchWiki

The Tor Project (The onion routing) is an open source implementation of onion routing that provides free access to an anonymous proxy network. Its primary goal is to enable online anonymity by protecting against traffic analysis attacks.

Users of the Tor network run an onion proxy software on their machines, which presents a SOCKS interface to its clients. This software connects out to Tor, periodically negotiating a virtual circuit through the Tor network. Tor employs cryptography in a layered manner (hence the 'onion' analogy), ensuring forward secrecy between routers.

Through this process the onion proxy manages networking traffic for end-user anonymity. It keeps a user anonymous by encrypting traffic, sending it through other nodes of the Tor network, and decrypting it at the last node to receive your traffic before forwarding it to the server you specified. One trade off is that using Tor can be considerably slower than a regular direct connection, due to the large amount of traffic re-routing. Additionally, although Tor provides protection against traffic analysis it cannot prevent traffic confirmation at the boundaries of the Tor network (i.e. the traffic entering and exiting the network). See Wikipedia:Tor (anonymity network) for more information.

Note Tor by itself is not all you need to maintain anonymity. There are several major pitfalls to watch out for (see Am I totally anonymous if I use Tor?).

安装

安装 torbrowser-launcher 包以使用 Tor Browser,这是使用 Tor 匿名浏览网页的唯一支持方式。

有意手动使用 Tor 与其他软件、运行节点托管洋葱服务的用户应安装 tor 包。本文大部分内容涵盖此用途。

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

用法

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

[tor]$ /usr/bin/tor

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

提示 如果存在多个条目,Tor 默认将执行监听器之间的流隔离。

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

要检查 Tor 是否正常工作,请使用 Tor Browser 或 CURL 访问 https://check.torproject.org/

$ curl -x socks5h://:9050 -s https://check.torproject.org

配置

Tor 默认从文件 /etc/tor/torrc 读取其配置,或者如果后者不存在,则从 $HOME/.torrc 读取。配置选项在 tor(1) 中进行了解释。

启用后支持插入文件

/etc/tor/torrc
%include /etc/torrc.d/*.conf

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

Tor ControlPort

某些程序可能需要访问您的 Tor ControlPort 以获得对您的 Tor 节点的低级控制。

ControlPort 允许其他程序在 Tor 节点运行时监视和修改其配置,或者获取有关 Tor 网络及其电路状态的详细信息。

要启用它,请将以下内容添加到您的 torrc

ControlPort 9051

来自 The Tor Control Protocol

出于安全考虑,流(Tor Control)不应被不受信任的方访问。

为了增强安全性,请使用 cookie 文件control 密码,或两者兼而有之,来限制对 ControlPort 的访问。

警告 仅授予受信任的进程和用户密码或 cookie 访问权限,因为它们可用于修改服务的任何配置选项。

Nyx

假设 ControlPort 9051 已在 torrc 中设置,您可以通过运行以下命令来启动 nyx

$ nyx

要在 nyx 中查看 Tor 连接 [1],请将以下内容添加到您的 torrc

DisableDebuggerAttachment 0
注意 不建议不受限制地运行 nyx。请遵循 #Set a Tor Control cookie file 和/或 #Set a Tor Control password

添加到您的 torrc

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

要应用更改,请重新启动 tor.service

启用 CookieAuthentication 通过强制 Tor cookie 文件和 Tor 数据目录的文件权限来限制对 ControlPort 的访问。

将用户添加到 tor 用户组以授予他们对 Tor cookie 文件的访问权限。

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

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

设置 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 domain Socket,请将以下内容添加到您的 torrc

ControlSocket /var/lib/tor/control_socket
ControlSocketsGroupWritable 1
DataDirectoryGroupReadable 1

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

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

验证 ControlSocket 权限

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

测试

要测试您的 ControlPort,请运行 openbsd-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.

有关更多命令,请参阅 The Tor Control Protocol

网页浏览

匿名浏览的唯一方法是使用受支持的 Tor Browser,它使用了修改过的 Firefox 版本。它可以通过 torbrowser-launcher 包进行安装。

注意 虽然 Tor 可以与常规浏览器一起使用,但不推荐这样做。即使在“隐私浏览”模式下,指纹识别、插件和 DNS 泄露等因素也可能暴露您的 IP 地址或身份。 [2]

HTTP 代理

Tor 提供了一个内置的隧道 HTTP 代理,也可以与像 Privoxy 这样的 HTTP 代理一起使用;然而,通常建议使用 SOCKS5 库。

Tor

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

HTTPTunnelPort 127.0.0.1:8118

有关更多信息,请参阅 Tor manual

Firefox

SmartProxy FoxyProxy Add-ons 允许您为不同的 URL 或所有浏览指定多个代理。手动重启 Firefox 后,将 Firefox 设置为 localhost 上的端口 8118,这是 Privoxy 运行的地方。这些设置可以在 Add > Standard proxy type 下访问。选择一个代理标签(例如 Tor),然后在 HTTP ProxySSL Proxy 字段中输入端口和主机。要检查 Tor 是否正常工作,请访问 Tor Check 网站并切换 Tor。

Privoxy

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

即时通讯

本文或本节正考虑移除。

原因:即时通讯客户端应在其各自的页面上记录 Tor 的使用情况,以避免在此页面上造成混乱。(在 Talk:Tor 中讨论)

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

Pidgin

您可以将 Pidgin 设置为全局使用 Tor,或按账户使用。要全局使用 Tor,请转到 Tools -> Preferences -> Proxy。要为特定账户使用 Tor,请转到 Accounts > Manage Accounts,选择所需的账户,点击 Modify,然后转到 Proxy 选项卡。代理设置如下

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 在连接时进行身份验证;请参阅 Irssi#Authenticating with SASL。启动 irssi

$ torsocks irssi

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

/sasl set network username password mechanism

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

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

连接到 Libera Chat

/connect -network network libera75jm6of4wxpxt4aynol3xjmbtxgfyjpu34ss4d7r7q2v5zrpyd.onion

有关更多信息,请参阅 Accessing Libera.Chat Via TorUsing SASLIRC/SILC Wiki article

Pacman

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

优点

  • 监控您互联网连接并专门针对您机器的攻击者将无法再观察到其更新。这使得他们难以推断您安装了哪些软件包、它们的版本或您的更新频率。但是,他们仍然可以通过其他方式了解您使用的软件和版本,例如通过观察来自您 HTTP 服务器的流量或探测机器,从而显示已安装的 HTTP 服务器及其版本。
  • 如果镜像不是洋葱服务,您 Tor 电路中的恶意出口节点可能会监视您的更新并决定攻击您,但它不太可能使您匿名化。
  • 试图阻止您的机器获得安全修复的攻击者,通过使其相信没有新更新,将面临更大的困难,因为他们无法专门针对您的机器。

缺点

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

Tor 的可靠性

  • 您不再需要有效的 DNS。
  • 您依赖 Tor 网络和出口节点不阻止更新。
  • 您依赖 Tor 守护进程正常工作。如果磁盘空间不足,Tor 守护进程可能无法工作。ext4 中的“Reserved blocks 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/Package signing#Configuring pacman,这应该是无害的。

运行 Tor 节点

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

一个典型的 Tor 电路包含

Tor User -> Guard Relay -> Middle Relay -> Exit Relay -> Destination (i.e. example.com)

有关更多信息,请参阅 官方文档Expectations for Relay Operators

运行中间/网关节点

也称为非出口节点:网关节点是 Tor 电路的第一个跳点,而中间节点是第二个跳点。

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

设置非出口节点,请参阅 [4][5]

运行 Tor 桥接节点

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

设置 Tor 桥接节点,请参阅 [6][7]

运行 Tor 出口节点

Tor 用户对常规互联网的任何请求都必须在某个点退出 Tor 网络,出口节点提供这项基本服务。对于目标主机来说,这些请求将看起来像是从您的机器发出的。这意味着运行出口节点通常比运行其他类型的 Tor 节点在法律上更繁琐。

在成为出口节点之前,强烈建议阅读 Legal resourcestips for running an exit node

要设置出口节点,请参阅 [8][9]

配置

本文或本节正考虑移除。

原因:超过 10 年的内容除了 官方文档外,几乎没有价值,包括可能错误的 iptables 规则,这些规则可能存在风险。此外,pdnsd 自 2012 年以来一直未得到维护。Tor Project 建议使用最新的防火墙规则和 unbound 进行 DNS。 [10][11] (在 Talk: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 缓存一起设置。重要的是要*首先*阅读 Relay Post-install and good practices

注意 有关在 systemd-nspawn 容器中安装 Tor 的说明,请参阅 #Running Tor in a systemd-nspawn container with a virtual network interface
Tor
提高打开文件描述符的最大数量

要处理超过 32768 个连接,可以提高 LimitNOFILE [12]

/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

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

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

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

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 要求您按 #Start tor.service as root to bind Tor to privileged ports 中所述以 root 身份启动 Tor 服务。

使用 User tor 选项可以正确降低 Tor 的特权。

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 NOTRACKraw 表中禁用连接跟踪。

:INPUT DROP [0:0] 是默认的 INPUT 目标,它会丢弃我们没有明确 ACCEPT 的输入流量。

:FORWARD DROP [0:0] 是默认的 FORWARD 目标,并且仅在主机是正常路由器时相关,而不是在主机是洋葱路由器时。

: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 查询,请参阅 Alternative DNS services 以获取替代方案,并根据 Pdnsd#DNS servers/etc/pdnsd.conf 中将它们添加到一个单独的 server-section 中。

确保节点正常运行

要验证您的 tor 节点的功能,请使用 journalunit status 检查 tor.service 是否已正确启动。如果没有错误,请运行 nyx 以确保您的节点正在建立连接。如果您的 新节点起初速度较慢,请不要担心;这是正常的。大约 3 小时后,您的节点应该会被发布并在 Relay Search 上搜索到。

Tor DNS

可以通过命令行界面使用 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-based introduction

提示 请参阅 [13] 以检查应用程序是否泄露 DNS 请求。

系统级使用 Tor DNS

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

DNSPort 53

或者,您可以使用本地缓存 DNS 服务器,例如 dnsmasqpdnsd,它们也能弥补 Tor DNS 比传统 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 设置为仅监听来自本地计算机的请求,并以 Tor DNS 作为其唯一的上游提供商。现在有必要编辑 /etc/resolv.conf,以便您的系统只查询 dnsmasq 服务器

/etc/resolv.conf
nameserver 127.0.0.1

启动 dnsmasq.service

最后,如果您使用 dhcpcd,则需要更改其设置,以便它不会修改 resolv.conf 文件。在配置文件中添加此行

/etc/dhcpcd.conf
nohook resolv.conf

如果您已经有一个 nohook 行,请用逗号分隔添加 resolv.conf

Torsocks

torsocks 允许您通过 Tor 网络使用应用程序,而无需对应用程序进行任何配置更改。来自 torsocks(1)

torsocks 是 torsocks 库和应用程序之间的包装器,旨在使所有 Internet 通信都通过 Tor 网络。

有关 torsocks 与其前身的比较,请参阅 [14]

注意 该包装器会故意且详细地针对某些系统调用失败,这会导致某些应用程序无法与其正常工作。请参阅 torsocks-and-unsupported-syscalls

使用示例

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

透明 Tor 化

本文或本章节的准确性存在争议。

原因:这些 iptables 规则在防止泄露方面有多好,为什么不直接使用 Whonix[15]?盲目地将它们应用到您的系统中可能不明智。(在 Talk:Tor 中讨论)

在某些情况下,透明 Tor 化整个系统比配置单个应用程序使用 Tor 的 socks 端口更安全,通常也更简单,更不用说防止 DNS 泄露了。透明 Tor 化可以使用 iptables 完成,通过将所有出站数据包重定向到 Tor 的 TransPort,除了 Tor 流量本身。一旦设置好,应用程序就不需要配置为使用 Tor,尽管 Tor 的 SOCKSPort 仍然可以使用。这同样适用于通过 Tor 的 DNSPort 进行 DNS,但请注意 Tor 只支持 TCP,因此除 DNS 外的 UDP 数据包无法通过 Tor 发送,因此必须完全阻止它们以防止泄露。

使用 iptables 透明化 Tor 可以提供相对强大的泄露防护,但它不能替代 Whonix 或 TorVM 等虚拟化 Tor 应用程序[16]。透明化 Tor 本身也不能防止指纹识别攻击,因此建议改用类似 Tails 这样的失忆解决方案。应用程序仍然可以获取您计算机的主机名、MAC 地址、序列号、时区等信息,并且拥有 root 权限的攻击者可以完全禁用防火墙。换句话说,使用 iptables 进行透明 Tor 化可以防止因软件配置错误而导致的意外连接和 DNS 泄露,但不足以防御恶意软件或具有严重安全漏洞的软件。

当使用透明代理时,可以从客户端以及从透明代理本身启动 Tor 会话,从而产生“Tor over Tor”的场景。这样做会产生未定义且可能不安全的行为。理论上,用户可以在 Tor 网络中获得六个节点而不是三个。然而,不能保证这三个额外的节点是不同的;用户最终可能得到相同的节点,可能顺序相反或混合。Tor 项目的观点是,这是不安全的[17][死链 2025-11-17—HTTP 404] [18]

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

注意 此文件使用 NAT 表强制将传出连接通过 TransPortDNSPort,并阻止任何无法 Tor 化连接的内容。通过启用 AutomapHostsOnResolve,Tor 将从 VirtualAddrNetworkIPv4 范围返回一个虚拟 IP 地址。此功能允许解析地址的应用程序无缝连接到 .onion 地址。
  • 现在使用 --ipv6--ipv4 进行协议特定的更改。iptables-restoreip6tables-restore 现在可以使用相同的文件。
  • 在显式定义了 --ipv6--ipv4 的地方,如果规则不是针对正确协议的,iptables-restore 将会忽略该规则。
  • ip6tables 不支持 --reject-with

确保您的 torrc 包含以下行

VirtualAddrNetworkIPv4 10.192.0.0/10
AutomapHostsOnResolve 1
TransPort 9040 IsolateClientAddr IsolateClientProtocol IsolateDestAddr IsolateDestPort
DNSPort 5353

请参阅 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 OUTPUT -d 10.192.0.0/10 -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j REDIRECT --to-ports 9040
-A OUTPUT -d 127.0.0.1/32 -p udp -m udp --dport 53 -j REDIRECT --to-ports 5353
-A OUTPUT -o lo -j RETURN
--ipv4 -A OUTPUT -d 192.168.0.0/16 -j RETURN
--ipv4 -A OUTPUT -d 172.16.0.0/12 -j RETURN
--ipv4 -A OUTPUT -d 10.0.0.0/8 -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
--ipv4 -A OUTPUT -d 172.16.0.0/12 -j ACCEPT
--ipv4 -A OUTPUT -d 10.0.0.0/8 -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

技巧与提示

内核能力

要以非 root 用户运行 Tor 并使用低于 1024 的端口,您可以使用内核能力允许它绑定到特权端口。

# setcap CAP_NET_BIND_SERVICE=+eip /usr/bin/tor
注意 对 tor 包的任何升级都会重置权限。考虑使用 pacman#Hooks 在升级后自动设置权限。

如果您使用 tor.service,也可以使用 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 浏览器中使用系统 Tor

当使用 Tor 浏览器时,可以使用正在运行的 tor.service 而不是建立到 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#Set a Tor Control password 中的步骤操作,并记下您设置的密码和控制端口。
  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 不是安全特性[19]tor 附带了几个 systemd 沙盒选项,这些选项与 chroot 环境冲突[20]。(请参阅 Talk: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

本文章或章节需要扩充。

原因: 不清楚此示例试图实现什么。(请参阅 Talk:Tor 讨论)

在此示例中,我们将创建一个名为 tor-exitsystemd-nspawn 容器,并为其分配一个虚拟 macvlan 网络接口。

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

主机安装和配置

在此示例中,容器将位于 /srv/container

# mkdir -p /srv/container/tor-exit

安装 arch-install-scripts

根据 systemd-nspawn#Create and boot a minimal Arch Linux container 安装 basetornyx

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

根据 systemd-nspawn#Management 创建符号链接以在主机上注册容器。

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

虚拟网络接口

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

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

[Exec]
LimitNOFILE=65536

MACVLAN=interface 创建一个名为 mv-interface 的“macvlan”接口并将其分配给容器,有关详细信息,请参阅 systemd-nspawn#Use a "macvlan" or "ipvlan" interface。这对于安全是可取的,因为它允许您为容器分配一个私有 IP,而容器不会知道您机器的 IP 是什么。这有助于隐藏 DNS 请求。

LimitNOFILE=65536 根据 #Raise maximum number of open file descriptors

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

启动和启用 systemd-nspawn

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

容器配置

登录到容器(请参阅 systemd-nspawn#machinectl)。

# machinectl shell root@tor-exit

启动和启用 systemd-networkd

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

配置 Tor

请参阅 #Running a Tor relay

提示 使用您喜欢的编辑器从主机编辑容器中的文件更方便。

Java

可以通过定义其 环境变量 来确保 Java 应用程序代理其通过 Tor 的连接。

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

故障排除

Tor 浏览器代理问题

Tor 浏览器通常无需大量自定义即可正常工作。如果内置代理在使用任何网站时出现 proxy server is refusing connections 错误,请尝试卸载并重新安装:删除 ~/.local/share/torbrowser/ 目录(确保备份重要文件)。

参见

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.