SSH是一个通过不受信任的网络进行安全远程登录和文件传输的标准。通过SSH隧道传输TCP/IP数据,它还提供了一种使用端口转发保护任何给定应用程序数据流量的方法。采用了这种方法后,应用程序的数据流量都会走SSH的加密连接,从而不会被窃听或拦截。对于本身不支持加密的应用程序来说,使用SSH隧道可以很方便地添加网络安全性。
上图简要介绍了SSH隧道。不可信网络的安全连接建立在SSH客户端和SSH服务器之间。这个连接是加密的,可用于保护机密性和完整性,并且可以对通信方进行身份验证。
客户端应用使用SSH来连接到服务端应用。隧道启用后
通过上面的转发,无需修改应用程序,就能保证应用程序客户端和服务端通信的安全。
这个方式的缺点是,任何能登陆服务器的用户都可以启用端口转发。内部IT人员经常在他们的家里的机器或云上的服务器上启用转发,从而能在企业内网中,从工作机器上访问家里的机器或云上的服务器。黑客或恶意软件会利用类似的方式在局域网中留一个后门。还可以在多个设备上开启隧道,攻击者通过在这些隧道中跳来跳去来隐藏踪迹。
本地代理用于将端口从客户端计算机转发到服务端计算机。SSH客户端监听来自某个端口的连接,当它收到连接时,将请求通过隧道转发到SSH服务器;然后SSH服务器将请求转到目标端口。
本地转发比较常见的场景有:
在OpenSSH中,使用 -L 参数开启本地转发
这个命令工作的过程如下图
默认情况下,其他的机器都能够连接到本地的SSH客户端指定的端口;为了安全起见,一般绑定地址,将连接来源限制在同一主机的程序
也可以在 OpenSSH客户端的配置中 配置本地转发,这样就不用单独输入命令行了
比如在~/.ssh/config中这样写
这样在开启转发的时候只需要输入 ssh serverfw 而不用再输入完整的命令了
如果希望通过本地计算机,让远程服务器 remote 可以连接到 server 上的服务,可以使用SSH远程转发。
使用SSH远程转发一个典型的用途是,在企业内部开一个后门,让公网的计算机可以访问到企业的某个内部服务,这个是有一定风险的,使用的时候需要特别小心。
在OpenSSH中,远程转发通过 -R 参数开启,在本地计算机上输入命令
上面命令的工作过程如下
默认情况下,OpenSSH仅允许从服务器主机(上图的 remote )连接到远程转发端口 server:p2 ,如果想要其他的主机也能连上 server:p2 ,需要在 sshd_config 文件中设置
如果需要指定来源IP,可以将配置改为
比如
将只允许52.192.1.73到端口8080的连接
OpenSSH的远程转发支持多个规则,比如
同样的,可以在 ~/.ssh/config 配置host,比如
在本地端口的场景中,可以从Server-B建立到Server-A的SSH连接,但是如果Server-B到Server-A之间无法连接,只有Server-A到Server-B的连接呢? (比如开发机可以访问服务器,但是服务器一般是不可以访问本地开发机的)
假设Server-A的IP为 192.168.58.101 ,Server-B的IP是 192.168.58.103
在Server-A上执行如下命令:
上面的命令,就建立了远程端口转发,把远程服务器Server-B的9906端口的所有数据都会被转发到Server-A 192.168.58.101 的3306端口
在Server-B上执行命令
就可以连接到Server-A上的MySQL Server了
本地端口转发 与 远程端口转发 结合起来使用,可以进行链式转发。假设A主机在公司,B主机在家,C主机为远程云主机。A主机上运行了前文的Node.js服务,需要在B主机上访问该服务。由于A和B不在同一个网络,且A主机没有独立公共IP地址,所以无法直接访问服务。
通过本地端口转发,将发送到B主机4000端口的请求,转发到远程云主机C的3000端口。
通过远程端口转发,将发送到远程云主机C端口3000的请求,转发到A主机的2000端口。
这样,在主机B可以通过访问 http://localhost:4000 来访问主机A上的服务。
最近需要从外网通过ssh访问内网主机,但是又不具备给路由器添加端口映射的权限,于是用到了ssh的远程端口转发。于是打算在这里整理一下ssh常用的功能和用法。
但由于细节特别多,一次肯定写不完,因此有些细节会暂时省略,待日后补上,特别是截图。
这是最基本的了,也没什么好说的。
其中-p用来指定端口(如果端口不是默认的22的话)
为了保证安全,可以在把本地产生的密钥对的公钥文件传到服务端,这样登陆的时候就不需要输入用户名/密码了。当然如果产生密钥对的时候还使用了口令,这时还是需要输入口令,这可以用ssh-agent来解决~~越来越懒了。当然如果你想在某个服务端再登陆到另一个服务端,那么可以开启ssh-agent的转发功能~~真是懒到家了。
这里分为四种,本地转发,远程转发,动态转发和X转发
先说明常见的参数
这句命令需要在本地输入,意思就是在本地打开local_port端口监听,把发送到这个端口的TCP数据包经过tunnel_host之后,发送到remote_host的remote_port上。
比如我想把发送到本地10000端口的tcp数据包经过1.1.1.1转发到1.2.3.4的20000端口,那么可以这么写:
如果tunnel_host和remote_host相同,那么就相当于直接发送到remote_host了,不经过另一台机器。
这句命令需要在本地输入,意思是在remote_host(在这里remote_host == tunnel_host)上打开监听remote_port,把传给remote_port的tcp数据转发到本地主机的local_port。
按道理来讲,remote_host应该可以不等于tunnel_host,但是我没有这个需求也就没有尝试了,有待实验。
远程转发通常用在外网想主动连接内网主机的时候,本质上就是内网主机先建立一条通向外网主机的连接,然后让外网主机直接顺着这条连接发送数据给内网主机:
那么我用
就可以通过ssh连接内网主机了。
值得注意的是,user1是服务器的用户名而user2是内网主机的用户名
之前两种的转发都是指定了转发目的地的端口,那动态转发的意思就是根据数据包的协议动态选择转发的目的端口。多用于翻墙。
X转发就是说通过ssh转发X11协议的数据,简单的说就是直接在本地运行远程的带有GUI的程序。
讲道理X转发可以用远程转发来实现,但是比较麻烦。
打开X转发需要保证/etc/ssh/sshd_config(配置文件的路径随不同linux发行版有可能会发生改变)钟的X11Forwarding是yes的。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)