Tor

来自 ArchWiki

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

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

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

注意: Tor 本身不是您保持匿名所需的一切。有几个主要的陷阱需要注意(请参阅 如果我使用 Tor,我完全匿名吗?)。

安装

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

打算手动将 Tor 与其他软件一起使用、运行中继或托管洋葱服务的用户应安装 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 控制端口

大多数用户不需要此功能。但是某些程序会要求您打开您的 Tor 控制端口,以便他们获得对您的 Tor 节点的底层访问权限。

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

附加到您的 torrc 文件

ControlPort 9051

来自 Tor 控制协议

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

因此,为了提高安全性,我们将限制对 ControlPort 的访问,可以使用cookie 文件控制密码,或两者兼而有之。

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

设置 Tor 控制 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 控制密码

将您的密码从明文转换为哈希

$ 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 控制套接字

如果某些程序需要访问您的 Tor 控制套接字,如 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 控制

要测试您的 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 控制端口#设置 Tor 控制密码 中的步骤操作,并复制您设置的密码和控制端口。
  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 浏览器捆绑包,该捆绑包使用 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 预取器”。因此,如果 DNS 预取在 Chrome 中未禁用,那么尽管您已指定 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

注意: 观察者很容易通过罕见的 user-agent 字符串识别您,并且 Flash、JavaScript 或类似物可能存在更多问题。

您可以简单地运行

$ torsocks luakit

HTTP 代理

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

Tor

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

HTTPTunnelPort 127.0.0.1:8118

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

Firefox

FoxyProxy 附加组件允许您为不同的 URL 或所有浏览指定多个代理。重启 Firefox 后,手动将 Firefox 设置为 localhost 上的端口 8118Privoxy 在此端口上运行。这些设置可以在添加 > 标准代理类型下访问。选择一个代理标签(例如 Tor),并将端口和主机输入到HTTP 代理SSL 代理字段中。要检查 Tor 是否正常运行,请访问 Tor Check 网站并切换 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,那么您正在通过的恶意出口节点可以监视更新,并且可能会决定攻击您,但是它们可能不知道它们正在攻击谁。
  • 试图让您的机器相信没有新更新以阻止其获取安全修复程序的攻击者将更难做到这一点,因为他们无法专门针对您的机器。

缺点

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

Tor 的可靠性

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

GPG 注意事项:在 stock 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 Project running a bridge

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 Project - 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 出口中继配置示例

本文或本节已过时。

Reason: Should probably be switched from legacy iptables to nftables. Also, review what still counts as a "fast relay" in currentyear. (Discuss in Talk:Tor)

如果您运行一个快速出口中继 (+100Mbps),使用 ORPort 443DirPort 80,以下配置更改可能为设置 Tor 以及 iptables 防火墙和 pdnsd 作为 DNS 缓存提供灵感。 重要的是首先阅读 Relay Post-install and good practices

Note: 有关在 systemd-nspawn 容器中安装 Tor 的说明,请参阅 #Running Tor in a systemd-nspawn container with a virtual network interface
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 服务,如 #Start tor.service as root to bind Tor to privileged ports 中所述。

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

nyx

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

[tor]$ nyx

如果您想在 nyx 中查看 Tor 连接,还必须指定 DisableDebuggerAttachment 0

如果您想以 tor 以外的其他用户身份运行 nyx,请阅读 #Set a Tor Control cookie file 部分

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 目标,仅当主机是普通路由器时才相关,而当主机是 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
Warning: 此配置假定您的网络 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.service 是否已正确启动,可以使用 journal 或检查 unit status

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

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 库和应用程序之间的包装器,目的是使每个 Internet 通信都通过 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 泄漏了。 可以使用 iptables 进行透明 Tor 化,以使所有传出数据包都通过 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(systemd 的 iptables.serviceip6tables.service 在内部使用)。

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

确保您的 torrc 包含以下行

SOCKSPort 9050
DNSPort 5353
TransPort 9040

请参阅 iptables(8)

Note: 如果您收到此错误: 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

技巧和窍门

内核能力

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

# setcap CAP_NET_BIND_SERVICE=+eip /usr/bin/tor
Note: 对 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,

另请参阅