HTTP 隧道

出自 ArchWiki

在网络中,隧道技术是使用更高级别的协议(在本例中为 HTTP)来传输较低级别的协议(在本例中为 TCP)。

创建隧道

使用 corkscrew 和 HTTP CONNECT

为了打开与运行 SSH 守护进程的服务器的连接,我们将使用 HTTP CONNECT 方法,该方法允许客户端通过向 HTTP 代理发送 HTTP CONNECT 请求来连接到服务器。

注意: 如果您的代理不支持 HTTP Connect 方法,请参阅下面的其他方法。

为此,我们将使用 corkscrew,这是一种通过 HTTP 代理隧道传输 SSH 的工具,可作为 corkscrew 使用。

打开 SSH 连接非常简单

$ ssh user@server -o "ProxyCommand corkscrew proxy_ip_or_domain_name proxy_port destination_ip_or_domain_name destination_port"

但这只是打开了一个 shell。我们想要的是 SOCKS 隧道,所以我们这样做

$ ssh -ND port user@server -o "ProxyCommand corkscrew proxy_ip_or_domain_name proxy_port destination_ip_or_domain_name destination_port"

这将在 localhost:$port 上创建一个 SOCKS 代理。

Git 隧道

限制性的企业防火墙通常会阻止 git 使用的端口。但是,可以使用 corkscrew 等实用程序使 git 通过 HTTP 代理进行隧道传输。当 git 看到设置了环境变量 GIT_PROXY_COMMAND 时,它将运行 $GIT_PROXY_COMMAND 中的命令,并使用程序的 stdin 和 stdout,而不是网络套接字。

创建 脚本

corkscrewtunnel.sh
#!/bin/bash
corkscrew proxyhost proxyport "$@"

设置 GIT_PROXY_COMMAND

export GIT_PROXY_COMMAND=/path/to/corkscrewtunnel.sh

现在,git 应该能够成功地通过 HTTP 代理进行隧道传输。

使用 httptunnel

httptunnel,可作为 httptunnel 使用,创建了一个在 HTTP 请求中隧道传输的双向虚拟数据连接。HTTP 请求可以通过 HTTP 代理发送(如果需要)。这对于位于限制性防火墙后的用户可能很有用。如果允许通过 HTTP 代理访问 WWW,则可以使用 httptunnel 以及 telnet 或 PPP 连接到防火墙外的计算机。

httptunnel 的一个限制是它明确地不能处理 HTTPS。[1]

如果您已经有一个 Web 服务器在端口 80 上监听,您可能需要创建一个虚拟主机,并告诉您的 Web 服务器将请求代理到 hts 服务器。这里不介绍这部分内容。

如果您没有任何 Web 服务器在端口 80 上监听,您可以这样做

  • 在服务器上
hts --forward-port localhost:22 80
  • 在客户端上
htc --forward-port 8888 example.net:80
ssh -ND user@localhost -p 8888
注意: 由于 SSH 认为它正在连接到 localhost,因此它将无法识别指纹并显示警告。

您现在可以使用 localhost:8888 作为 SOCKS 代理。

使用 proxytunnel

ProxyTunnel

“一个通过标准 HTTP(S) 代理将 stdin 和 stdout 连接到网络上某处服务器的程序”。

代理连接用于隧道传输另一种协议,例如通过 HTTPS 连接的 SSH。可以使用 proxytunnel 软件包进行安装

一个将其与 OpenSSH 一起使用的示例(最终连接到 mybox.athome.nl)如下所示

$HOME/.ssh/config
Host foobar
	ProtocolKeepAlives 30
	ProxyCommand /path/to/proxytunnel -p proxy.customer.com:8080 -u user -s password -d mybox.athome.nl:443

使用 openbsd-netcat

安装 openbsd-netcat 软件包。

要使用 OpenBSD netcat 版本打开连接

$ ssh user@final_server -o "ProxyCommand=nc -X connect -x some_proxy:proxy_port %h %p"

OpenBSD netcat 也支持 SOCKS 隧道。有关 -X 选项的更多信息,请参阅 nc(1) § X

使用隧道

请参阅 代理服务器#使用 SOCKS 代理

参见