ssh远程登录

ssh远程登录

总结一下ssh配置以及常用操作。


ssh是用于远程登录计算机的一种协议,用于安全地登录远程服务器。

  1. 远程登录主机
1
$ ssh -p port_num user_name@ip_address
  1. ssh建立流程

  2. 远程主机收到用户ssh请求后把自己的公钥发送给用户。

  3. 用户端使用发来的公钥加密登录密码并且发送给远程主机。

  4. 远程主机用私钥解密用户端发来的登录密码,验证密码正确性。

这中间存在安全风险:如果有人截获了用户的登录请求并伪造服务器公钥发送给用户,用户几乎无法辨认真假,因为ssh的公钥没有公正都是自己签发的。故而,如果有人监听了用户的网络数据,则完全可以伪造服务器公钥骗取用户的登录密码。

这就是“中间人攻击”。

当用户登录进服务器后,服务器会在~/.ssh/known_hosts中保存公钥,以后服务器就不会再提示。


  1. 登录

为了解决每次都要输入密码的麻烦,可以使用公钥登录。

原理:用户将自己的公钥存储在远程主机上,登录的时候远程主机给用户发送一串随机字符串,用户用私钥加密后发给远程主机,远程主机用事先存储的公钥解密,成功则允许用户登录。

首先确保/etc/ssh/sshd_config中的如下三项开启:

1
2
3
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

开启后,重启ssh服务:

1
2
3
4
5
6
7
8
9
10
11
# centos6
$ service sshd restart

# centos7+
$ systemctl restart sshd.service

# ubuntu
$ service ssh restart

# debian
$ /etc/init.d/ssh restart

确保以上配置开启后。

首先,用户端生成公钥:

1
$ ssh-keygen

一般不用设置。

现在~/.ssh下会生成公钥id_rsa.pub和私钥id_rsa

再将公钥上传至远程主机:

1
$ ssh-copy-id user@host

  1. 添加公钥到authorized_keys文件末尾
1
$ ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub

完成!

总之,公钥用来加密,私钥用来解密。


  1. 使用ssh建立数据通路

看命令:

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

单引号中的再远程主机上执行,最后面将``~/.ssh/id_rsa.pub`输入重定向到远程主机,也就是说ssh可以再本地和远程之间建立命令和数据通道。

比如:

将本地src目录打包压缩传输到了远程服务器,远程服务器执行对本地传来的文件一个解压缩处理。中间的|是管道符,作用是将左侧命令的输出作为右侧命令的输入。

1
$ cd && tar -zcv src | ssh user@host 'tar xz'

同理,逆操作,将服务器上的src目录打包压缩后传输到本地并使用tar解压缩包。

1
$ ssh user@host 'tar cz src' | tar zxv

本地远程查看服务器进程:

1
$ ssh user@host 'ps aux | grep httpd'

  1. 绑定本地端口

让8080端口的数据通过ssh上传至远程主机:

1
$ ssh -D 8080 user@host

此时ssh会建立socket监听本地8080,并将8080端口收到的数据自动通过ssh上传至远程主机。

可以通过这种方式加密端口。


  1. 本地端口转发

假设本地主机localhost与remotehost无法直接通信,有一台中间主机middlehost可以同时连接两台主机。

那么就可以设置本地端口转发至middlehost。

下面:指定本地ssh绑定端口2121,指定middlehost将所有数据转发到目标主机的21端口(21为ftp端口)。

1
$ ssh -L 2121:remotehost:21 middlehost

参数分别是本地端口:目标主机:目标主机端口。

这个技术的作用是在本不能互相通信的localhost与remotehost之间建立了一条以middlehost为中继的ssh隧道。

下面是一个比较有趣的例子。

1
$ ssh -L 5900:localhost:5900 host3

它表示将本机的5900端口绑定host3的5900端口(这里的localhost指的是host3,因为目标主机是相对host3而言的)。

另一个例子是通过host3的端口转发,ssh登录host2。

1
$ ssh -L 9001:host2:22 host3

这时,只要ssh登录本机的9001端口,就相当于登录host2了。

1
$ ssh -p 9001 localhost

上面的-p参数表示指定登录端口。


  1. 远程端口转发

本地端口转发是指定本地端口的转发,而远程端口转发就是绑定远程端口的转发。

假设host1与host2无法通信,host3是一台内网主机可以连接外网的host1,但是host1不能连接host3。

这种情况解决办法是,既然host3可以连host1,那么就从host3上建立与host1的SSH连接,然后在host1上使用这条连接就可以了。

我们在host3执行下面的命令:

1
$ ssh -R 2121:host2:21 host1

R参数也是接受三个值,分别是”远程主机端口:目标主机:目标主机端口”。这条命令的意思,就是让host1监听它自己的2121端口,然后将所有数据经由host3,转发到host2的21端口。由于对于host3来说,host1是远程主机,所以这种情况就被称为”远程端口绑定”。

绑定之后,我们在host1就可以连接host2了:

1
$ ftp localhost:2121

这里必须指出,”远程端口转发”的前提条件是,host1和host3两台主机都有sshD和ssh客户端。

评论