SSH 转发与代理

利用 SSH 可以方便的搭建本地代理访问互联网。本文介绍如何跨节点访问远程主机,并在此基础上建立代理。

Secure Shell(缩写为SSH),由IETF的网络工作小组(Network Working Group)所制定;SSH为一项创建在应用层和传输层基础上的安全协议,为计算机上的Shell(壳层)提供安全的传输和使用环境。
— from wikipedia

基于 SSH 的本地代理

使用 SSH 进行本地转发

在命令行执行如下命令

1
$ ssh -N -D 8000 <remote-host>

这行命令的意思是在本地开放一个转发端口(-D) 8000,将发送到这个端口的信息转发(-N)给远程主机(<remote-host>)。

这相当于在本地建立了一个监听 8000 端口的代理服务。

在 Chrome 浏览器中,安装 SwitchyOmega 插件,建立一个 profile 是在本机 8000 端口使用 socks5 协议的代理,取名为 proxy8000。之后,浏览 web 的时候选择 proxy8000,便可以将请求通过 remote-host 进行转发访问了。

SSH 代理

当前从A登录到C需要先登录B再登录C,如下图所示

1
2
3
4
5
+-----+             +-----+             +-----+
| | | | | |
| A +-----------> | B +-----------> | C |
| | | | | |
+-----+ +-----+ +-----+

我们的任务是通过A直接登录C

1
2
3
4
5
+-----+             +-----+             +-----+
| | | | | |
| A +-------------------------------> | C |
| | | | | |
+-----+ +-----+ +-----+

思路是建立 SSH 代理。在本地编辑 ~/.ssh/config 文件,增加 ProxyCommand 选项,像下面这样:

1
2
3
4
5
6
Host target.machine
User targetuser
HostName target.machine
IdentityFile %d/.ssh/id_rsa

ProxyCommand ssh proxyuser@proxy.machine -W %h:%p

示例(注意分隔符是 tab 不是空格,粘贴后请自行修改):

1
2
3
4
5
6
Host mypc
User lf
HostName 10.2.5.160
IdentityFile %d/.ssh/id_rsa
# ProxyCommand ssh proxyuser@proxy.machine nc %h %p 2> /dev/null
ProxyCommand ssh nbtest@172.22.1.21 -W %h:%p

相当于我们以 nbtest 用户登录到 172.22.1.21 服务器上,再以 lf 用户登录到 10.2.5.160 上。如果从本地可以免秘钥访问 nbtest@172.22.1.21 服务器,那么我们在命令行键入 ssh mypc 的时候直接输入 lf 的登录密码即可登录到 10.2.5.160 服务器上。

跨节点转发

与2中所述的网络结构一样。我们有些服务在 B 上不能访问,在 C 上可以访问。按照2,在 B 上,建立 A 到 C 的代理,然后在 A 建立通过 C 的转发服务,即可访问 C 上可访问的资源。

1
$ ssh -N -D 8000 <remote-C-host>