无法通过Tor地址连接Docker容器内SSH服务器的问题排查
解决Docker容器中Tor隐藏服务SSH无法连接的问题
问题背景
Dockerfile配置如下:
FROM kalilinux/kali-rolling RUN apt clean RUN apt update && apt install -y openssh-server tor RUN mkdir /var/run/sshd RUN echo 'root:root' | chpasswd RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config RUN echo "ListenAddress 127.0.0.1" >> /etc/ssh/sshd_config # Configure Tor hidden service for SSH RUN echo "HiddenServiceDir /var/lib/tor/ssh_hidden_service/" >> /etc/tor/torrc RUN echo "HiddenServicePort 22 127.0.0.1:22" >> /etc/tor/torrc RUN echo "HiddenServiceAuthorizeClient stealth hidden_root" >> /etc/tor/torrc RUN usermod -s /bin/bash root RUN service ssh restart RUN service tor restart CMD ["/usr/sbin/sshd", "-D"]
出现的错误:
- Tor日志:
Closed 1 streams for service [scrubbed].onion for reason resolve failed. Fetch status: No more HSDir available to query
- torify连接错误:
1690991052 ERROR torsocks[7188]: Host unreachable (in socks5_recv_connect_reply() at socks5.c:539) ssh: connect to host b6aytqwa2yohkehkokd6cj6i47dfd5dlra3p42nhw7jx7kawdfpjkyad.onion port 22: No route to host
修复步骤
1. 修复容器启动时服务启动逻辑
构建阶段执行的service ssh restart和service tor restart不会在容器启动时生效,容器启动时只有sshd -D在运行,Tor服务未启动。需要同时启动两个服务:
创建启动脚本entrypoint.sh:
#!/bin/bash # 启动SSH服务 service ssh start # 启动Tor服务 service tor start # 保持容器前台运行,同时查看Tor日志 tail -f /var/log/tor/log
修改Dockerfile,添加脚本并设置为入口:
# ... 原有内容 ... RUN usermod -s /bin/bash root # 添加启动脚本 COPY entrypoint.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"]
2. 确保Tor隐藏服务目录权限正确
Tor服务以debian-tor用户运行,需要给隐藏服务目录赋予正确权限:
在Dockerfile的Tor配置部分后添加:
RUN mkdir -p /var/lib/tor/ssh_hidden_service/ RUN chown -R debian-tor:debian-tor /var/lib/tor/ssh_hidden_service/
3. 验证.onion地址正确性
容器启动后,进入容器查看正确的隐藏服务地址:
docker exec -it <容器ID> cat /var/lib/tor/ssh_hidden_service/hostname
确保连接时使用的是该文件中的地址,而非旧的缓存地址。
4. 解决Tor HSDir查询失败问题
- 确保Docker容器能正常访问外网(检查容器网络配置,比如使用默认的bridge网络,宿主机能联网)。
- 若网络受限,可在
torrc中添加网桥配置(可选):
RUN echo "UseBridges 1" >> /etc/tor/torrc RUN echo "Bridge obfs4 <网桥地址>:<端口> <网桥指纹>" >> /etc/tor/torrc
5. 验证服务状态
容器启动后,检查服务运行状态:
# 检查SSH服务 docker exec -it <容器ID> service ssh status # 检查Tor服务 docker exec -it <容器ID> service tor status
确保两个服务均处于active (running)状态。
内容的提问来源于stack exchange,提问作者jak bin
相关产品推荐
相关产品推荐

