SSH通道转发端口
背景:有一台服务器,仅能访问ssh服务端口,其余端口处于安全考虑均不可访问。如果想与服务器的其他端口通信,该怎么办? 参考文章
利用ssh通道,即可任意通信,下面这张图很直观。
基本命令
基本命令如下,利用:
ssh -L 本地端口X:主机C:主机C端口Z username@hostB
利用本机与hostB的SSH隧道,通过访问本机的X端口实现对主机C Z端口的访问。本质是B访问了C,再经由通道与本机连接。
可选参数
-N
表示不登录ssh,只进行端口转发。-f
表示将 SSH 进程放到后台运行。-L
表示进行本地端口转发,格式为:本地端口:目标主机:目标端口
。一条命令可以有多个-L参数代表多条规则。-R
反向转发,但本地主机与C的位置要调换。如ssh -R 8000:localhost:8080 user@ssh_server
是将服务器的8000转发到本地的8080端口。-D
流量SOCKS5代理。
应用场景
突破防火墙
即背景介绍。防火墙阻止了主机A对主机B一些端口的连接,但主机B仍有部分端口是对主机A开放的。这时主机A如果需要访问主机B上被防火墙阻挡的端口,就可以通过SSH连接主机B+端口转发来进行。需注意,这时所谓的主机C就是主机B。
ssh -L 5000:localhost:5000 root@MLB -p 4701 -N
这样访问本机的5000端口,就可以访问到服务器的5000端口,而实际上5000端口被防火墙阻止了。
网络分区
主机B与主机C处于同一内网中,主机B能够与外界联系而主机C不能。这时不处于内网中的主机A如果想要访问主机C,就可以通过SSH连接主机B+端口转发来进行。
ssh -L 22022:10.0.2.15:22 desktop_user@192.168.1.11
主机B的ip为192.168.1.11,10.0.2.15是B中的一个虚拟机C,主机B执行这条命令即可经本地22022端口访问到虚拟机的22端口。
访问非公网端口
处于内网之中的主机A可以访问公网,但不具有公网IP;公网中的主机B无法找到A,但为A开放各个端口的访问(A可以直接连接B,反之则不行)。这时A想要让B访问自己,就可以通过SSH连接主机B+端口转发来进行。需注意,这时所谓的主机C就是主机A。
见-R
的参数说明。
动态端口转发
一般可用作代理,用于在本地计算机上创建一个 SOCKS 代理服务器。通过 -D
参数创建的 SOCKS 代理服务器可以将本地计算机上的网络流量通过 SSH 隧道转发到远程服务器,从而实现本地计算机上的应用程序通过远程服务器访问互联网的功能。-D
参数的语法如下:
ssh -D [bind_address:]port user@ssh_server
其中,bind_address
表示绑定的 IP 地址,可以省略;port
表示要创建的 SOCKS 代理服务器监听的端口号。该命令将在本地计算机上启动一个 SOCKS 代理服务器,并将该服务器绑定到指定的端口上。
例如,如果想要在本地计算机上创建一个 SOCKS 代理服务器,将所有网络流量通过远程服务器转发到互联网上,可以使用以下命令:
ssh -D 1080 user@ssh_server
在执行该命令后,可以将本地计算机上的应用程序(如浏览器)的代理设置为 127.0.0.1:1080
,从而将所有网络流量通过 SSH 隧道转发到远程服务器上,并从远程服务器访问互联网。请注意,为了保护数据的安全性,建议使用加密的 SSH 连接进行 SOCKS 代理。