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 | # 注释以 # 开头,整行生效 |
- 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