概述

SSH(远程连接工具)连接原理:ssh服务是一个守护进程(demon),系统后台监听客户端的连接,ssh服务端的进程名为sshd,负责实时监听客户端的请求(IP 22端口),包括公共秘钥等交换等信息。

ssh服务端由2部分组成: openssh(提供ssh服务) openssl(提供加密的程序)
ssh的客户端可以用 XSHELL,Securecrt, Mobaxterm等工具进行连接

SSH的工作机制

  1. 服务器启动的时候自己产生一个密钥(768bit公钥),本地的ssh客户端发送连接请求到ssh服务器,服务器检查连接点客户端发送的数据和IP地址,确认合法后发送密钥(768bits)给客户端,此时客户端将本地私钥(256bit)和服务器的公钥(768bit)结合成密钥对key(1024bit),发回给服务器端,建立连接通过key-pair数据传输。

SSH的加密技术

加密技术:传输过程,数据加密。
1.SSH1没有对客户端的秘钥进行校验,很容易被植入恶意代码
2.SSH2增加了一个确认联机正确性的Diffe_Hellman机制,每次数据的传输,Server都会检查数据来源的正确性,避免黑客入侵。
SSH2支持RSA和DSA密钥
DSA:digital signature Algorithm 数字签名
RSA:既可以数字签名又可以加密

SSH知识小结

  1. SSH是安全的加密协议,用于远程连接Linux服务器
  2. SSH的默认端口是22,安全协议版本是SSH2
  3. SSH服务器端主要包含2个服务功能SSH连接和SFTP服务器
  4. SSH客户端包含ssh连接命令和远程拷贝scp命令等

    如何防止SSH登录入侵

  5. 密钥登录,更改端口

  6. 牤牛阵法
  7. 监听本地内网IP(ListenAddress 192.168.25.*)

SSH功能

登陆

登陆主机

  1. ssh -p 22 root@gaox.net

查看已知主机

  1. ssh-keygen -l -f ~/.ssh/known_hosts
  2. cat /root/.ssh/known_hosts

ssh远程执行sudo命令

  1. ssh -p 22 -t root@gaox.net sudo vim /etc/hosts

scp是加密远程拷贝,cp为本地拷贝。可以推送过去,也可以拉过来。每次都是全量拷贝(效率不高,适合第一次),增量拷贝用rsync。

  1. scp -p 22 -r -p ./h.txt root@gaox.net:/home/admin/help.txt

SSH隧道端口端口转发

假设我们内部主机需要远程管理,如果主机没有公网ip我们在出差或者不在所在网络环境时,也可以通过ssh做些手脚。

有一台ECS主机具备以下条件:
有公网ip:11.10.10.10,开放了22、10022、10023端口,用户名/密码:root@gaox1024
有一台内部主机具备以下条件:
可以访问互联网,能够使用ssh协议,用户名/密码:gaox@huahua21

以下:local.gaox.site其实时我定义的二级域名,指向为:127.0.0.1;gaox.net是指向到我的ECS主机。

1、内部主机连接

内部主机上执行以下命令,用于和ECS主机接通并监听对方10022端口

  1. ssh -NfR 10022:local.gaox.site:22 root@gaox.net -p22

并输入ECS主机密码

2、测试ECS主机登陆内部主机

  1. ssh -p 10022 gaox@local.gaox.site

此时输入内部主机的密码,即可从ECS上访问我们的内部主机了。

小问题

提示:Warning: remote port forwarding failed for listen port 10022
解决办法,由于我们第一次可能配置得有些问题,登陆到ECS上杀掉监听10022端口的进程,重新执行步骤一即可。
到这里基本都可以满足大部分人的需求了。

3. 让外部通过ECS做跳板访问内部

问题

服务器重装,密钥不能用

提示信息:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

  1. ssh-keygen -R gaox.net

ssh 多账户登录工具

文件:~/login.sh

  1. #!/usr/bin/expect
  2. # Specify which script to execute, have to be in the first row
  3. # Reads a variable from a command
  4. set name [lindex $argv 0]
  5. switch $name {
  6. gaox {
  7. set user root
  8. set ip gaox.net
  9. set port 22
  10. set pass "gaoxAdminPassWord"
  11. }
  12. ning {
  13. set user root
  14. set ip gao.site
  15. set port 22
  16. set pass "ningAdminPassWord"
  17. }
  18. liu {
  19. set user root
  20. set ip gao.cn
  21. set port 22
  22. set pass "liuAdminPassWord"
  23. }
  24. default {
  25. puts "无此服务器: $name"
  26. exit
  27. }
  28. }
  29. set timeout 30
  30. # Spawn and expect are an expect internal command that can be executed after you enter the expect environment
  31. spawn ssh -p $port $user@$ip
  32. expect {
  33. # determines whether the last output contains "this" string
  34. # If so, return immediately, otherwise return after waiting for some time,
  35. # in this case the waiting time is the "timeout" previously set
  36. "(yes/no)?"
  37. # send is a perform interactive actions,
  38. {send "yes\n";exp_continue}
  39. "password:"
  40. {send "$pass\n"}
  41. }
  42. # when the execution is complete, the interaction state is maintained and control is given to the console
  43. interact
alias sshlogin='~/login.sh'

最终效果
image.png

参考

SSH命令 - 图2小a玖拾柒