Tor
Tor 项目 (The onion routing) 是 洋葱路由 的开源实现,提供对匿名代理网络的免费访问。其主要目标是通过防止 流量分析 攻击来启用 在线匿名性。
Tor 网络的用户在其机器上运行洋葱代理软件,该软件为其客户端提供 SOCKS 接口。该软件连接到 Tor,定期协商通过 Tor 网络的虚拟电路。Tor 以分层方式(因此得名“洋葱”)使用密码学,确保路由器之间的前向保密。
通过此过程,洋葱代理管理终端用户的网络流量以实现匿名性。它通过加密流量、通过 Tor 网络的其他节点发送流量并在接收您流量的最后一个节点解密流量,然后再将其转发到您指定的服务器,从而保持用户的匿名性。一个权衡是,由于大量的流量重新路由,使用 Tor 可能比常规直接连接慢得多。此外,虽然 Tor 提供了针对流量分析的保护,但它无法阻止在 Tor 网络边界(即进出网络的流量)处的流量确认。有关更多信息,请参见 Wikipedia:Tor (anonymity network)。
安装
安装 torbrowser-launcher 软件包以使用 Tor 浏览器,这是使用 Tor 匿名浏览网络的唯一受支持方式。
打算手动将 Tor 与其他软件一起使用、运行中继或托管 Onion 服务的用户应安装 tor 软件包。本文的大部分内容涵盖了这种用法。
Nyx 是 Tor 的命令行监视器,它提供带宽使用情况、连接详细信息和即时配置编辑。要使用它,安装 nyx 软件包。
使用
启动/启用 tor.service
。或者,以 tor 用户身份手动启动它
[tor]$ /usr/bin/tor
要通过 Tor 使用程序,请将其配置为使用 127.0.0.1
或 localhost
作为 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 中继。如果您已经在使用端口 80
和 443
,其他有用的端口是 22
、110
、143
和 9001
。[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 文件、控制密码或两者都使用。
设置 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
它应该打印 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 域套接字),请将以下内容添加到您的 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
它应该打印 750
和 660
。
测试您的 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
版本开始,可以按照以下步骤操作
- 在
/etc/tor/torrc
中,查找设置#SOCKSPort
并复制地址和端口。如果未给出地址,则默认值为127.0.0.1
,如果未给出端口,则默认值为9050
。 - 按照 #打开 Tor ControlPort 和 #设置 Tor Control 密码 中的步骤操作,并复制您设置的密码和控制端口。
- 在 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 /srv/container/tor-exit
按照 systemd-nspawn#创建并启动最小 Arch Linux 容器 中的说明安装 base、tor 和 nyx。
# 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.service
。networkctl
显示 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 本地解析。
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。
--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
您可以简单地运行
$ 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
您也可以在其他应用程序(如消息传递应用程序)(例如 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,请转到工具 -> 首选项 -> 代理。要为特定帐户使用 Tor,请转到帐户 > 管理帐户,选择所需的帐户,单击“修改”,然后转到“代理”选项卡。代理设置如下
Proxy type: SOCKS 5 Host: 127.0.0.1 Port: 9050
Irssi
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、使用 SASL 或 IRC/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 将不允许用户安装该软件包。
/etc/pacman.conf
... XferCommand = /usr/bin/curl --socks5-hostname localhost:9050 --location --continue-at - --fail --output %o %u ...
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 出口中继配置示例
如果你运行一个快速出口中继(+100Mbps),使用 ORPort 443
和 DirPort 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 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
需要你以 root
身份启动 Tor 服务,如 #以 root 身份启动 tor.service 以将 Tor 绑定到特权端口 中所述。
使用 User tor
选项来正确降低 Tor 的权限。
nyx
如果在 /etc/tor/torrc
中指定了 ControlPort 9051
和 CookieAuthentication 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
你可以使用 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 服务器,例如 dnsmasq 或 pdnsd,这也将补偿 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-restore
和 ip6tables-restore
使用以下文件(在内部由 systemd 的 iptables.service
和 ip6tables.service
使用)。
- 现在对协议特定的更改使用
--ipv6
和--ipv4
。iptables-restore
和ip6tables-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 正在运行,并启动/启用 iptables
和 ip6tables
systemd 单元。
你可能希望将 Requires=iptables.service
和 Requires=ip6tables.service
添加到任何 systemd 单元中,该单元记录你的用户登录(很可能是显示管理器),以防止任何用户进程在防火墙启动之前启动。请参阅 systemd。
技巧和窍门
内核 capabilities
如果你想以非 root 用户身份运行 tor,并使用低于 1024 的端口,你可以使用内核 capabilities 允许 /usr/bin/tor
绑定到低于 1024 的端口
# setcap CAP_NET_BIND_SERVICE=+eip /usr/bin/tor
如果你使用 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,