tor
我正在尝试使用来自 EPEL 存储库的包在 CentOS 7(带有 systemd)上设置 Tor 隐藏服务。
以前它运行良好,直到几天前停止工作。此时系统上没有重新启动任何程序,尽管通过 yum-cron 启用了自动更新,因此可能更新了某些内容。
但是,不管怎样,我在 Fedora Server 和 Fedora Workstation 的大部分库存安装中也看到了这个问题。
现在,当我尝试使用文件中的隐藏服务行启动 tor 服务时/etc/tor/torrc
,它无法启动。
我一直在使用检查错误消息journalctl -xn
,但它们并不一致 - 但主要错误似乎是:
Nov 09 22:05:18 hostname tor[7561]: Nov 09 22:05:18.245 [warn] Directory /var/lib/tor/sshservice/ cannot be read: Permission denied
有时:
Nov 09 22:12:33.119 [warn] /var/lib/tor/sshservice/ is not owned by this user (root, 0) but by toranon (997). Perhaps you are running Tor as the wrong user
我已经确保了整个路径的以下内容/var/lib/tor
,但没有成功:
- 目录归用户/组所有
toranon
(EPEL 包的默认 tor 用户) - 目录上的权限设置适当(我已尝试过 700、770、600、660)。
- SELinux 上下文已针对目录进行了适当设置,并且我已使用 进行了验证
restorecon
。
其他信息:
- 如果我将目录的所有权更改为 root,我会收到与之前相同的“错误用户”消息,但用户名是相反的。
- 我已尝试完全禁用 SELinux,并验证 tor 服务仍然无法启动。
- 隐藏服务目录已填充私钥和主机名文件,它们是由该系统上的 tor 守护程序创建的。此配置之前完全有效。
- 如果我从配置中完全删除
HiddenServiceDir
和HiddenServicePort
行,tor 将按预期启动。
一些可能有用的输出来自/etc/tor/torrc
:
# Do not run as client
SocksPort 0 #Run Tor only as a relay and do not create a local SOCKS proxy
SocksPolicy reject *
# Define hidden service for SSH
HiddenServiceDir /var/lib/tor/sshservice/
HiddenServicePort 44674 127.0.0.1:22 #Redirect local SSH port to a nonstandard public port
ls -Z
的/var/lib/tor
:
[root@sagan tor]# ls -Z
-rw-------. toranon toranon system_u:object_r:tor_var_lib_t:s0 cached-certs
-rw-------. toranon toranon system_u:object_r:tor_var_lib_t:s0 cached-microdesc-consensus
-rw-------. toranon toranon unconfined_u:object_r:tor_var_lib_t:s0 cached-microdescs
-rw-------. toranon toranon unconfined_u:object_r:tor_var_lib_t:s0 cached-microdescs.new
-rw-------. toranon toranon unconfined_u:object_r:tor_var_lib_t:s0 lock
drwx------. toranon toranon system_u:object_r:tor_var_lib_t:s0 sshservice
-rw-------. toranon toranon unconfined_u:object_r:tor_var_lib_t:s0 state
不确定是什么原因导致了这个问题,但我怀疑这与 systemd 的精确配置有关。我尝试注释和删除默认 systemd 文件中的某些行tor.service
,但没有成功。
目前我正在尝试使用CentOS 附带的systemctl start tor
默认 systemd文件启动 tor 。tor.service
有什么想法吗?非常感谢您的帮助。
答案1
我自己刚刚也对这个问题感到困惑,这要归咎于 systemd 严重缺乏调试能力。
事实证明,在我的情况下,systemd 干扰了。它允许用户在启动时toranon
读取 /var/lib/tor/
但不允许读取其子目录/var/lib/tor/hidden_service
。因此,如果我使用相同的命令以 root 身份启动 tor,它会正常工作,但在 systemd 下启动会导致它莫名其妙地失败。目录上的权限是正确的,这更令人困惑。
我修复该问题的方法是更改文件,torrc
将隐藏的服务文件写入 systemd 允许进程写入的目录。也就是说,您可以将行从:
HiddenServiceDir /var/lib/tor/sshservice/
到
HiddenServiceDir /var/lib/tor/
最终一切也许都会顺利。
另一个选择可能是通过更改 systemd 配置文件来告诉 systemd 允许进程读取子目录tor.service
,可能在:
/usr/lib/systemd/system/tor.service
并更改ReadWriteDirectories
选项以包含您正在创建的子目录,可能需要添加一行:
ReadWriteDirectories=/var/lib/tor/sshservice/
或者将该路径作为空格分隔的列表添加到该文件中的现有条目之一。(它已经有两行不同的ReadWriteDirectories
内容,但我不确定第二行是否有效,因为没有写入日志。)根据 systemd 的文档,该条目应该是空格分隔的绝对路径列表,例如:
ReadWriteDirectories=/var/lib/tor /var/lib/tor/sshservice /var/log/tor
虽然我还没有尝试做这个更隐晦的改变,但心里默默希望 systemd 会在火灾中消亡,这样我们就不必维护第三组文件和权限。
答案2
针对该问题发布的一些修复方法确实有效,但成功率各不相同。
我遇到的一个始终有效的修复方法是将一些例外加载到 SELinux 中。
步骤1
创建一个tor-selinux-workaround.cil
包含以下内容的文件:
(typeattributeset cil_gen_require tor_t) (allow tor_t self (capability (dac_override dac_read_search)))
第2步
使用以下命令将该文件导入 SELinux:
sudo semodule -i tor-selinux-workaround.cil
对于最新的 Fedora 和 CentOS 系统来说这应该可以完美运行。
更多信息
有关更完整的解释,请参阅我的帖子:https://alexhaydock.co.uk/tech/fix-tor-onion-services-on-centos-fedora
答案3
如果您希望能够使用 启动和停止 tor systemctl
,那么最好的做法是不要修改默认的安全配置。
您的系统中应该有一个名为 system_tor 的文件位于以下位置:/etc/apparmor.d/system_tor
如果您查看此文件,您应该会看到 tor 已预先配置为可以使用的目录列表。以下是我的工作和默认版本的文件包含的内容:
# vim:syntax=apparmor
#include <tunables/global>
profile system_tor flags=(attach_disconnected) {
#include <abstractions/tor>
owner /var/lib/tor/** rwk,
owner /var/lib/tor/ r,
owner /var/log/tor/* w,
# During startup, tor (as root) tries to open various things such as
# directories via check_private_dir(). Let it.
/var/lib/tor/** r,
/{,var/}run/tor/ r,
/{,var/}run/tor/control w,
/{,var/}run/tor/socks w,
/{,var/}run/tor/tor.pid w,
/{,var/}run/tor/control.authcookie w,
/{,var/}run/tor/control.authcookie.tmp rw,
/{,var/}run/systemd/notify w,
# Site-specific additions and overrides. See local/README for details.
#include <local/system_tor>
}
如果你查看显示的第一个目录路径,你会看到
owner /var/lib/tor/** rwk,
双星号。这实际上表示 tor 服务可以读取和写入位于其中的任何文件夹和文件/var/lib/tor
您还应该看到位于 中的路径tor.service
,或者根据版本,位于[email protected]
文件中的路径。这是[email protected]
我当前工作版本中的默认路径:
[Unit]
Description=Anonymizing overlay network for TCP
After=network.target nss-lookup.target
PartOf=tor.service
ReloadPropagatedFrom=tor.service
[Service]
Type=notify
NotifyAccess=all
PIDFile=/run/tor/tor.pid
PermissionsStartOnly=yes
ExecStartPre=/usr/bin/install -Z -m 02755 -o debian-tor -g debian-tor -d /run/tor
ExecStartPre=/usr/bin/tor --defaults-torrc /usr/share/tor/tor-service-defaults-torrc -f /etc/tor/torrc --RunAsDaemon 0 --verify-config
ExecStart=/usr/bin/tor --defaults-torrc /usr/share/tor/tor-service-defaults-torrc -f /etc/tor/torrc --RunAsDaemon 0
ExecReload=/bin/kill -HUP ${MAINPID}
KillSignal=SIGINT
TimeoutStartSec=300
TimeoutStopSec=60
Restart=on-failure
LimitNOFILE=65536
# Hardening
AppArmorProfile=-system_tor
NoNewPrivileges=yes
PrivateTmp=yes
PrivateDevices=yes
ProtectHome=yes
ProtectSystem=full
ReadOnlyDirectories=/
ReadWriteDirectories=-/proc
ReadWriteDirectories=-/var/lib/tor
ReadWriteDirectories=-/var/log/tor
ReadWriteDirectories=-/run
CapabilityBoundingSet=CAP_SETUID CAP_SETGID CAP_NET_BIND_SERVICE CAP_DAC_READ_SEARCH
考虑到所有这些,您希望torrc
隐藏服务配置如下所示:
HiddenServiceDir /var/lib/tor/sshservice
HiddenServicePort 44674 127.0.0.1:22
HiddenServiceVersion 3
然后,您需要预先配置目录,以便 tor 可以正确使用它。这个过程看起来如下:
#!/bin/bash
sudo mkdir /var/lib/tor/sshservice
sudo chown -R toranon:toranon /var/lib/tor/sshservice # some versions use debian-tor instead of toranon
sudo chmod 700 /var/lib/tor/sshservice
在使用 systemctl 命令运行 tor 之前,您可能必须先手动运行它以生成所需的隐藏服务文件。这可能是我的特定实例的一个错误。请按如下方式执行此操作:
sudo -u toranon tor
完成后,使用ctrl+c
或kill
命令终止 tor 进程。
现在您应该能够使用命令systemctl
或system
命令来启动和停止 tor。
答案4
在 Debian Jessie 上,这对我有用(我将 tor 隐藏服务信息存储在 /opt/tor 中)
编辑 /etc/tor/torrc,添加适当的 HiddenServiceDir 和 HiddenServicePort 指令:
HiddenServiceDir /opt/tor/
隐藏服务端口 80 127.0.0.1:8080
编辑 /lib/systemd/system/[电子邮件保护],在文件末尾添加此行:
读写目录=/opt/tor
创建目录并设置所有权和权限:
mkdir /opt/tor
chown debian-tor。/opt/tor
chmod go-rwx / opt / tor
重新加载服务配置:
systemctl 守护进程重新加载
并启动服务:
systemctl 启动