HTTP 隧道
在网络中,隧道技术是使用更高级别的协议(在本例中为 HTTP)来传输较低级别的协议(在本例中为 TCP)。
创建隧道
使用 corkscrew 和 HTTP CONNECT
为了打开与运行 SSH 守护进程的服务器的连接,我们将使用 HTTP CONNECT 方法,该方法允许客户端通过向 HTTP 代理发送 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
您现在可以使用 localhost:8888
作为 SOCKS 代理。
使用 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 代理。