来源:DevOpsTechnologyStack今天分享一篇关于SSH的介绍和使用的文章。本文从SSH是什么开始,介绍SSH的基本用法,然后在远程登录、端口转发等各种场景下进行独立描述,希望对大家有所帮助。什么是SSH?SSH是一种用于计算机之间加密登录的网络协议。最早的时候,互联网通信都是明文通信,一旦被拦截,内容毫无疑问就会暴露。1995年,芬兰学者TatuYlonen设计了SSH协议,将所有登录信息加密,成为互联网安全的基本解决方案。它迅速在全球推广,现已成为Linux系统的标准配置。SSH登录原理SSH基本使用语法:ssh-p22user@host参数:-p:指定端口号。user:登录用户名。host:要登录的主机。默认端口号为22,当端口号为22时可以省略,直接使用如下方式:sshuser@host另外,如果本地用户名与远程登录用户名相同,登录用户名也可以省略如下:sshhostSSH远程登录实例现在我有两台linux虚拟机,都安装了centOS6.5,IP分别为192.168.13.135和192.168.13.138,如图如下图:现在,我需要操作的是通过SSH在192.168.13.138上,登录192.168.13.135。首先,我们可以使用如下命令查看两台机器是否开启了ssh。netstat-ntlp|grepssh使用以下命令连接。ssh-p22root@192.168.13.135如果是第一次在本机登录远程主机,会出现如下界面。大致意思是无法确认主机的真实性,只能知道其公钥指纹。您还想继续连接吗?只需输入是。然后输入密码连接就ok了。要退出,只需输入exit。SSH端口转发SSH不仅可以自动加密和解密SSH客户端和服务器之间的网络数据,还提供了一个非常有用的功能,那就是端口转发,将TCP端口的网络数据转发到一个端口上指定的主机,数据在转发的同时进行加密和解密。如果工作环境中的防火墙限制了某些网络端口的使用,但允许SSH连接,那么也可以通过SSH转发的端口进行通信。转发主要分为本地转发和远程转发两种。1、转发参数-C:压缩数据-f:后台认证用户/密码,一般与-N配合使用,不登录远程主机。-N:不执行脚本或命令,通常与-f配合使用。-g:在-L/-R/-D参数中,允许远程主机连接到建立的转发端口。如果不加这个参数,则只允许本地主机建立连接。-L:localport:targetIP:targetport-D:动态端口转发-R:远程端口转发-T:不分配TTY,仅用于proxy-q:安静模式,不输出错误/警告信息2.本地转发has将本地Web服务器的一个端口转发到远程服务器的一个端口。说白了就是把发送到本地端口的请求转发到目标端口。格式如下:ssh-L本地网卡地址:本地端口:目标地址:目标端口user@目标地址。现在我们使用本地转发来解决一个问题。比如我们有两台机器,如下:centosA(192.168.13.139)centosB(192.168.13.142)现在,mysql安装在centosB(192.168.13.142)机器上,并设置以便运行任意主机连接,如下:此时centosA(192.168.13.139)可以连接centosB(192.168.13.142)的mysql,如下:然后,现在我启动centosB(192.168.13.142),没有限制允许外部ip连接,只让127.0.0.1连接,如下:此时如何在centosA(192.168.13.139)上连接centosB(192.168.13.142)的mysql?这个时候我们还是用上面的mysql连接方式,肯定会报错,如下:当然,在centosB(192.168.13.142)中mysql还是可以访问的。这时候我们可以使用本地端口转发,将本地端口映射到centosB(192.168.13.142)机器上,如下:ssh-L127.0.0.1:3306:127.0.0.1:3306root@192.168.13.142因为本地网卡地址可以省略,上面的转发可以简写为:ssh-L3306:127.0.0.1:3306root@192.168.13.142当然用ssh连接的时候,如果两台机器的用户名相同,也可以省略,即命令可以简写为:ssh-L3306:127.0.0.1:3306192.168.13.14上面的代码是将本地的3306端口转发到192.168.13.142的3306端口。因为centosB(192.168.13.142)上的mysql使用了3606端口。当然首先要查看本地3306端口是否被占用。如果被占用,可以使用其他端口。数据流向如图:首先centosA(192.168.13.139)上的应用向本地127.0.0.1上的3306端口发送数据。然后centosA(192.168.13.139)通过SSH将3306端口的数据转发到centosB(192.168.13.142)的3306端口。然后centosB(192.168.13.142)将处理后的数据通过原路返回给centosA(192.168.13.139)。如果是第一次通过ssh连接cetosB机器,会提示确认公钥,让你选择是否确认连接。至此,我们在centosA上连接centosB上的mysql,就可以这样写了。bin/mysql-h127.0.0.1-uroot-p如下:我们可以通过以下命令查看centosA中ssh转发监控的进程。3、远程转发是从远程服务器的某个端口转发到本地网络上服务器的某个端口。说白了就是把发送到远程端口的请求转发到目标端口。格式如下:ssh-R远程网卡地址:远程端口:目标地址:目标端口下面以三台机器为例,如下:centosA(192.168.13.139)centosB(192.168.13.142)win7(10.18.78.135)假设,win7(10.18.78.135)和centosB(192.168.13.142)不能直接连接,但是win7(10.18.78.135)和centosA(192.168.13.139)可以连接centosB(192.168.13.142)或者centosA(192.168.13.139)连接,那么我们就可以在centosA(192.168.13.139)上使用远程端口转发,让win7(10.18.78.135)和centosB(192.168.13.142)通信。ssh-R127.0.0.1:80:10.18.78.135:80root@192.168.13.142,即centosB(192.168.13.142)监听自己的80端口,然后从centosA(192.168.13.139)发送所有数据到win7(10.18.78.135)。SSH远程操作ssh远程操作主要用于对远程机器进行操作。格式如下:sshuser@host'command'案例1.在机器A(192.168.13.148)中查看机器B(192.168.13.149)操作系统类型。在机器A上执行如下代码:sshdequan@192.168.13.149'uname-a'案例二、将机器A(192.168.13.148)中的test文件夹复制到机器B(192.168.13.149)中。在机器A上,执行以下命令:tar-cztest|sshdequan@192.168.13.149'tar-xz'当然我们也可以使用scp命令或者rz命令来传输文件。案例三、在机器A(192.168.13.148)上查看机器B(192.168.13.149)是否监听1080端口。在机器A上,执行如下命令:sshdequan@192.168.13.149'netstat-tln|grep1080'SSH本地转发本地转发,说白了就是把发到本地端口的请求转发到本机上的远程端口机器。格式如下:ssh-L[localaddress:]localport:remoteaddress:remoteportremoteuser@remoteaddress案例1.在机器B(192.168.13.149)上访问机器A(192.168.13.148)的服务。现在,我们在A机上启动Nginx服务,如下:我们希望B机也能使用A机上的服务。需要将B机上的80端口请求转发给A机,目前在B机上报错,如下:需要在B机上执行如下代码:ssh-f-N-L127.0.01:80:192.168.13.148:80dequan@192.168.13.148那么,在B机器上,访问A机器的服务就像访问自己的服务一样。SSH远程转发远程转发,即将发送到远程机器的端口请求转发到本地机器。格式如下:ssh-R[remoteaddress:]remoteport:localaddress:localportremoteuser@remoteaddress上面的案例,我们也可以通过远程转发来实现。即在机器A上执行如下代码:sudossh-f-N-R8081:127.0.0.1:80dequan@192.168.13.149我们监听了机器B的8081端口,将这个端口的请求转发给机器A.在机器B上可以看到,我们的监控是这样的:此时执行如下命令,会转发到机器A的127.0.0.1的80端口,如下:1.使用远程转发实现代理功能目前机器B,只能在自己127.0.0.1的80端口监听转发,如何让机器B充当代理,将其他机器的请求转发给机器A?比如现在有一台机器C(192.168.13.143),C不能访问A,但是可以访问B,如何让C用B访问A呢?此时需要将B的监听从127.0.0.1:8081改为0:0.0.0:8081,修改sshd配置/etc/ssh/sshd_config。vim/etc/ssh/sshd_config#如果有GatewayPortsno#改成GatewayPortsyes#没有,加就行#然后重启sshdsudoservicesshdrestart然后重启,设置动态转发,如下:ssh-f-g-N-R8081:127.0.0.1:80dequan@192.168.13.149可以看到B机已经在C机上监听了0:0.0.0:8081,我们使用curl模拟请求,使用B机做代理,如如下:curl-x192.168.13.149:8081127.0.0.1当然如果有其他机器也可以用类似的方法请求机器ASSH的动态转发对于SSH的本地转发和远程转发,localport和remoteport需要一一绑定,格式如下:ssh-D[localaddress:]localportnumberremoteuser@remoteaddress比如sendtoB机上的请求转发到A机器,A机器执行请求。SSH的问题如果有人拦截登录请求,冒充远程主机,并向用户发送伪造的公钥,用户将很难辨别真伪。因为与https协议不同的是,SSH协议的公钥是不经过证书颁发机构(CA)公证的,也就是自己颁发的。可以想象,如果攻击者介入用户和远程主机之间(比如在公共wifi区域),并使用伪造的公钥获取用户的登录密码。然后用这个密码登录远程主机,那么SSH的安全机制就消失了。这种风险被称为“中间人攻击”。小结本文主要介绍SSH的基本概念和实践中常用的一些方法。它不涉及深入原理和优化的知识。协议的底层实现和具体内容可以进一步研究。如果您有任何问题或建议,可以在下方留言。
