apt-get 通过隧道代理安装,但 ssh 仅来自客户端

Posted

技术标签:

【中文标题】apt-get 通过隧道代理安装,但 ssh 仅来自客户端【英文标题】:apt-get install via tunnel proxy but ssh only from client side 【发布时间】:2016-07-21 02:52:58 【问题描述】:

所以...这是我的问题:

我可以从我的机器访问 ***。我可以通过 SSH 访问 *** 中的服务器,但由于防火墙阻止了反向 ssh 连接,这台机器无法从内向外访问。所以我不能通过隧道使用 Internet 来使用 apt-get。

我该如何模仿:

sudo ssh -D 9999 root@<machineoutside***>

但来自 *** 外部。 或者有什么方法可以使用 Internet 连接来安装包?

【问题讨论】:

我试过这个解决方案:superuser.com/questions/370930/ssh-reverse-socks-tunnel 使用命令 "ssh remotehost -R remoteport:localhost:localport "ssh -D 9050 localhost -p remoteport"" 但它也不起作用跨度> 【参考方案1】:

设置:

电脑A

可以上网 可以访问计算机 B SSH 已安装

电脑B

无法访问互联网 OpenSSH 服务器已安装

步骤:

    ssh 到计算机 B 计算机 A

    sudo ssh -R <selected port>:us.archive.ubuntu.com:80 user@computerb.host
    

    编辑计算机 B 的 /etc/apt/apt.conf 以包含以下行:

    Acquire::http::Proxy "http://localhost:<selected port>";
    Acquire::https::Proxy "https://localhost:<selected port>";
    

    在计算机 B 上运行 apt-get updateinstallupgrade,它应该可以工作。


几点说明:

必须在使用计算机 B 访问 apt-get 存储库时保持从计算机 A 到计算机 B 的 ssh 原始会话处于活动状态。 您不必使用相同的 ssh 连接来利用隧道(这意味着如果您有多个 ssh 连接到计算机 B,它们应该都可以工作)

使用腻子

这也可以使用 Putty 来实现(假设计算机 A 是 Windows 机器)。

    启动会话时,选择 SSH --> Tunnels 源端口:&lt;selected port&gt; 目的地:us.archive.ubuntu.com:80 选择“远程”单选按钮 选择“添加”按钮 像往常一样配置会话。 按照上述步骤 2 和 3 进行操作

【讨论】:

谢谢!你救了我的命。它适用于官方存储库,但是......如果我需要额外的包或使用 python pip 怎么办。 我在计算机 A 中尝试过:ssh -R 8889:pypi.python.org:443 user@computerb.host 和计算机 B 中:sudo pip --proxy=localhost:8889 install 。但它不起作用 @rasputino python pip 提出了一个完全不同的问题。在我花在这方面的有限时间内,我无法让它发挥作用。我只是手动安装软件包。 debian 发行版使用:ftp.us.debian.org:80 这只是部分有效:它对大多数 https 流量都失败了。即使您使 apt 忽略证书,它仍然不起作用。但如果你幸运的话,这已经足够了......有些东西可能会安装。【参考方案2】:

一个选项是启用 SSH 隧道。这使您可以在另一个协议中运行 SSH 会话,此选项可以让您绕过防火墙,让防火墙误以为传入连接实际上是 http 端口 80 回复而不是端口 21。下面是一个示例,您可能需要微调随你喜欢。

ssh -L 9000:serverIpAddress:80 user@example.com

祝你好运!

【讨论】:

我试过了,但它不起作用,我认为所有的连接都是被禁止的。我可以使用命令“ssh -L 9000:serverIpAddress:80 user@example.com”从外部连接,但是当我在 tsocks 内的服务器中连接时不起作用。 (我之前在127.0.0.1和9000端口上配置了tsocks) 如果它是一个深度数据包检查防火墙,它会变得相当复杂。尝试找出您正在处理的防火墙类型。【参考方案3】:

安装 proxychains 和 tmux:你可能会遇到这样的事情:

sudo ssh -R 8080:us.archive.ubuntu.com:80 user@computerb.host
echo 'Acquire::http::Proxy "http://localhost:8080";' | sudo tee /etc/apt/apt.conf.d/proxy.conf
apt-get update
apt-get install proxychains tmux
sudo rm /etc/apt/apt.conf.d/proxy.conf

注意到最后一行取消了 apt 代理配置吗?

拥有代理链和 tmux 后,您可以获得更可靠的操作,并且无需更改时髦的 apt 配置,并且 pip / curl 等也可以工作。

首先,启动 tmux。 (快速入门,使用CTRL-B 而不是另一个键,'c' 表示另一个新外壳,'n/p' 表示在外壳之间循环,'d' 分离并保持运行)。

tmux

接下来,我们将建立一个 ssh 连接,从隔离的计算机返回到任何可以通过 SSH 访问且可以访问互联网的计算机,我们称之为server

ssh -f -NT -M -S ~/.ssh/ssh_socket_for_proxychains -D 127.0.0.1:17471 server

这似乎什么也没做,因为它在后台运行。你可以用ps aux |grep ssh左右看到它。

现在,配置/etc/proxychains.conf

sudo nano /etc/proxychains.conf

将最后一行从 socks4 127.0.0.1 9050 更改为 socks5 127.0.0.1 17471

最后,您现在可以运行 sudo proxychains apt upgrade -yproxychains pip install ... 之类的东西而不会失败。

作为奖励,您可以分离 tmux 会话 (CTRL-b,d) 并稍后返回(ssh 重新进入,然后 tmux a)。

对于 raspberrypi,如果您将“us.archive.ubuntu.com”更改为“archive.raspberrypi.org”,它会起作用,而对于随机 debian,您可能会遇到“ftp.us.debian.org”的运气

对我来说,用例是隔离静态 ip 网络上的 raspi 之类的东西,我有另一台服务器,它有两个网络连接(一个可以访问互联网,另一个连接到隔离的局域网),它不路由:它正在运行 trueNAS ,并且局域网处于隔离状态。 但它确实有我可以 ssh 进入的 opensshd,然后 ssh 到 pi。

在这种情况下,它的独立局域网 IP 地址是 pi 连接回的“服务器”。它的 pi 获得了 proxychains 和 tmux,然后可以通过 apt 进行更新。

ssh -R 部分归功于 James Mertz,但它仅适用于 http 流量,任何具有 https URL 的东西都会失败;它不适用于 pip:从一堆不同的随机服务器中获取东西。不过,用它来获取代理链已经足够了。

proxychains howto 部分来自https://yuzhangbit.github.io/tools/use-apt-get-behind-socks5-proxy/

【讨论】:

以上是关于apt-get 通过隧道代理安装,但 ssh 仅来自客户端的主要内容,如果未能解决你的问题,请参考以下文章

如何配置系统通过 ssh 反向隧道/代理使用 git?

使用 JSch 创建一个通过 SSH 隧道化的 SOCKS 代理

通过 AWS SSM 代理命令设置 SSH 隧道

Gcloud SSH 隧道代理始终通过美国,甚至来自其他地区

Spring boot Resttemplate通过ssh隧道的动态代理设置连接不识别远程DNS

ssh隧道代理连接