ssh Forwarding

核心的四条语句:

$ ssh -L <local port>:<remote host>:<remote port> <SSH hostname>
$ ssh -R <local port>:<remote host>:<remote port> <SSH hostname>
$ ssh -D <local port> <SSH hostname>
$ ssh -YC <SSH hostname>

情形一:

A 能访问 B,B 能访问 C,这种环境在天朝很常见。

以下在 B 主机上操作:

$ ssh -fN -L 10000:127.0.0.1:80 user@IP_C

将 B 10000 端口的数据全部转发到 C 的 80 端口。

$ ssh -fN -R 20000:127.0.0.1:10000 user@IP_A

将 A 20000 端口的数据全部转发到 B 的 10000 端口。

这样 A 就通过 127.0.0.1:20000 访问 C 的 http 服务了,就相当于从 A 的 20000 转发到了 C 的 80 端口。有了 80 端口理论上现有的 B/S 结构的都能做了。

情形二:

A 直接向 C 传输文件。

在 A 上执行:

$ ssh -fN -L 20000:IP_C:22 user@IP_B
$ scp -P 20000 dir/file  user@127.0.0.1:~

注意:前者输入的是 B 主机的口令,而后者输入的是 C 的口令。-P 大写。

上面这两条命令相当于在 B 上执行:

$ ssh -fN -L 22222:127.0.0.1:22 user@IP_C
$ ssh -fN -R 20000:127.0.0.1:22222 user@IP_A

在 A 上执行如下命令就可以传输数据了:

$ ssh -P 20000 dir/file user@127.0.0.1:~

情形三:

一般从 A ssh 到 B 的话,在 B 主机上执行 w ,FROM 一列会显示你的来源地址,通过转发,我们可以隐藏此信息。

在 A 主机上执行:

$ ssh -fN -L 10000:127.0.0.1:22 user@IP_B
$ ssh -p 10000 user@127.0.0.1

B 上输入:

$ w
19:14:10 up 10 day,  2:38,  1 user,  load average: 0.01, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/1    hostname          19:14    0.00s  0.00s  0.00s w

FROM 会显示 B 的 hostname 而不会是 A 的 IP 地址。

情形四:

我们看下面这张图(图画的有点丑)


先看 A,C,D 三台主机,其中 A 是你自己,C 是你在 USA 的主机,D 是你要访问的网站,在 A 上执行:

$ ssh -fN -L 10000:twitter.com:80 user@remote_ip

remote_ip(C) 是你在防火墙之外的 ssh server。这样通过本地转发,你就可以访问 D 了。

现在你的朋友 B 也想访问 D,怎么办?很简单,在 A 上加个 -g 参数跟你的朋友 B 共享这个 10000 端口。

$ ssh -g -L 10000:twitter.com:80 user@remote_ip

加上 -g 参数后,跟你通一个网段的通过连接你的 10000 端口,也可访问 twitter.com。

注意只有你(A) 跟你的远程主机(C)是经过加密连接的,而你的朋友(B)跟你(A)以及你的远程主机(C)跟你想访问的网站(D)之间是没有经过加密处理的。图中用绿色标出来的表示相对安全,而红线的由于没有加密,安全性较差。

情形五:

$ ssh -fNqT -D [127.0.0.1:]10000 user@remote_ip

这是目前最常用的方法了,通过动态端口转发来实现。当然,从 remote_ip 到你要访问的目标网站之间同样没有经过加密处理。

情形六:

$ ssh -YC user@remote_ip firefox

在本地开启 remote_ip 上的 firefox,也就是 X 转发了。为什么使用 -Y 而不是 -X,请点击这里

开启之前检查,server 的 /etc/ssh/sshd_config:

AllowTcpForwarding yes
X11Forwarding yes

并且要安装:

# yum -y install xorg-x11-xauth xorg-x11-fonts*

注意:使用 ssh X11 Forwarding 没有必要在远程主机上运行桌面系统,即没有必要进入 init 5。

各个参数诸如 f/q/C/N/T/L/R/D/Y/X 的含义在此没有叙述,可以 man 手册。

参考:
https://www.ibm.com/developerworks/cn/linux/l-cn-sshforward/
http://dailypackage.fedorabook.com/index.php?/archives/48-Wednesday-Why-Trusted-and-Untrusted-X11-Forwarding-with-SSH.html