起源:DevOps技术栈

明天为大家分享一篇对于SSH 的介绍和应用办法的文章。本文从SSH是什么登程,讲述了SSH的根本用法,之后在近程登录、端口转发等多种场景下进行独立的讲述,心愿能对大家有所帮忙。

什么是SSH?

SSH是一种网络协议,用于计算机之间的加密登录。最早的时候,互联网通信都是明文通信,一旦被截获,内容就裸露无疑。1995年,芬兰学者Tatu Ylonen设计了SSH协定,将登录信息全副加密,成为互联网安全的一个根本解决方案,迅速在全世界取得推广,目前曾经成为Linux零碎的标准配置。

SSH登录原理

SSH根本用法

语法:

ssh -p 22 user@host

参数:

  • -p:指定端口号。
  • user:登录的用户名。
  • host:登录的主机。

默认的端口号为22,当端口号为22的时候,能够省略,间接应用如下形式:

ssh user@host

此外,如果本地正在应用的用户名与近程登录的用户名统一,登录用户名也是能够省略的,即如下:

ssh host

SSH近程登录实例

当初我有两台linux虚拟机,下面装置都是centOS6.5,ip别离为192.168.13.135和192.168.13.138,如下图:

当初,我须要操作的是通过SSH在192.168.13.138下面,登录到192.168.13.135下面。

首先,咱们能够应用如下命令,查看两台机器是否启用了ssh。

netstat -ntlp |grep ssh

应用如下命令进行连贯。

ssh -p 22 root@192.168.13.135

若在本机上是首次登录该近程主机,则会呈现如下界面。

大抵意思就是,无奈确认host主机的真实性,只晓得它的公钥指纹,问你还想持续连贯吗?输出yes即可。

而后输出明码,即可连贯ok了。

要想退出,间接输出exit即可。

SSH端口转发

SSH 不仅仅可能主动加密和解密 SSH 客户端与服务端之间的网络数据,同时,SSH 还可能提供了一个十分有用的性能,那就是端口转发,行将TCP 端口的网络数据,转发到指定的主机某个端口上,在转发的同时会对数据进行相应的加密及解密。如果工作环境中的防火墙限度了一些网络端口的应用,然而容许 SSH 的连贯,那么也是可能通过应用SSH转发后的端口进行通信。转发,次要分为本地转发与近程转发两种类型。

1.转发的参数

-C:压缩数据  -f :后盾认证用户/明码,通常和-N连用,不必登录到近程主机。  -N :不执行脚本或命令,通常与-f连用。  -g :在-L/-R/-D参数中,容许近程主机连贯到建设的转发的端口,如果不加这个参数,只容许本地主机建设连贯。  -L : 本地端口:指标IP:指标端口  -D : 动静端口转发  -R : 近程端口转发  -T :不调配 TTY 只做代理用  -q :宁静模式,不输入 谬误/正告 信息

2.本地转发

有本地网络服务器的某个端口,转发到近程服务器某个端口。说白了就是,将发送到本地端口的申请,转发到指标端口。格局如下:

ssh -L 本地网卡地址:本地端口:指标地址:指标端口 用户@指标地址。

当初咱们利用本地转发来解决一个问题,比方咱们有两台机器,如下:

centos A(192.168.13.139)

centos B(192.168.13.142)

当初,centos B(192.168.13.142)机器下面装置了mysql,并设置了运行任何主机连贯,如下:

此时,在centos A(192.168.13.139)下面是能够连上centos B(192.168.13.142)的mysql,如下:

那么,当初我开始centos B(192.168.13.142)限度不容许内部ip连贯,仅仅让127.0.0.1连贯,如下:

此时,centos A(192.168.13.139)下面怎么连贯上centos B(192.168.13.142)的mysql呢?

此时,咱们还是应用下面的mysql连贯形式,必定会报错,如下:

当然在centos B(192.168.13.142)mysql还是可拜访的。

这个时候,咱们就能够应用本地端口转发了,将本地的某个端口,映射到centos B(192.168.13.142)机器下面的,如下:

ssh -L 127.0.0.1:3306:127.0.0.1:3306 root@192.168.13.142

因为本地网卡地址是能够省略的,下面的转发,能够简写为:

ssh -L 3306:127.0.0.1:3306 root@192.168.13.142

当然,ssh连贯的时候,若两台机器的用户名雷同,也是能够省略的,即命令能够简写为:

ssh -L 3306:127.0.0.1:3306 192.168.13.14

下面的代码就是将本地的3306端口,转发到192.168.13.142的3306端口。因为centos B(192.168.13.142)下面的mysql应用的3606端口。当然,咱们首先得看看本地的3306端口是否被占用,如被占用,能够应用其余的端口。

数据流向如图:

首先,centos A(192.168.13.139)上的利用将数据发送到本地的127.0.0.1下面的3306端口。

而后,centos A(192.168.13.139)将3306端口的数据,通过SSH转发到centos B(192.168.13.142)的3306端口。

接着,centos B(192.168.13.142)将解决后的数据,原路返回给centos A(192.168.13.139)。

