侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

SSH远程登录和端口转发详解

技术  /  管理员 发布于 8年前   410

介绍

SSH 是创建在应用层和传输层基础上的安全协议,为计算机上的 Shell(壳层)提供安全的传输和使用环境。

SSH 只是协议,有多种实现方式,本文基于其开源实现 OpenSSH

远程登录

SSH主要用于远程登录:

$ ssh user@host

当本地用户名和远程用户名一致时,可省略用户名:

$ ssh host

SSH 协议默认端口是22,指定端口可使用 -p 参数

$ ssh -p 2222 user@host

MITM

SSH 采用公钥加密的方式来保证传输安全。过程如下:

  1. 客户端发起登录请求,远程主机将自己的公钥发个用户;
  2. 客户端使用该公钥将登录密码加密后发送给远程主机;
  3. 远程主机使用私钥解密登录密码,如密码正确则允许客户端登录。

However!

  1. 由于 SSH 协议的公钥是自己签发的,并不像HTTPS 的SSL证书是有CA机构颁发的。如果有人插在用户与远程主机之间,截获登录请求,然后冒充远程主机,将伪造的公钥发给客户端,那么用户则很难辨别真伪。
  2. 这样就可以获取用户登录密码,用来登录远程主机。这就是MITM,(Man-in-the-middle attack,中间人攻击)

密码登录

第一次登录远程主机,会有如下提示:

$ ssh 10.0.0.12The authenticity of host '10.0.0.12 (10.0.0.12)' can't be established.RSA key fingerprint is 3a:45:30:52:b5:ea:2a:55:e7:23:41:ef:16:76:0b:8d.Are you sure you want to continue connecting (yes/no)?

意思是:无法确认远程主机真实性,指知道它的公钥指纹,是否继续连接?

公钥指纹(fingerprint):公钥采用RSA算法,长度较长难以比对,所以对其进行MD5计算,得到128位的指纹,即上例中的3a:45:30:52:b5:ea:2a:55:e7:23:41:ef:16:76:0b:8d

其实并没有什么有效便捷的方式确认公钥指纹的真实性,确认接受远程主机公钥:

Are you sure you want to continue connecting (yes/no)? yes

系统提示远程主机已加入到受信主机列表:

Warning: Permanently added '10.0.0.12' (RSA) to the list of known hosts.

然后提示输入密码:

[email protected]'s password:

输入密码正确,就可以正常登陆了。

当远程主机的公钥被接受以后,它就会被保存在文件$HOME/.ssh/known_hosts之中。下次再连接这台主机,系统会发现它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。

公钥登陆

除了密码登录,SSH 还支持公钥登录。

“公钥登录”原理是:用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求输入密码。

公钥登录需要用户提供自己的公钥,一般保存在 $HOME/.ssh/ 目录下,id_rsa是私钥,id_rsa.pub是公钥。如果没有可以通过ssh-keygen生成。

$ ls -1 ~/.sshid_rsaid_rsa.pubknown_hosts

需要把公钥发送到远程主机:

# ssh-copy-id [-i [identity_file]] [user@]machine$ ssh-copy-id [email protected]

此后再登录就不需要输入密码了。

如果还是无法使用公钥登录,可以检查一下远程主机SSH配置/etc/ssh/sshd_config,打开如下注释并重启SSH服务[我发现CentOS release 6.8 (Final)默认SSH配置中注释掉以下内容也是可以使用公钥登录的]:

> #RSAAuthentication yes> #PubkeyAuthentication yes> #AuthorizedKeysFile  .ssh/authorized_keys>

authorized_keys文件

远程主机将用户的公钥,保存在 $HOME/.ssh/authorized_keys 中。公钥是一段字符串,也可以手动追加到远程主机authorized_keys文件中,每行一个。

也可以通过如下命令代替ssh-copy-id,解释公钥的保存过程:

$ ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub

远程操作

SSH可以用于直接在远程主机上操作

# 查看远程主机Nginx进程ssh 10.0.0.12 'ps -ef | grep nginx'

端口转发

本地转发

本地转发是指:把本地主机端口通过待登录主机端口转发到远程主机端口上去。

本地转发通过参数 -L 指定,格式: -L [本地主机:]本地主机端口:远程主机:远程主机端口

ssh -L 5000:www.google.com:80 user@host

通过上面的命令,访问本地5000端口,相当于访问远程主机www.google.com的80端口,并且这是通过通过登录主机来安全地转发数据的。当不能直接访问远程主机某端口,而登录主机可以访问时,可以使用这种方式将远程主机端口绑定到本地。

远程转发

远程转发是指:把登录主机端口通过本地主机端口转发到远程主机.

远程转发通过参数 -R 指定,格式: -R 登录主机端口:远程主机:远程主机端口。

ssh -R 8080:localhost:80 user@host

通过上面的命令,访问登录主机的 8080 端口就相当于访问 localhost:80!

例如下面这种场景:我在本机起了一个web服务,希望别人从外网访问或测试,但是外网是不能直接访问我的内网机器。所以我可以在本机上执行上面的命令,这样就就可以通过访问登录主机的80端口,来访问本机的80端口了,从而实现外网访问内网的应用了。简直太方便~

动态转发

动态转发不需要指定特定的目标主机和端口号,可以实现不加密的网络连接,全部走SSH连接,从而提高安全性。

例如把本地5000端口的数据,都通过SSH传向登录主机:

ssh -D 5000 user@host

例如可以用于科学上网的场景,在浏览器中设置代理类型为 SOCKS(5),主机及端口为127.0.0.1:5000 就可以通过登录主机科学上网了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。


  • 上一条:
    简单谈谈OpenStack中的网络隔离
    下一条:
    shell脚本报错:"[: =: unary operator expected"解决办法
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期文章
    • 在go语言中实现字符串可逆性压缩及解压缩功能(0个评论)
    • 使用go + gin + jwt + qrcode实现网站生成登录二维码在app中扫码登录功能(0个评论)
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-07
    • 2017-08
    • 2017-09
    • 2018-01
    • 2018-07
    • 2018-08
    • 2018-09
    • 2018-12
    • 2019-01
    • 2019-02
    • 2019-03
    • 2019-04
    • 2019-05
    • 2019-06
    • 2019-07
    • 2019-08
    • 2019-09
    • 2019-10
    • 2019-11
    • 2019-12
    • 2020-01
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2020-10
    • 2020-11
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-04
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-12
    • 2024-02
    • 2024-04
    • 2024-05
    • 2024-06
    • 2025-02
    • 2025-07
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客