现实环境:
本地电脑 A,跳板服务器 B,限制保护服务器 C。
所有对 C 的操作,都必须通过服务器 B 的中转。
当需需要连接服务器 C 时,如果不想通过多级跳转,那么可以使用 SSH 的隧道和转发功能。
首先建立本机到服务器 C 的隧道,通过服务器 B 转发。
ssh -N -f -g -L 2222:199.0.0.2:22 hlei@test.com -p 22
-C:压缩数据传输。
-N :不执行脚本或命令,通常与-f 连用。
-f :后台认证用户/密码,通常和-N 连用,不用登录到远程主机。
-g :在-L/-R/-D 参数中,允许远程主机连接到建立的转发的端口,如果不加这个参数,只允许本地主机建立连接。
-L 本地端口:目标 IP:目标端口
建立这个隧道后,就可以在 A 电脑,直接 ssh -p 2222 user@localhost。登陆保护服务器 C。
另一个场景:
保护服务器 C 上面又一个 WEB 平台,现在要在 A 电脑访问,跳板机 B 只能通 C 机器的 22 端口,其他的都不能访问,此时就需要通过上面建立的隧道,再建立服务器 C 到本机的直接隧道。
ssh -N -f -g -L 8899:127.0.0.1:18889 test@localhost -p 2222
现在就可以打开 127.0.0.1:8899 来访问在 C 平台的 18889 端口。现在局域网的其他机器并不能访问 A 电脑的 IP,所以还可以进行一个操作。
ssh -N -f -g -L 192.168.2.44:8899:127.0.0.1:18889 test@localhost -p 2222
那么本地局域网的任何机器访问 192.168.2.44:8899 都会自动被映射到 C 机器的 18889。
反向隧道
应用场景在于,人在外地 C,你有一台服务器 B(有公网 1.1.1.1),家里还有一台电脑 A,现在你想在外地 C 访问家里的服务器 B,那么这时候就可以先在家里面建立一个 B 到 A 的反向隧道,然后你在任何能访问到 B 的地方,都能通过反向隧道访问家里的电脑。
ssh -NfgC -R 1234:127.0.0.1:22 test@1.1.1.1
然后你在外地,就可以登陆 1.1.1.1 的 1234 端口连接家里的电脑了。
动态转发
ssh -D 22 -NfngqC test@127.0.0.1
ssh 相关参数介绍:
-C 请求会话间的数据压缩传递。对于网络缓慢的主机,压缩对连接有所提升。但对网络流畅的主机来说,压缩只会更糟糕。
-c 选择ssh会话间数据加密算法。
-D 创建动态端口转发
-L 创建本地端口转发
-R 创建远程端口转发
-E log_file 将debug日志写入到log_file中,而不是默认的标准错误输出stderr。
-f 请求ssh在工作在后台模式。该选项隐含了"-n"选项,所以标准输入将变为/dev/null。
-G 使用该选项将使得ssh在匹配完Host后将输出与之对应的配置选项,然后退出
-g 允许远程主机连接到本地转发端口上。
-i identity_file 公钥认证时要读取的私钥文件。默认为~/.ssh/id_rsa。
-l login_name 指定登录在远程机器上的用户名。这也可以在全局配置文件中设置。
-N 明确表示不执行远程命令。仅作端口转发时比较有用。
-n 将/dev/null作为标准输入stdin,可以防止从标准输入中读取内容。当ssh在后台运行时必须使用该项。但当ssh被询问输入密码时失效。
-p port 指定要连接远程主机上哪个端口,也可在全局配置文件中指定。
-q 静默模式。大多数警告信息将不输出。