如果是首次通过ssh连贯cetosB该机器,则会提醒确认公钥,并让你抉择是否确定连贯。

此时,咱们在centos A下面连贯centos B下面的mysql,就能够这么写了。

bin/mysql -h127.0.0.1 -uroot -p

如下:

咱们能够通过上面命令,在centosA查看ssh转发监听的过程。

3.近程转发

由近程服务器的某个端口,转发到本地网络的服务器某个端口。说白了,就是将发送到近程端口的申请,转发到指标端口。格局如下:

ssh -R 近程网卡地址:近程端口:指标地址:指标端口

上面三台机器为例,如下:

centos A(192.168.13.139)

centos B(192.168.13.142)

win7(10.18.78.135)

假如,win7(10.18.78.135)与centos B(192.168.13.142)不能间接连贯,然而win7(10.18.78.135)与centos A(192.168.13.139)能够连贯centos B(192.168.13.142)也能够centos A(192.168.13.139)连贯,那么,咱们就能够在centos A(192.168.13.139)下面应用近程端口转发了,让win7(10.18.78.135)与centos B(192.168.13.142)进行通信。

ssh -R 127.0.0.1:80:10.18.78.135:80 root@192.168.13.142

即centos B(192.168.13.142)监听本人的80端口,而后将所有数据,由centos A(192.168.13.139)发给win7(10.18.78.135)。

SSH的近程操作

ssh近程操作,次要用于在近程的机器下面执行某个操作,格局如下:

ssh user@host 'command'

案例1、在机器A(192.168.13.148)中查看机器B(192.168.13.149)的操作系统类型。

在A机器下面执行如下代码:

ssh  dequan@192.168.13.149  'uname -a'

案例2、将机器A(192.168.13.148)中test文件夹复制到B机器(192.168.13.149)。

在A机器下面,执行如下命令:

tar -cz test | ssh dequan@192.168.13.149 'tar -xz'

当然,咱们也能够应用scp命令或rz命令,传输文件。

案例3、在机器A(192.168.13.148)处查看B机器(192.168.13.149)是否监听了1080端口。

在A机器下面,执行如下命令:

ssh dequan@192.168.13.149 'netstat -tln |grep 1080'

SSH的本地转发

本地转发,说白了,就是把发到本地的某个端口申请,转发到近程的某台机器下面。格局如下:

ssh -L [本地地址:]本地端口:近程地址:近程端口 近程用户@近程地址

案例1、在机器B(192.168.13.149)下面拜访机器A(192.168.13.148)的服务。

当初,咱们在A机器下面,启动了Nginx服务,如下:

咱们心愿B机器也可能这样应用A机器下面的服务。须要把B机器下面80端口申请,转发到A机器下面。目前在B机器这样执行,是报错的,如下:

须要在B机器下面,执行如下代码:

ssh -f -N -L 127.0.01:80:192.168.13.148:80 dequan@192.168.13.148

而后,在B机器下面,拜访A机器的服务,就想拜访本身的服务一样。

SSH的近程转发

近程转发,即把发给近程机器的某个端口申请,转发到本地的机器下面。格局如下:

ssh -R [近程地址:]近程端口:本地地址:本地端口 近程用户@近程地址

在下面的案例中,咱们也能够通过近程转发来实现。即在A机器下面执行如下代码:

sudo ssh -f -N -R 8081:127.0.0.1:80 dequan@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  #如果有  GatewayPorts no  #改为  GatewayPorts yes  #没有,增加即可    #而后重启sshd  sudo service sshd restart

而后从新,设置动静转发,如下:

ssh -f -g  -N -R 8081:127.0.0.1:80 dequan@192.168.13.149

能够看到,此时B机器,曾经监听了0:0.0.0:8081

在C机器下面,咱们通过curl模仿申请,利用B机器做代理,如下:

curl -x 192.168.13.149:8081 127.0.0.1

当然,如果还有其余机器,也能够应用相似的形式,来申请A机器。

SSH的动静转发

对于SSH的本地转发和近程转发,都须要将本地端口和近程端口一一绑定,格局如下:

ssh -D [本地地址:]本地端口号 近程用户@近程地址

比方,把发到B机器下面的申请,都转发到A机器下面,让A机器去执行申请。

SSH存在的问题

如果有人截获了登录申请,而后假冒近程主机,将伪造的公钥发给用户,那么用户很难分别真伪。因为不像https协定,SSH协定的公钥是没有证书核心(CA)公证的,也就是说,都是本人签发的。

能够构想,如果攻击者插在用户与近程主机之间(比方在公共的wifi区域),用伪造的公钥,获取用户的登录明码。再用这个明码登录近程主机,那么SSH的平安机制就依然如故了。这种危险就是驰名的"中间人攻打"(Man-in-the-middle attack)。

总结

本篇文章次要介绍了SSH的基本概念和实际中罕用的一些办法,并没有波及深层原理和优化的常识,在底层实现和协定具体内容还能持续深入研究。如果有什么疑难或倡议,能够在下方留言。