Tor
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.
安装
安装 torbrowser-launcher 包以使用 Tor Browser,这是使用 Tor 匿名浏览网页的唯一支持方式。
有意手动使用 Tor 与其他软件、运行节点或托管洋葱服务的用户应安装 tor 包。本文大部分内容涵盖此用途。
Nyx 是 Tor 的命令行监视器,它提供带宽使用情况、连接详情和即时配置编辑。要使用它,请安装 nyx 包。
用法
启动/启用 tor.service。或者,以 tor 用户身份手动启动
[tor]$ /usr/bin/tor
要通过 Tor 使用程序,请将其配置为使用 127.0.0.1 或 localhost 作为 SOCKS5 代理,对于标准设置下的纯 Tor,端口为 9050。
代理支持远程 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
- 出于安全考虑,流(Tor Control)不应被不受信任的方访问。
为了增强安全性,请使用 cookie 文件 或 control 密码,或两者兼而有之,来限制对 ControlPort 的访问。
Nyx
假设 ControlPort 9051 已在 torrc 中设置,您可以通过运行以下命令来启动 nyx
$ nyx
要在 nyx 中查看 Tor 连接 [1],请将以下内容添加到您的 torrc
DisableDebuggerAttachment 0
设置 Tor Control cookie 文件
添加到您的 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
$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 包进行安装。
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 Proxy 和 SSL Proxy 字段中输入端口和主机。要检查 Tor 是否正常工作,请访问 Tor Check 网站并切换 Tor。
Privoxy
您也可以在其他应用程序中使用此设置,例如即时通讯(例如 Jabber、IRC 客户端)。支持 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,请转到 Tools -> Preferences -> Proxy。要为特定账户使用 Tor,请转到 Accounts > Manage Accounts,选择所需的账户,点击 Modify,然后转到 Proxy 选项卡。代理设置如下
Proxy type: SOCKS 5 Host: 127.0.0.1 Port: 9050
Irssi
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 Tor、Using SASL 或 IRC/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 将不允许用户安装该软件包。
/etc/pacman.conf
... XferCommand = /usr/bin/curl --socks5-hostname localhost:9050 --location --continue-at - --fail --output %o %u ...
运行 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 出口节点,而不会直接连接到互联网。
运行 Tor 桥接节点
Tor 桥接节点是一个未在公共 Tor 目录中列出的 Tor 节点,这使得人们在政府或 ISP 阻止所有公共 Tor 节点时能够连接到 Tor 网络。访问 https://bridges.torproject.org/ 以获取更多信息和有关如何获取桥接节点地址的说明。
运行 Tor 出口节点
Tor 用户对常规互联网的任何请求都必须在某个点退出 Tor 网络,出口节点提供这项基本服务。对于目标主机来说,这些请求将看起来像是从您的机器发出的。这意味着运行出口节点通常比运行其他类型的 Tor 节点在法律上更繁琐。
在成为出口节点之前,强烈建议阅读 Legal resources 和 tips for running an exit node。
配置
使用 torrc,您可以配置希望允许通过您的出口节点的服务。
将节点设置为出口节点
ExitRelay 1
允许所有流量
ExitPolicy accept *:*
只允许 IRC 端口 6660-6667,但其他任何流量都不允许从节点退出
ExitPolicy accept *:6660-6667,reject *:*
默认情况下,Tor 会阻止某些端口。您可以使用 torrc 来覆盖此设置,例如接受 NNTP
ExitPolicy accept *:119
+100Mbps 出口节点配置示例
如果您运行一个快速出口节点(+100Mbps),使用 ORPort 443 和 DirPort 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 9051、CookieAuthentication 1 和 DisableDebuggerAttachment 0 允许 nyx 连接到 Tor 并显示连接。
ORPort 443 和 DirPort 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 443、DirPort 80 和 DisableAllSwap 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 NOTRACK 在 raw 表中禁用连接跟踪。
: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
您可以使用 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 节点的功能,请使用 journal 或 unit 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。
系统级使用 Tor DNS
可以将系统配置为对系统进行的任何 A、AAAA 和 PTR 查询使用 Tor DNS,无论您最终是否使用 Tor 连接到最终目的地。为此,请将系统配置为使用 127.0.0.1 作为其 DNS 服务器,并编辑 /etc/tor/torrc 中的 DNSPort 行,使其显示为
DNSPort 53
或者,您可以使用本地缓存 DNS 服务器,例如 dnsmasq 或 pdnsd,它们也能弥补 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 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 可以提供相对强大的泄露防护,但它不能替代 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-restore 和 ip6tables-restore(由 systemd 的 iptables.service 和 ip6tables.service 内部使用)使用以下文件。
TransPort 或 DNSPort,并阻止任何无法 Tor 化连接的内容。通过启用 AutomapHostsOnResolve,Tor 将从 VirtualAddrNetworkIPv4 范围返回一个虚拟 IP 地址。此功能允许解析地址的应用程序无缝连接到 .onion 地址。- 现在使用
--ipv6和--ipv4进行协议特定的更改。iptables-restore和ip6tables-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 正在运行,并 启动/启用 iptables 和 ip6tables systemd 服务单元。
您可能希望将 Requires=iptables.service 和 Requires=ip6tables.service 添加到任何登录用户的 systemd 服务单元(最可能是 显示管理器),以防止在防火墙启动之前启动任何用户进程。请参阅 systemd。
技巧与提示
内核能力
要以非 root 用户运行 Tor 并使用低于 1024 的端口,您可以使用内核能力允许它绑定到特权端口。
# setcap CAP_NET_BIND_SERVICE=+eip /usr/bin/tor
如果您使用 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 开始,您可以按照以下步骤操作
- 在
/etc/tor/torrc中,查找#SOCKSPort选项,并记下其地址和端口。如果未指定地址,默认为127.0.0.1;如果未指定端口,默认为9050。 - 按照 #Tor ControlPort 和 #Set a Tor Control password 中的步骤操作,并记下您设置的密码和控制端口。
- 在 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
- 编辑 Tor 浏览器的启动文件,默认情况下是
~/.local/share/torbrowser/tbb/x86_64/tor-browser/Browser/start-tor-browser。在以下行中将secret替换为控制密码。setControlPortPasswd ${TOR_CONTROL_PASSWD:='"secret"'}警告 请勿修改secret周围的两个引号集。 - 重新启动 Tor 浏览器。如果成功,启动页面应该会显示一条消息,说明连接不是由 Tor 浏览器管理的,并且
tor.service应该会记录一行显示New control connection opened from <SocksAddress>。
在 chroot 中运行 Tor
出于安全目的,可能希望在 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-exit 的 systemd-nspawn 容器,并为其分配一个虚拟 macvlan 网络接口。
有关完整文档,请参阅 systemd-nspawn 和 systemd-networkd。
主机安装和配置
在此示例中,容器将位于 /srv/container。
# mkdir -p /srv/container/tor-exit
根据 systemd-nspawn#Create and boot a minimal Arch Linux container 安装 base、tor 和 nyx。
# 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.service。networkctl 显示 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/ 目录(确保备份重要文件)。