通过代理进行 SSH 连接的工作

信息安全 http SSH http代理
2021-09-05 00:26:14

172.18.10.1:3128每次我想从我的大学连接到互联网时,我都必须配置我的网络浏览器的代理。由于我正在配置 Web 浏览器的代理,因此我相信代理是“HTTP 代理”,并且代理服务器能够接受 HTTP 连接,因为它具有 HTTP 标头和打包程序的知识。

现在,我可以使用这个代理来建立 SSH 连接吗?如果是,这种连接将如何工作?我的概念是 SSH 和 HTTP 具有不同的标头/数据包结构,因为它们是两种不同的协议,因此我大学的 HTTP 代理服务器将无法转发 SSH 流量。如果我错了,请纠正我。

1个回答

您在不同的标头(又名横幅)上是正确的,并且纯 SSH 不会遍历 HTTP 代理。但是代理带有内置的遍历方法,并且 HTTP 代理带有 HTTP CONNECT 词。由于您不确定 is 是否是 HTTP 代理,我还将添加有关 SOCKS 代理的信息。

那里几乎只有两种类型的代理:HTTP 或 SOCKS(其他代理通常只是组合在一起的黑客)。3128 是 squid 代理的(或多或少)标准端口,因此很可能是用于创建代理的软件。squid 可以运行 HTTP 或 SOCKS 代理。

Firefox 和 Chrome 都设置了将代理用作 HTTP 代理或 SOCKS 代理。它写在您输入代理地址的选项旁边。如果两者都起作用,那么 squid 被配置为接受两者。

无论哪种方式,都可以配置 SSHProxyCommand以使用该命令来遍历代理。但是您仍然需要一个能够遍历代理本身的命令。有几个选项,我最喜欢的是ncat(NMAP 提供的 netcat 程序),我将在下面的示例中使用它,但我会在答案末尾添加更多选项。

在你的里面~/.ssh/config你可以添加

ProxyCommand /usr/bin/ncat --proxy-type http --proxy 172.18.10.1:3128 %h %p

where--proxy-type也可以是socks4or socks5SSH 将使用该命令遍历代理,然后建立连接。


其他选项

也可以使用普通的nc,如下:

ProxyCommand /usr/bin/ncat -X connect -x 172.18.10.1:3128 %h %p

对于 SOCKS,-X参数应该是“4”(SOCKSv4)或“5”(SOCKSv5)。不幸的是,nc 因平台而异,并且某些选项可能不可用。


如果您在代理之后仍然有防火墙,请参阅Gilles 在 unix.SE 上的回答以获得额外的技巧。


额外说明

您可以在 squid 中禁用 HTTP CONNECT。如果禁用此功能,则所有赌注都将关闭,因为代理将不允许任何不是有效 HTTP 字(未禁用,例如 GET、POST)的流量通过它。

然而,禁用 HTTP CONNECT 的最大问题是 HTTPS 流量无法通过代理,因此 HTTP 代理不太可能禁用 HTTP CONNECT。


更新:代理不能简单地允许“本机”HTTPS 通过吗?

这是@Pacerier 评论中的一个问题,我发现这可能很有趣。完整问题:

防火墙不能在阻止 HTTP CONNECT HTTPS 的同时允许本机 HTTPS 吗?

我将进入其中(因为我们真的在谈论代理):

代理不能在阻止 HTTP CONNECT HTTPS 的同时允许本机 HTTPS 连接吗?

是和不是。首先,代理不会阻止不通过代理的连接,它只决定直接到达代理的连接。理论上,代理可以允许“本机”HTTPS 通过,问题是“本机”HTTPS 基本上是任何字节流,因为它是在 TCP 级别加密的。换句话说,HTTPS 不是通过查看数据包可见的协议,这是设计使然。

与之相反的论点是,代理将能够检查流是否在开始时执行 HTTPS 握手,如果双方“完成”握手,则允许任何字节流继续通过此连接。请注意,无法知道连接方是否成功握手,这也是设计使然,因此代理只能知道握手是否已发送。

假设上述情况,您现在可以将代理用于任何协议,因为您可以简单地伪造 HTTPS 握手,然后发送您想要的任何内容。这违背了大多数代理的目的,即您将 OSI 第 7 层 (HTTP) 代理变成了 OSI 第 4 层 (TCP) 代理。在第 4 层代理上,您使用的是 HTTP、HTTPS、FTP 还是 LDAP 都不再重要。


参考文献(不是很相关,但我从那里获取了一些信息)