SSH远程连接
# 远程管理服务
# SSH
SSH即安全外壳协议(Secure Shell Protocol),他是一种安全的、数据信息加密的远程连接协议,一般作为Linux系统默认的远程连接方式。
Shell的概念如下:
- 每次连接登录一个Linux系统,就是一个Shell。
- 一个Linux系统可以被多个Shell会话同时连接。
- 使用Shell切换用户,同等于登录一个新Shell。
- 每个Shell中配置的变量,不会影响其他Shell。
- 配置Shell的命令行界面 如主机名,需要切换Shell,使用bash命令同等于再次连接Shell。
# TELNET
TELNET相较于SSH来说,是一种不安全的远程连接协议,它的所有数据信息包括密码都是明文的,一般仅用于内网调试网络设备,或者测试端口是否能连通。
# 中间人攻击
所谓“中间人”的攻击方式, 就是“中间人”冒充真正的服务器接收你传给服务器的数据,然后再冒充你把数据传给真正的服务器。服务器和你之间的数据传送被“中间人”一转手做了手脚之后,就会出现很严重的问题。
传统的网络服务程序,如:ftp、pop和telnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据。
别有用心的人非常容易就可以截获这些口令和数据。而且,这些服务程序的安全验证方式也是有其弱点的, 就是很容易受到“中间人”这种方式的攻击。
# SSH协议的优点
通过使用SSH,你可以把所有传输的数据进行加密,这样"中间人"这种攻击方式就不可能实现了,而且也能够防止DNS欺骗和IP欺骗。
使用SSH,还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。
SSH有很多功能,它既可以代替Telnet,又可以为FTP、PoP、甚至为PPP提供一个安全的"通道"。
# SSH远程连接方式
# SSH服务相关文件位置
SSH服务器密钥保存位置:/etc/ssh/
,没有后缀代表私钥,.pub
后缀代表公钥。
SSH客户端公钥保存位置:~/known_hosts
。
# 私钥与公钥作用
私钥与公钥用于数据传输前后对信息进行加密解密处理,利用公钥和私钥进行用户身份认证。
# 密码连接原理
SSH客户端执行连接命令,请求建立远程连接。
ssh -p [端口号] [IP地址]
不设置用户名时,默认以客户端当前登录用户名登录。
三次握手。
SSH客户端发送TCP连接请求,客户端和服务端通过三次握手建立TCP连接。
SSH版本协商。
服务端返回版本信息给客户端,然后客户端也会返回版本信息给服务端,双方通过版本协商确定使用的版本。
密钥交换。
服务端会先生成一对密钥对(公钥A、私钥B)。
然后服务端以明文形式将公钥A发送给客户端。
SSH客户端询问用户是否保存该公钥。
由于是明文传输的,所以可能遭到中间人攻击,所以会提示是否信任这个公钥。
如果确认,则客户端会保存该公钥到~/known_hosts文件中。
SSH客户端生成一个会话密钥C,并使用公钥A进行加密然后发送给服务端。
SSH服务端收到后,使用秘钥B对收到的信息进行解密得到密钥C。
认证阶段。
- 客户端使用密钥C对账号密码进行加密,然后发送给服务端。
服务端收到后,会使用密钥C进行解密,得到用户的账号密码。
验证完毕后,服务端使用密钥C对认证结果进行加密,然后发送给客户端。
数据通信阶段。
客户端发送信息使用密钥C进行加密,解密信息也使用密钥C。
服务端发送信息也是使用密钥C进行加密,解密信息也使用密钥C。
# 秘钥连接
- SSH客户端创建密钥对。
- 私钥需要服务器自己安全保存,公钥需要分发给客户端。
- 生成密钥对命令
ssh-keygen -t [加密方式]
,默认会保存在提示的目录中。
SSH客户端使用口令方式建立远程连接分发公钥到服务端。
ssh-copy-id -i [公钥路径] [用户名]@[远程主机IP地址]
SSH客户端请求使用秘钥建立远程连接,同时将公钥带上。
ssh [远程主机IP地址]
SSH服务端收到之后,会查找对应登录账号的家目录下是否有该公钥,如果没有则直接登录失败,如果有则下一步。
SSH服务端使用公钥加密一个随机字符串发送给客户端进行质询。
SSH客户端使用私钥进行解密,并将解密结果返回给服务端。
SSH服务端收到后验证质询结果是否正确,如果正确,则远程管理连接建立成功。
# SSH远程连接方式
# 基于口令方式进行远程连接
ssh -p 22 [用户名]@[远程主机IP地址]
- 不设置用户名时,默认以客户端当前登录用户名登录。
# 基于证书方式进行远程连接
使用密钥进行认证登录连接,更加安全,以文件进行登录。公钥和私钥可以完成身份认证工作。
# SSH服务相关命令
# ssh
口令方式登录:
ssh -p 22 [用户名]@[远程主机IP地址]
- 不设置用户名,时默认以客户端当前登录用户名登录
证书方式登录:
ssh [远程主机IP地址] [命令]
- 直接使用ssh进行远程主机命令执行,无需输入账号密码,在证书中有写。
# ssh-keygen
ssh-keygen -t [加密方式]
生成密钥对,默认会保存在提示的目录中。
SSH1只支持RSA加密方式,为了保证兼容性可以使用此方式。
SSH2支持所有加密方式。
# ssh-copy-id
ssh-copy-id -i [公钥路径] [用户名]@[远程主机IP地址]
- 分发公钥到指定主机的指定用户家目录的~/.ssh/authorized_keys文件中。
# sshpass
sshpass -p [密码] [ssh相关命令语句]
- 使能够以参数方式输入密码,例如:sshpass -p [密码] ssh-copy-id ...
# scp
scp -rp [本地文件] [用户名]@[远程主机IP地址]:[远程保存路径]
- 基于SSH的远程传输,可使用密匙进行认证。
# sftp
sftp [参数] [目标主机IP地址]
- 基于SSH的远程文件管理,可使用密匙进行认证。
- 连接后可以使用如下命令进行操作:
- pwd 查看远程主机当前目录
- ls 查看远程主机文件
- cd 切换远程主机目录
- lcd 切换本地主机目录
- rm 删除远程主机文件
- get 下载远程主机文件到本地
- put 上传本地文件到远程主机
- bye 退出sftp连接
# 编写脚本批量分发公钥
# for循环
- for 变量名 in 迭代对象 do 循环的命令 done
# 也可以用来进行串行批量管理 - 如利用ssh进行安装软件等
- 第一个参数是$1,第二个参数是$2,第三个......
- 可以使用""防止一个命令因为空格变成多个参数
- ssh $IP $1
- 串行批量管理 - 一台一台的执行管理
# IP如何输入
for IP in {31,41} -- 使用{}进行迭代
for IP in
cat ./HostIP.txt
- 将所有IP写在一个文本中 将文本作为迭代对象
# 免交互输入密码信息
- 管理端安装 yum install -y sshpass
- sshpass -p [密码] [ssh命令语句]
# 免确认YES和NO信息
- 使用ssh参数 使其不要询问 一切都是YES
- ssh -o "StrictHostKeyChecking=no"
# 指定端口号信息
- 使用ssh-copy-id参数
- ssh-copy-id -p [指定端口号]
# SSH服务的配置文件
配置文件位置:/etc/ssh/sshd_config
- 文件内容中注释表示默认配置。
# 常用
PasswordAuthentication no
- 是否启用密码登录
PermitEmptyPasswords no
- 是否允许远程用户使用空密码登录
PermitRootLogin no
- 是否允许远程使用root用户登录
Port 22
- SSH服务端口号
ListenAddress 0.0.0.0
- 指定监听地址,用来限制连接网段,连接相关尽量别改需要重启网卡。
- 指定监听地址只能是本地网卡上的地址,也就是ip address命令里的地址。
- 也可以使用0.0.0.0代表监听所有网段或主机。
# 其他
GSSAPIAuthentication no
- 是否开启GSSAPI认证功能
- 一般不用 会影响连接速度 所以最好关闭
UseDNS no
是否开启反向DNS解析功能
- 连接慢时 最好关闭 开启会影响连接速度
PubkeyAuthentication yes
- 是否启用秘钥登录
RSAAuthentication yes
- 是否启用RSA认证