【杂项】SSH

  • ~2.86K 字
  1. 1. SSH
    1. 1.1. 基础指令
    2. 1.2. 非对称加密
    3. 1.3. config
  2. 2. 端口转发
    1. 2.1. 本地转发
    2. 2.2. 远程转发

SSH

SSH全程Secure Shell,是一种用于安全的访问远程服务器的协议,通常用于传输字符等,和其他远程桌面比起来,它不需要压缩画面为视频一整个传输,所以会比较快速

基础指令

  • 连接:ssh 用户名@IP地址,IP地址可以被DNS解析

若是第一次连接到其他主机,会提示暂时不能连接,并会提供主机的指纹,是一个SHA256的字符串,可以防止主机篡改

如果想继续连接,敲击yes后该IP会被加入已知的hosts列表

  • 发送一条指令:ssh 用户名@IP地址 指令,加的指令会直接在远程主机执行,并把结果以stdout输出到本机

非对称加密

为避免每次登录都需要输入密码,可以使用SSH的公私钥非对称加密,具体来说,可以在本机生成一份公钥一份私钥,只要将公钥传到远程主机,私钥留在本地,就可以免于输入密码

  • ssh-keygen用于生成一对公私钥

    若将本机公钥传给远程,就可以实现免密登录:

    • cat ./ssh/id_rsa.pub | ssh 远程IP保存位置 tee 本地公钥位置
    • ssh-copy-id 用户名@IP,将当前机器的对应私钥的公钥拷贝到对方机器中,免密登录,要求事先通过密码登录
    • scp 本地文件 用户名@IP:远程路径,安全将文件复制到远程路径
    • rsync -avP 文件路径 用户名@IP:远程路径,可以快速将大文件同步到远程主机
  • 使用ssh -v 地址来获取更详细的数据

  • 若公钥权限太高,远程主机会拒绝访问该文件

config

在.ssh/config下有客户端的ssh的配置文件,默认为空,配置文件用Host块和配置项组成:

1
2
3
4
5
6
7
8
9
10
# 注释以 # 开头,整行生效

# Host 块:定义一组主机的配置(支持通配符)
Host <主机别名/匹配模式>
<配置项1> <值1> # 配置项与值之间用空格分隔,缩进可选(建议缩进2-4空格增强可读性)
<配置项2> <值2>

# 全局配置(对所有主机生效,需放在所有 Host 块之前)
Host *
<全局配置项>
  • Host :主机别名
  • Hostname:主机地址
  • User:用户名
  • Port:端口号
  • Proxycommand:

这样可以直接用主机别名登录远程主机

在/etc/ssh/sshd_config中有服务端的ssh配置文件,需要以管理员修改

常用字段:

  • Port:远程端口
  • PermitRootLogin:是否允许root登录,默认设置为prohibit-password,即仅限于非对称加密登录,还有yes和no

改完文件后生效service sshd reload或重启

端口转发

假设我们的服务器只开放了22一个端口,而其他应用程序如jupyter会监听在8080端口监听一个HTTP协议,这时就需要端口转发

本地转发

本地转发是将应用对本地主机A指定端口X的访问请求转发给主机B,交给主机B对另一指定主机C的指定端口Z发起访问

指令:ssh -L [收听接口:]端口X:主机C:端口Z 主机B

  • A = 本地主机(即你运行 ssh 命令的这台机器,也叫 SSH 客户端)
  • B = SSH 服务器(跳板机),即命令中 username@hostname 对应的主机。它负责接收从 A 转发来的加密流量,并代替 A 去连接最终目标
  • C = 最终目标主机(实际提供服务的服务器),即命令中 主机C:主机C端口Z 里的“主机C”,也可以是B自身
  • 收听端口默认值为0.0.0.0,一般不写,意味着ssh隧道会收听所有端口,接收来自任何地址的应用访问请求并进行转发,若填写了绑定地址,ssh连接就只会处理来自绑定地址的应用请求

当主机C在某端口提供服务时,主机A需要使用却无法是访问主机C或该端口时,如果发现有A→B的ssh连接,且主机B能够直接访问主机C的该端口,本地端口转发就可以派上用场

举个例子,台式机B上运行着虚拟机C,虚拟机使用虚拟机软件搭建的虚拟网络与其宿主——主机B相连接,但在主机B以外无法直接访问该虚拟网络。想要通过SSH,用与台式机B处于同一WiFi下的笔记本A来远程控制虚拟机C,(在A上)执行端口转发命令:ssh -L 22022:10.0.2.15:22 desktop_user@192.168.1.11

其中,22022号端口是随便选的一个没被占用的端口;192.168.1.11是台式机B在WiFi中的IP;desktop_user是主机B上的用户名;10.0.2.15是虚拟机C在主机B为其搭建的虚拟网络中的IP;22号端口是默认的SSH端口。已知virtual_user是虚拟机C上的用户名,这时在笔记本A上执行应用的访问请求命令:ssh -p 22022 virtual_user@localhost

远程转发

当主机C在某端口提供某服务,主机B需要使用该服务但无法直接访问主机C或该端口时,如果有A→B的ssh连接,且A可以访问主机C的该端口,远程端口转发就可以派上用场

即:你(A)希望让 B 能访问到某个只有 A 才能访问的内部服务

与本地转发的区别是,访问请求在主机B一侧发生,而ssh连接仍为A→B

远程端口转发是对于远程主机B的指定端口Y的访问请求转发给主机A,交由主机A对另一指定主机C的指定端口Z发起访问

指令:ssh -R 端口Y:主机C:端口Z 主机A

  • A = SSH 客户端(你运行命令的机器),也是实际访问最终目标 C 的机器
  • B = SSH 服务器(命令中的 username@hostname),作为中转站,对外暴露端口 Y
  • C = 最终目标服务,必须能被 A 直接访问,甚至可以是 A 自身(localhost)

举个例子:

台式机A上运行着虚拟机C,虚拟机使用虚拟机软件搭建的虚拟网络与宿主主机A相连接,但在主机A以外无法直接访问该虚拟网络。想要通过SFTP,用与台式机A处于同一WiFi下的笔记本B来向虚拟机C传输文件,(在A上)执行端口转发命令:

ssh -R 22122:10.0.2.16:22 laptop_user@192.168.1.233

其中,22122号端口是随便选的一个没被占用的端口;192.168.1.233是笔记本B在WiFi中的IP;laptop_user是主机B上的用户名;10.0.2.16是虚拟机C在主机A为其搭建的虚拟网络中的IP;22号端口是默认的SFTP端口。已知virtual_user是虚拟机C上的用户名,这时在笔记本B上执行应用的访问请求命令:

sftp -P 22122 virtual_user@localhost

赞助喵
非常感谢您的喜欢!
赞助喵