您在不同的标头(又名横幅)上是正确的,并且纯 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
也可以是socks4
or socks5
。SSH 将使用该命令遍历代理,然后建立连接。
其他选项
也可以使用普通的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 都不再重要。
参考文献(不是很相关,但我从那里获取了一些信息)