ssh远程登录
总结一下ssh
配置以及常用操作。
ssh
是用于远程登录计算机的一种协议,用于安全地登录远程服务器。
- 远程登录主机
1 | $ ssh -p port_num user_name@ip_address |
ssh建立流程
远程主机收到用户ssh请求后把自己的公钥发送给用户。
用户端使用发来的公钥加密登录密码并且发送给远程主机。
远程主机用私钥解密用户端发来的登录密码,验证密码正确性。
这中间存在安全风险:如果有人截获了用户的登录请求并伪造服务器公钥发送给用户,用户几乎无法辨认真假,因为ssh的公钥没有公正都是自己签发的。故而,如果有人监听了用户的网络数据,则完全可以伪造服务器公钥骗取用户的登录密码。
这就是“中间人攻击”。
当用户登录进服务器后,服务器会在~/.ssh/known_hosts
中保存公钥,以后服务器就不会再提示。
- 登录
为了解决每次都要输入密码的麻烦,可以使用公钥登录。
原理:用户将自己的公钥存储在远程主机上,登录的时候远程主机给用户发送一串随机字符串,用户用私钥加密后发给远程主机,远程主机用事先存储的公钥解密,成功则允许用户登录。
首先确保/etc/ssh/sshd_config
中的如下三项开启:
1 | RSAAuthentication yes |
开启后,重启ssh服务:
1 | # centos6 |
确保以上配置开启后。
首先,用户端生成公钥:
1 | $ ssh-keygen |
一般不用设置。
现在~/.ssh
下会生成公钥id_rsa.pub
和私钥id_rsa
。
再将公钥上传至远程主机:
1 | $ ssh-copy-id user@host |
- 添加公钥到authorized_keys文件末尾
1 | $ ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub |
完成!
总之,公钥用来加密,私钥用来解密。
- 使用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' |
- 绑定本地端口
让8080端口的数据通过ssh上传至远程主机:
1 | $ ssh -D 8080 user@host |
此时ssh会建立socket监听本地8080,并将8080端口收到的数据自动通过ssh上传至远程主机。
可以通过这种方式加密端口。
- 本地端口转发
假设本地主机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参数表示指定登录端口。
- 远程端口转发
本地端口转发是指定本地端口的转发,而远程端口转发就是绑定远程端口的转发。
假设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客户端。