SSH隧道
这章继续介绍基础知识,前面讲到有的服务在127.0.0.1监听,外网无法访问,我们怎么访问呢,可以用SSH隧道。
什么是SSH隧道?
SSH隧道(SSH Tunneling)是一种使用SSH协议在两个网络节点之间建立加密通道的技术。
就像时空门一样,我们从这个空间进入,出来的时候却发现是另一个空间。
SSH隧道的三种模式
本地转发(Local Forwarding)
这是最常用的模式,将远程服务映射到本地端口。
命令格式是ssh -L 本地端口:目标主机C:目标端口 跳板机B
。如果在电脑A上运行命令后,本地进程访问本地端口就相当于访问目标主机C的目标端口。
这个目标主机C必须是跳板机B可以访问到的。我们一般看到目标主机C是127.0.0.1,这种情况下C就是B。
# 将跳板机B的22端口映射到本地10022端口
ssh -L 10022:127.0.0.1:22 B
# 访问本地10022端口就相当于访问跳板机B的ssh
ssh -p 10022 localhost
目标主机C也可以不是127.0.0.1,比如A可以访问B的ssh服务,B可以访问C的ssh服务,A却不能访问C的ssh服务,那么A可以通过下面的方式访问C的ssh服务。
# 将C的22端口映射到本地10022端口
ssh -L 10022:C:22 B
# 访问本地10022端口就相当于访问C的ssh
ssh -p 10022 localhost
对于这种情况其实还可以修改ssh的配置文件C:\Users\test\.ssh\config
,让ssh自动转发。
Host B
HostName x.x.x.x
Port 22
User root
Host C
HostName y.y.y.y
Port 22
User root
ProxyJump B
在A上运行ssh C
就会通过跳板机B访问目标主机C。
如果命令格式是ssh -L 0.0.0.0:本地端口:目标主机C:目标端口 跳板机B
。运行命令后,其他电脑访问这台电脑A的本地端口就相当于访问目标主机C的目标端口。注意这台电脑A的防火墙要允许访问这个端口。
远程转发(Remote Forwarding)
将本地服务映射到远程端口。
这个可能比较难理解,举个例子,有台服务器A只能用远程桌面登录,IT把ssh端口封了,我想用ssh登录怎么办。
首先要找台A能用ssh登录的服务器B,然后在A上执行ssh -R 11222:127.0.0.1:22 B
,然后我登陆到B,执行ssh -p 11222 localhost
,就可以ssh登录A了。
像前面一样,命令格式也支持ssh -R 0.0.0.0:本地端口:目标主机C:目标端口 跳板机B
。这里的跳板机就像一个内鬼,把外部无法访问的端口暴露出来了,所以要小心啊。
动态转发(Dynamic Forwarding)
创建一个SOCKS5代理。命令格式是ssh -D 本地端口 跳板机B
。电脑A上的应用程序设置了这个代理,就可以用跳板机B来收发数据包,相当阿于披了个马甲。
另外介绍一下Windows下面SOCKS5代理转HTTP代理的程序Privoxy,可以在https://sourceforge.net/projects/ijbswa/files/Win32/
下载。
在配置文件config.txt主要看两个地方:
# HTTP代理的端口
listen-address 127.0.0.1:8118
# SOCKS5代理的端口
forward-socks5 / 127.0.0.1:1080 .
ssh服务配置
在/etc/ssh/sshd_config
文件中,把下面一些选项打开,不然有时候会转发失败,不要忘记重启sshd。
AllowAgentForwarding yes
AllowTcpForwarding yes
GatewayPorts yes