Linux架构05 ssh, telnet, scp命令, sftp命令, ssh连接方式(免密登录实践), sshpass, ssh服务器配置
SSH是一个安全协议,在进行数据传输时,会对数据包进行加密处理,加密后再进行数据传输。确保了数据传输安全。那SSH服务主要功能有哪些呢? 1.提供远程连接服务器的服务 linux远程连接协议:ssh 22 telnet 23 windows远程连接协议:RDP(remote desktop) 3389 2.对传输进行加密
面试题:请说明下列服务都是哪些端口? ssh 22 telnet 23 http 80 https 443 ftp 20 21(一个上传,一个下载) RDP 3389 mysql 3306 dns 53 zabbix 10051 10050 elasticsearch 9200 9300 pop3 110 rpcbind 111 rsync 873 redis 6379
# 1.安装telnet [root@nfs ~]# yum install -y telnet-server # 2.启动telnet [root@nfs ~]# systemctl start telnet.socket # telnet不支持root用户,只支持普通用户 # 3.创建普通用户 [root@nfs ~]# useradd lhd [root@nfs ~]# echo 123 | passwd --stdin lhd # 设置密码 # 4.验证登录 telnet 10.0.0.31 23 # 或者使用xshell的telnet连接方式连接
telnet: 1.不支持root直接登录,只能用普通用户 2.数据传递是明文的 ssh: 1.支持root直接登录 2.所有数据传递都是加密的
[root@web01 ~] ssh -p 22 root@10.0.0.31 ssh # 命令 -p # 指定端口(在终端无法使用) 22 # 指定ssh协议端口 root # 连接时使用的用户(如果不写用户,默认使用当前服务器当前用户) @ # 分隔符 10.0.0.31 # 远端服务器IP
修改ssh端口
# 修改ssh端口 [root@nfs ~]# vim /etc/ssh/sshd_config ------------------- Port 2222 # 解开注释,修改端口 ------------------- # 重启sshd [root@nfs ~]# systemctl restart sshd
#多次跳转 #先连接到206,再从206连接210 [root@rocky ~]# ssh -t 10.0.0.206 ssh -t 10.0.0.210 root@10.0.0.206's password: root@10.0.0.210's password: #在远程主机执行完命令后就断开 [root@ubuntu ~]# ssh 10.0.0.210 "ip a s ens33" #在远程主机运行本地脚本 #ssh 连到 210上执行 [root@ubuntu ~]# ssh 10.0.0.210 /bin/bash < test.sh
# 1.查网络,连接谁就ping谁 ping 10.0.0.31 tcping 10.0.0.31 22 # 防火墙设定禁ping,用这种方式 # 2.查端口 telnet 10.0.0.31 22 tcping 10.0.0.31 22 # 3.如果可以ping通,端口不通 需要监测服务端口 netstat -lntp | grep sshd # 4.网卡是否启动 ip a # 5.防火墙 查看防火墙规则是否允许ssh服务 firewall-cmd --list-all # 6.查看虚拟网络编辑器 查看网关是否正确 # 7.查看电脑的VMnat8网卡,配置信息是否正确
scp客户端命令:远程拷贝 scp类似rsync scp全量 rsync增量 # scp支持推和拉 # 推: 将本地的/data目录推送到backup服务器的/tmp目录下 [root@nfs ~]# scp -r /data/ root@172.16.1.41:/tmp/ # 推: 将本地的/data目录下的文件推送到backup服务器的/tmp目录下 [root@nfs ~]# scp -r /data/* root@172.16.1.41:/tmp/ # 拉: 将远端172.16.1.41服务器的/data目录拉取到本地的/tmp目录下 [root@nfs tmp]# scp -r root@172.16.1.41:/data /tmp/ -P 指定端口,默认是22 (基于ssh协议) -p 保持传输文件属性不变 -r 表示递归拷贝目录(如果是文件可以不加该参数) -l 限速(单位是kb) # -l 限速 单位是 kb [root@nfs tmp]# scp file root@172.16.1.41:/backup/ root@172.16.1.41's password: file 46% 234MB 14.5MB/s 00:18 # 设置速度为10M 10*1024*8=81920(换算成kb) [root@nfs tmp]# scp -l 81920 file root@172.16.1.41:/backup/
sshpass
ssh登陆不能在命令行中指定密码。sshpass的出现,解决了这一问题。sshpass用于非 交互SSH的密码验证,一般用在sh脚本中,无须再次输入密码(本机known_hosts文件中有的主机才能 生效)。它允许你用 -p 参数指定明文密码,然后直接登录远程服务器,它支持密码从命令行、文件、环 境变量中读取。 [root@ubuntu ~]# apt install sshpass 格式: sshpass [option] command parameters #常用选项 -p password #指定明文密码 -f filename #从文件中读取密码,文件的第一行为密码 -e #将环境变量SSHPASS作为密码 [root@ubuntu ~]# ssh 10.0.0.161 hostname -I root@10.0.0.161's password: 10.0.0.161 [root@ubuntu ~]# sshpass -p 123456 ssh 10.0.0.161 hostname -I 10.0.0.161 [root@ubuntu ~]# cat pwd.txt 123456 [root@ubuntu ~]# sshpass -f pwd.txt ssh 10.0.0.161 hostname -I 10.0.0.161 [root@ubuntu ~]# export SSHPASS=123456 [root@ubuntu ~]# sshpass -e ssh 10.0.0.161 hostname -I 10.0.0.161
基于SSH协议,默认端口22 # 文件传输命令 [root@web01 ~]# sftp root@10.0.0.31 # 查看连接后服务器 sftp> ls # 查看本地服务器 sftp> lls
# 本地服务器进入/root目录
sftp> lcd /root
# 显示本地服务器路径
sftp> lpwd
# 操作本地服务器的,命令前面加个l #命令 远端服务器文件 本地服务器位置 sftp> get 1_nfs.gif ./ # 把远端文件拉到本地服务器 #命令 本地服务器文件 远程服务器位置 sftp> put /data/1_nfs.gif /tmp/ # 往远端服务器推文件 # 图形界面: Xftp FileZilla FlashFXP sftp: 1.能上传文件夹 2.能支持断点续传 3.支持上传大于4G的文件 rz: 1.不能上传文件夹 2.不支持断点续传 3.只能上传小于4G的文件
#需要知道服务器的IP,端口,账户,密码,才可以通过ssh客户端连接远程主机 [root@web01 ~]# ssh -p 22 root@172.16.1.31 # 一般企业里端口不会用22 # 密码设置条件 1.复杂的密码: yonghu_id_ip_sysnum(类似这种记不住) 2.简单的密码: 容易被破解 3.每台服务器密码不一样 4.密码三个月更换一次 5.输入密码错误三次自动锁死 6.密码有key,30秒一变或者1分钟一变
默认情况下,通过ssh客户端命令登录远程服务器,需要提供远程系统上的账号与密码,但为了降低密码泄露的几率和提高登录的方便性,建议使用秘钥验证方式。
-t 指定秘钥类型 rsa dsa -C 指定用户邮箱 [root@m01 ~]# ssh-keygen # 一直回车即可(windows上也是可以生成密钥对的) Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Created directory '/root/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: SHA256:JOpKBOMhaCCJzjpctZcopaHwaMMfqIBJSMAmlvkRVsw root@m01 The key's randomart image is: +---[RSA 2048]----+ |Xooo=. | |XB.o E | |/*+ * + o | |O@o* + = | |*.= + . S | |+o o | | .. . | | . . | | . | +----[SHA256]-----+ [root@m01 ~]#
注意:密钥对是在用户对应家目录下创建,密钥对是对应用户的,是不能共用的。如果要免密连对方qiudaodsb用户,就要将秘钥放到qiudaodsb的家目录下。
如果秘钥要让lhd使用,就需要秘钥赋权lhd。
authorized_keys末尾下一行继续加入即可。
ssh-copy-id命令推送的方式,也是在authorized_keys末尾的下一行加入
# 方式一:手动复制公钥 m01管理机操作 [root@m01 .ssh]# cat id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCqI3wyeRp47NiTEdO61r1WfaVr/bKESf70q52lLYZ1p00TAF9uTW4FMNloR8mLWJ720djQwUs4TWA5w4oy91aD0p+jwVyIf1PEq9VX+5UX5rsl2e4eLsyclPm+SIyfMtvWJqLw8PTJsS9HR41n1LpF7YhgmElnQPzraIVz7l9oxSrWyzCn6/NjM/PSVuqxrdeIv7Q8Jd18PB9yVXBA+2XMGV1u5cnxqdHlnweteVbywv5UhWsuEZtV4XzEs1KRPbkrALErYF/NEWSfDdGqLK4/4i9Rec28XQb+q5ggu24+DQDkkSh/CgqRxq2gvs5PNXlM2RR4K3QJOg7D2ZxLsHAh root@m01 # 把公钥复制到要连接的服务器web01 web01服务器操作 # 到web01下看是否有.ssh文件夹,没有就创建并赋权700 [root@web01 ~]# mkdir .ssh/ [root@web01 ~]# chmod 700 .ssh # 如果.ssh是手动创建的,要给700权限 [root@web01 ~]# vim .ssh/authorized_keys # 注意:保证写入的是一行内容 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCqI3wyeRp47NiTEdO61r1WfaVr/bKESf70q52lLYZ1p00TAF9uTW4FMNloR8mLWJ720djQwUs4TWA5w4oy91aD0p+jwVyIf1PEq9VX+5UX5rsl2e4eLsyclPm+SIyfMtvWJqLw8PTJsS9HR41n1LpF7YhgmElnQPzraIVz7l9oxSrWyzCn6/NjM/PSVuqxrdeIv7Q8Jd18PB9yVXBA+2XMGV1u5cnxqdHlnweteVbywv5UhWsuEZtV4XzEs1KRPbkrALErYF/NEWSfDdGqLK4/4i9Rec28XQb+q5ggu24+DQDkkSh/CgqRxq2gvs5PNXlM2RR4K3QJOg7D2ZxLsHAh root@m01 # 授权 [root@web01 ~]# chmod 600 .ssh/authorized_keys # m01即可免密登录。注意: 必须授权,不授权就无法免密登录
# 方式二:命令推送公钥 [root@m01 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@172.16.1.31 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: ".ssh/id_rsa.pub" The authenticity of host '172.16.1.31 (172.16.1.31)' can't be established. ECDSA key fingerprint is SHA256:2SQdzwgUOhQNWwPZEZSV9NaJ2i3tS2GgUaCazKOyOew. ECDSA key fingerprint is MD5:24:68:a9:38:f3:00:b4:7b:8a:72:0f:2a:c9:77:82:e0. Are you sure you want to continue connecting (yes/no)? yes /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys root@172.16.1.31's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'root@172.16.1.31'" and check to make sure that only the key(s) you wanted were added. # m01即可免密登录。注意: 该方式推送,对方服务器.ssh和authorized_keys已赋权 [root@nfs ~]# [root@m01 ~]# ssh 172.16.1.31 # 免密登录 Last login: Fri Jul 21 23:49:07 2023 from 10.0.0.1
注意:如果要谁送给对方的qiudaodsb用户, 会在对方qiudaodsb的家目录下存在authorized_keys文件,权限也是对的
ssh-copy-id -i id_rsa.pub qiudaodsb@172.16.1.31
注意:如果本地lhd想用秘钥免密登录对方服务
[root@m01 .ssh]# cp id_rsa* /home/lhd/ .ssh/ # 进行授权 [root@m01 .ssh]# chown -R lhd.lhd id_rsa* [root@m01 .ssh]# su - lhd [lhd@m01 .ssh]# ssh root@172.16.1.31 # 可以免密登录
注意: 如果有很多台服务器都需要公钥部署,可以采用多机互相打通的方式(共用公钥)
#先生成密钥对 [root@ubuntu ~]# ls .ssh/ [root@ubuntu ~]# ssh-keygen ...... ...... [root@ubuntu ~]# ls .ssh/ id_rsa id_rsa.pub #然后将公钥复制到本机 [root@ubuntu ~]# ssh-copy-id 127.1 ...... ...... [root@ubuntu ~]# ls .ssh/ authorized_keys id_rsa id_rsa.pub known_hosts known_hosts.old #将 .ssh 目录整体复制到其它主机,这样表示多机共用密钥对 [root@ubuntu ~]# rsync -a .ssh 10.0.0.157:/root/ [root@ubuntu ~]# rsync -a .ssh 10.0.0.154:/root/
[root@m01 ~]# vim xunjian.sh -------------------------- #!/bin/bash [ $# -ne 1 ] && echo "请输入执行的命令" && exit 1 for i in 31 41 7 do echo "#####172.16.1.$i#####" ssh root@172.16.1.$i "$1" done -------------------------- [root@m01 ~]# sh xunjian.sh "df -h"
4) 免密登录人需要密码的问题
1.权限问题(600,700,普通用户文件一定是该用户的属主属组) 2.密码内容问题 (内容错误,内容不是单行)
实践场景,用户通过windows/MAC/Linux客户端连接跳板机免密码登录,跳板机连接后端无外网的Linux主机实现免密登录,架构图如下。
实践多用户登录一台服务器无密码
实践单用户登录多台服务器免密码
windows下的powershell也可以,这里展示xshell的制作过程
确定(不用管密码是空的)
获取公钥,可以复制,也可以导出成文件
# 在m01管理机上,创建公钥(和上方一样,没有.ssh文件夹就创建并赋权) (如果有内容,就在下面追加即可) [root@nfs .ssh]# vim authorized_keys [root@nfs .ssh]# chmod 600 authorized_keys
xshell通过秘钥的方式连接跳板机
ssh服务器配置
[root@ubuntu ~]# cat /etc/ssh/sshd_config Port 22 #远程端口,生产建议修改 ListenAddress ip LoginGraceTime 2m PermitRootLogin yes #默认ubuntu不允许root远程ssh登录 StrictModes yes #检查.ssh/文件的所有者,权限等 MaxAuthTries 6 #一次连接,最多可以输错6次密码 MaxSessions 10 #同一个连接最大会话,就是xshell上 的复制ssh隧道,修改后对新连接生效 PubkeyAuthentication yes #开启基于key验证 PermitEmptyPasswords no #不允许空密码连接 PasswordAuthentication yes #开启基于用户名和密码连接(这个改成no就不能密码登录了,可防止黑客攻击) MaxStartups 10:30:100 #未认证连接最大值,默认值10 PrintMotd no #是否输出motd信息,改成yes 则 motd 会输出两次 PrintLastLog yes #是否输出上次登录信息 UseDNS yes #是否需要解析主机名,no可加快连接 速度 GSSAPIAuthentication yes #是否开启客户端对IP反解析,提高速 度可改为no Banner /path/file #远程连接时的登录前提示 #以下可以限制可登录用户的办法: AllowUsers user1 user2 user3 #用户名白名单 DenyUsers user1 user2 user3 #用户名黑名单 AllowGroups g1 g2 #用户组白名单 DenyGroups g1 g2 #用户组黑名单
#设置ssh服务超时断开连接 #10s如果没有互动,则断开链接,永久生效可以写配置文件,例如可以写在 /etc/profile 里面 [root@ubuntu ~]# export TMOUT=10 #关闭dns解析选项,加快连接速度 [root@ubuntu ~]# vim /etc/ssh/sshd_config UseDNS no GSSAPIAuthentication no [root@ubuntu ~]# systemctl restart sshd
ssh 服务的最佳实践
1. 建议使用非默认端口 2. 禁止使用protocol version 1 3. 限制可登录用户 4. 设定空闲会话超时时长 5. 利用防火墙设置ssh访问策略 6. 仅监听特定的IP地址 7. 基于口令认证时,使用强密码策略,比如:tr -dc A-Za-z0-9_ < /dev/urandom | head -c 12| xargs 8. 使用基于密钥的认证 9. 禁止使用空密码 10. 禁止root用户直接登录 11. 限制ssh的访问频度和并发在线数 12. 经常分析日志