有时候我必须连接到访问受到严格限制的服务器。DMZ
防火墙仅允许通过 VPN 进行入站 SSH。
出站 HTTP 连接被阻止。
我正在寻找一种通过 SSH 会话隧道传输 Web 访问的简单方法,以便我可以通过 yum / apt-get 安装更新和软件。理想情况下,我希望避免在受保护区域安装其他软件/服务。
在这种情况下你会怎么做?
SSH 有-D <port>
SOCKS 代理选项。但不幸的是,它只是从客户端到服务器的单向连接,没有反向选项。
答案1
我最终只用以下方法就完成了这个任务ssh
:
- 在客户端计算机上启动本地 SOCKS 代理(使用
ssh -D
)编辑:SSH>7.6 不需要 - 连接到远程服务器并设置反向端口转发(
ssh -R
)到本地 SOCKS 代理 - 配置服务器软件以使用转发代理
1. 后台启动本地socks代理
编辑SSH>7.6 允许使用更简单的语法来启动代理。跳过此步骤并继续执行步骤 2!
通过 SSH 连接到本地主机并在端口 54321 上打开 SOCKS 代理。
$ ssh -f -N -D 54321 localhost
-f
在后台运行 SSH。
笔记:如果您关闭启动命令的终端,代理进程将被终止。此外,请记住在完成后关闭终端窗口或自行终止进程,以进行清理!
2. 连接到远程服务器并设置反向端口转发
将远程端口 6666 绑定到本地端口 54321。这使得您的本地 socks 代理可用于端口 6666 上的远程站点。
$ ssh root@target -R6666:localhost:54321
编辑SSH>7.6 允许使用更简单的语法来启动代理!那么不需要步骤 1:
$ ssh root@target -R6666:localhost
3. 配置服务器软件以使用转发代理
只需配置 yum、apt、curl、wget 或任何其他支持 SOCKS 的工具即可使用代理127.0.0.1:6666
。
瞧!隧道挖得真好!
4.可选:安装代理链以使事情变得简单
proxychains
安装在目标服务器上可以任何软件使用转发的 SOCKS 代理(甚至telnet
)。它使用LD_PRELOAD
技巧将任意命令的 TCP 和 DNS 请求重定向到代理,非常方便。
设置/etc/proxychains.conf
使用转发的 socks 代理:
[ProxyList]
# SSH reverse proxy
socks5 127.0.0.1 6666
使用 TCP 隧道的任意工具proxychains
:
$ proxychains telnet google.com 80
$ proxychains yum update
$ proxychains apt-get update
答案2
较新版本的 SSH 允许使用非常简单的选项ssh -R <[bind_address:]port>
。仅使用主机上的端口和可能的绑定地址,但不指定客户端端口将创建反向 SOCKS 代理。
新版 SSH 的手册页中也有说明:
[...] 如果没有指定明确的目的地,ssh 将充当 SOCKS 4/5 代理并将连接转发到远程 SOCKS 客户端请求的目的地。
你可以使用 curl 连接到一个简单的“给我我的 IP”API 来测试这一点,例如http://ifconfig.io。
$ curl ifconfig.io
对比
$ curl --socks5 localhost:<PORT> ifconfig.io