linux ssh
ssh远程登录
密码登录
整个过程所示:
(1)远程主机收到用户的登录请求,把自己的公钥发给用户。
(2)用户使用这个公钥,将登录密码加密后,发送回来。
(3)远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。
问题 这个过程本身是安全的,但是实施的时候存在一个风险: Client端如何保证接受到的公钥就是目标Server端的?
如果一个攻击者中途拦截Client的登录请求,向其发送自己的公钥,Client端用攻击者的公钥进行数据加密。攻击者接收到加密信息后再用自己的私钥进行解密,不就窃取了Client的登录信息了吗?因为不像https协议,SSH协议的公钥是没有证书中心(CA)公证的,也就是说,都是自己签发的。
通常在第一次登录的时候,系统会出现下面提示信息:无法确认主机host(12.18.429.21)的真实性,不过知道它的公钥指纹,询问你是否继续连接? 当远程主机的公钥被接受以后,它就会被保存在文件$HOME/.ssh/known_hosts之中。下次再连接这台主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。
公钥登录(基于公钥的认证)
使用密码登录,每次都必须输入密码,非常麻烦。好在SSH提供了另外一种可以免去输入密码过程的登录方式:公钥登录。
所谓"公钥登录",原理很简单,就是用户将自己的公钥储存在远程主机上。 公钥认证流程:
-
Client端用户TopGun将自己的公钥存放在Server上,追加在文件authorized_keys中。
-
Server收到登录请求后,随机生成一个字符串str1,并发送给Client。
-
Client用自己的私钥对字符串str1进行加密。
-
将加密后字符串发送给Server。
-
Server用之前存储的公钥进行解密,比较解密后的str2和str1。
-
根据比较结果,返回客户端登陆结果。
生成公钥
1、在本机生成密钥对
使用ssh-keygen命令生成密钥对:
ssh-keygen -t rsa #-t表示类型选项,这里采用rsa加密算法 然后根据提示一步步的按enter键即可(其中有一个提示是要求设置私钥口令passphrase,不设置则为空,这里看心情吧,如果不放心私钥的安全可以设置一下),执行结束以后会在 /home/当前用户 目录下生成一个 .ssh 文件夹,其中包含私钥文件 id_rsa 和公钥文件 id_rsa.pub。
2、将公钥复制到远程主机中
使用ssh-copy-id命令将公钥复制到远程主机。ssh-copy-id会将公钥写到远程主机的 ~/ .ssh/authorized_key 文件中
ssh-copy-id ldz@192.168.0.1 经过以上两个步骤,以后再登录这个远程主机就不用再输入密码了。
SSH端口转发
SSH 不仅仅能够自动加密和解密 SSH 客户端与服务端之间的网络数据,同时,SSH 还能够提供了一个非常有用的功能,那就是端口转发,即将TCP 端口的网络数据,转发到指定的主机某个端口上,在转发的同时会对数据进行相应的加密及解密。如果工作环境中的防火墙限制了一些网络端口的使用,但是允许 SSH 的连接,那么也是能够通过使用SSH转发后的端口进行通信。转发,主要分为本地转发与远程转发两种类型。
转发的参数:
-C:压缩数据 -f :后台认证用户/密码,通常和-N连用,不用登录到远程主机。 -N :不执行脚本或命令,通常与-f连用。 -g :在-L/-R/-D参数中,允许远程主机连接到建立的转发的端口,如果不加这个参数,只允许本地主机建立连接。 -L : 本地端口:目标IP:目标端口 -D : 动态端口转发 -R : 远程端口转发 -T :不分配 TTY 只做代理用 -q :安静模式,不输出 错误/警告 信息
本地转发
有本地网络服务器的某个端口,转发到远程服务器某个端口。说白了就是,将发送到本地端口的请求,转发到目标端口。格式如下: ssh -L 本地网卡地址:本地端口:目标地址:目标端口 用户@目标地址。
案例:B服务器上的mysql只允许127.0.0.1连接,A服务器想要连接mysql只能
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 -R 远程网卡地址:远程端口:目标地址:目标端口