ssh登录、打隧道详解

ssh是什么?

   SSH是Secure Shell protocal的缩写,它是一种网络协议,用于计算机之间的加密登录。它将登录信息全部加密并压缩,这样别人要用网络工具什么来截取包获得信息就困难了,使用ssh协议登录另一台远程计算机,我们就可以任务这种登录是安全的,即使被中途截获,密码也不会泄漏。而传统的网络服务程序,ftp、telnet在网络上用明文传送口令和数据,传输并不安全,一旦被截获,内容就暴露无疑。ssh成为互联网安全的一个基本解决方案,成为linux系统的标准配置。
   SSH只是一种协议,存在多种实现,有商业版的,也有开源实现的,OpenSSH就是开源实现。

ssh 登录命令

  ssh 主要用于远程登录,假如你要以用户名user登录远程主机host,只需要执行

ssh user@host

如果本地用户名和远程用户名一致,登录时可以忽略用户名

ssh host

ssh的默认端口号是22, 使用-p参数指定端口号

密码登录与中间人攻击

   ssh之所以是安全的,原因是它使用了公钥加密。ssh分为两部分:客户端和服务端部分。ssh 服务端是一个daemon进程,它在后台运行,接受来自客户端的请求,提供对远程连接的处理。整个登录过程如下:

  1. 远程主机收到用户的登录请求,把自己的公钥发给用户
  2. 用户使用该公钥,将登录密码加密后,发送给远程主机。
  3. 远程主机用自己的私钥,解密登录密码,如果密码正确,就用户登录。

&nsbp; 整个登录本身是安全的,但如果有人(比如在公共的wifi区域)截获了登录请求,然后冒充远程主机,将自己伪造的公钥发给用户,用户很难去辨别真伪,从而获取到用户的登录密码再去登录远程主机。ssh是如何应对的呢?
在第一次登录对方主机时,系统会出现如下提示:

$ ssh user@host
  The authenticity of host 'host (12.18.429.21)' can't be established.
  RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d.
  Are you sure you want to continue connecting (yes/no)?

   提示表示无法缺失host主机的真实性,只知道该主机的公钥指纹(MD5加密后的RSA算法),问是否继续连接? 那么用户怎么知道远程主机的公钥指纹是否正确? 用户没有好的办法知道,远程主机必须在自己的网站上贴出公钥指纹,以便用户自行核对。
  输入yes,表示远程主机已经得到认可。然后要求输入密码,如果密码正确,就可以登录成功。当远程主机的公钥被接受以后,它就会被保存在$HOME/.ssh/known_hosts之中,下次再连接这台主机,系统就会认出它的公钥已经保存在本地,从而跳过警告部分,直接提示输入密码。

  Warning: Permanently added 'host,12.18.429.21' (RSA) to the list of known hosts.

 Password: (enter password):

公钥登录

      使用密码登录,每次都要输入密码,太麻烦了,ssh还提供了公钥登录,可以省去输入密码的步骤。
      公钥登录的原理很简单,就是用户将自己的公钥存储在远程主机上,登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回给远程主机,远程主机用事先存储好的公钥进行解密,如果成功,就表面用户是可信的,允许直接登录shell,不要求输入密码。
      使用公钥登录,要求用户必须提供自己的公钥,如果没有现成的,可以直接ssh-keygen生成一个,运行该命令后,系统会出现一系列提示,一路回车即可,运行结束后,在$HOME/.ssh/目录下,会新生成两个文件:id_rsa.pub(公钥)和id_rsa(私钥)。再使用ssh-copy-id user@host,将公钥传送到远程主机上去。 远程主机将用户的公钥保存在登录后的用户主目录$HOME/.ssh/authorized_keys文件中。公钥其实就是一段字符串,直接append到authorized_keys文件中即可。可通过ssh执行命令的方式完成该append操作。

  $ ssh-keygen
  $ ssh-copy-id user@host
    $ ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub

远程操作

      ssh不仅可以用于远程主机登录,还能直接在远程主机上执行操作。

$ ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub

单引号中间的部分表示在远程主机上执行的操作,输入重定向表示数据通过SSH传向远程主机。SSH可以在用户和远程主机之间建立命令和数据传输通道,scp命令可以用ssh来代替。

  • 将$HOME/src/目录下所有的文件,复制到远程主机$HOME/src/目录下。
$ cd && tar czv src | ssh user@host 'tar xz'
  • 将远程主机$HOME/src/目录下面的所有文件,复制到用户的当前目录。
$ ssh user@host 'tar cz src' | tar xzv
绑定本地端口

   因为ssh可以传送数据,我们可以让那些不加密的网络连接,全部改走ssh连接,这样能提高安全性。下面的命令ssh会建立一个socket,去监听本地的8080端口,一旦有数据传向那个端口,就会自动把它转移到ssh连接上面,发往远程主机。这样原来不加密的8080端口就变成了一个加密的端口。

  $ ssh -D 8080 user@host
本地端口转发

   有时候可能无法直接ssh到远程主机,这时本地端口还不够,必须通过跳转机来实现数据的传送,ssh同样可以实现这样的功能,称之为本地端口转发(local forwarding)。假定host1是本地主机,host2是远程主机,两者无法连通,host3可以同时连通host1和host2, host1想访问host2的服务可以通过host3实现跳转。在host1上执行下面命令,命令中的L参数一共接受三个值,分别是"本地端口:目标主机:目标主机端口,它们之间用冒号分隔。该命令实现的功能是,ssh绑定本地端口2121(创建socket并监听),然后将所有该端口监听到的数据通过host3进行转发到host2相应的端口,这样访问host1上的2121端口就等于访问host2的21端口。本地端口转发使得host1与host2之间仿佛形成了一个数据传输的秘密隧道,因此又称为ssh隧道。

  $ ssh -L 2121:host2:21 host3
远程端口转发

   远程端口转发是指绑定远程端口的转发,接着上面的例子,host1与host2之间无法连通,必须借助host3转发,但host3可以连接host1,而反过来host1却不能连接host3,这时本地端口转发就不能用了,怎么办? 既然host3可以连接host1,就从host3上建立与host1的ssh连接,然后在host1上使用这条连接就可以了。我们在host3上执行下面命令,R参数也是接受三个值,分别是"远程主机端口:目标主机:目标主机端口,该命令的意思是让host1监听他自己的2121端口,然后将所有的数据经由host3,转发到host2的21端口,由于对于host3来说, host1是远程主机,因此这种情况称之为“远程端口绑定”。绑定之后,就可以实现直接从host1连接host2了。

  $ ssh -R 2121:host2:21 host1
ssh其他参数

    -N 表示只连接远程主机,不打开远程shell,T参数表示不为这个连接分配TTY,TN可以放在一起用,代表这个ssh连接只用来传输数据,不执行远程操作。f参数,表示SSH连接成功后,转入后台运行。这样就可以在不中断SSH连接的情况下,在本地shell中执行其他操作。要关闭这个后台连接,就只有用kill命令去杀掉进程。

  $ ssh -NT -D 8080 host
  $ ssh -fN -D 8080 host // 必须要有-N参数,否则报错 Cannot fork into background without a command to execute. 
总结

    本文较详细讲解了什么是ssh,ssh登录过程,ssh打隧道,ssh功能非常强大,需要多在实践中去消化。

你可能感兴趣的:(ssh登录、打隧道详解)