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

介绍

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.12
The 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.

然后提示输入密码:

root@10.0.0.11's password:

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

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

公钥登陆

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

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

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

$ ls -1 ~/.ssh
id_rsa
id_rsa.pub
known_hosts

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

# ssh-copy-id [-i [identity_file]] [user@]machine
$ ssh-copy-id root@10.0.0.12

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

如果还是无法使用公钥登录,可以检查一下远程主机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 就可以通过登录主机科学上网了。

总结

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

(0)

相关推荐

  • 菜鸟学Linux命令:ssh命令(远程登录)

    1.查看SSH客户端版本 有的时候需要确认一下SSH客户端及其相应的版本号.使用ssh -V命令可以得到版本号.需要注意的是,Linux一般自带的是OpenSSH: 下面的例子即表明该系统正在使用OpenSSH: $ ssh -V OpenSSH_3.9p1, OpenSSL 0.9.7a Feb 19 2003 下面的例子表明该系统正在使用SSH2: $ ssh -V ssh: SSH Secure Shell 3.2.9.1 (non-commercial version) on i686-

  • linux远程登录ssh免密码配置方法

    一.情景 公司刚上几台Linux,现在要把主机之间都能远程ssh免密码登陆. 二.原理 很简单,使用ssh-keygen 在主机A上生成private和public密钥,将生成的public密钥拷贝到远程机器主机B上后,就可以使用ssh命令无需密码登录到另外一台机器主机B上. 三.步骤 主机A: 1. 生成公钥和私钥文件id_rsa和id_rsa.pub (敲3下回车即可) [root@bogon ~]# ssh-keygen -t rsa Generating public/private r

  • centos 6.5下修改SSH端口及禁用root远程登录的方法

    前言 我们大家都知道 SSH 的默认端口为 22,但是基于安全的需要,我们需要修改服务器的 SSH 端口,和禁用 root 远程登录. 通过以下步骤,我们通过编辑 /etc/ssh/sshd_config ,将端口修改为 10089,并禁用 root 远程登录,同时为新端口添加防火墙规则,并删除默认端口的规则. 注意:1,使用 root 用户执行以下步骤:2,只在 CentOS 6.5 下验证. 修改端口 vi /etc/ssh/sshd_config Port 10089 #端口号 Permi

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

    介绍 SSH 是创建在应用层和传输层基础上的安全协议,为计算机上的 Shell(壳层)提供安全的传输和使用环境. SSH 只是协议,有多种实现方式,本文基于其开源实现 OpenSSH 远程登录 SSH主要用于远程登录: $ ssh user@host 当本地用户名和远程用户名一致时,可省略用户名: $ ssh host SSH 协议默认端口是22,指定端口可使用 -p 参数 $ ssh -p 2222 user@host MITM SSH 采用公钥加密的方式来保证传输安全.过程如下: 客户端发起

  • SSH端口转发,本地端口转发,远程端口转发,动态端口转发详解

    第一部分 SSH端口转发概述 当你在咖啡馆享受免费 WiFi 的时候,有没有想到可能有人正在窃取你的密码及隐私信息?当你发现实验室的防火墙阻止了你的网络应用端口,是不是有苦难言?来看看 SSH 的端口转发功能能给我们带来什么好处吧! SSH端口转发概述 让我们先来了解一下端口转发的概念吧.我们知道,SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据.但是,SSH 还同时提供了一个非常有用的功能,这就是端口转发. 它能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自

  • CentOS 7下用firewall-cmd控制端口与端口转发详解

    一.firewalld 守护进程 firewall-cmd命令需要firewalld进程处于运行状态.我们可以使用systemctl status/start/stop/restart firewalld来控制这个守护进程.firewalld进程为防火墙提供服务. 当我们修改了某些配置之后(尤其是配置文件的修改),firewall并不会立即生效.可以通过两种方式来激活最新配置systemctl restart firewalld和firewall-cmd --reload两种方式,前一种是重启f

  • Pycharm内置终端及远程SSH工具的使用教程图文详解

    1.主题 如何使用Pycahrm内置终端以及远程SSH工具. 2.准备工作 Pycharm版本为3.0或更高 连接SSH服务器 3.使用SSH客户端 4.开启连接 选择Tools | Start SSH Session...的主菜单命令,单击Edit credentials: 5.提供连接信息 在Session对话框中输入建立连接所需相关信息: 6.建立连接 单击OK,连接开始: 7.SSH会话功能 运行命令.粘贴复制.浏览历史命令-- 8.远程SSH外部工具的作用 定义一个外部工具用来脱机运行

  • java通过ssh连接服务器执行shell命令详解及实例

    java通过ssh连接服务器执行shell命令详解 java通过ssh连接服务器执行shell命令:JSch 是SSH2的一个纯Java实现.它允许你连接到一个sshd 服务器,使用端口转发,X11转发,文件传输等等.你可以将它的功能集成到你自己的 程序中.同时该项目也提供一个J2ME版本用来在手机上直连SSHD服务器. SSH是Secure Shell的缩写,一种建立在应用层和传输层基础上的安全协议.SSH在连接和传送过程中会加密所有数据,可以用来在不同系统或者服务器之间进行安全连接.SSH提

  • VSCode 搭建 Arm 远程调试环境的步骤详解

    简介 前提条件: 确保本机已经安装 VS Code. 确保本机已安装 SSH client, 并且确保远程主机已安装 SSH server. VSCode 已经安装了插件 C/C++. 本次搭建的环境: 主机:windows 10 服务器:ubuntu 16.04 VSCode 版本:February 2020 (version 1.43) Arm:海思 3559A (已配置好编译工具链和 gdb server) 连接远程主机 Remote Development 首先安装 Remote Dev

  • 公网使用SSH远程登录macOS服务器的过程(内网穿透)

    目录 前言 1. macOS打开远程登录 2. 局域网内测试ssh远程 3. 公网ssh远程连接macOS 3.1 macOS安装配置cpolar 3.2 获取ssh隧道公网地址 3.3 测试公网ssh远程连接macOS 4. 配置公网固定TCP地址 4.1 保留一个固定TCP端口地址 4.2 配置固定TCP端口地址 5. 使用固定TCP端口地址ssh远程 前言 macOS系统自带有Secure Shell 客户端,它可让您登录到侦听传入SSH连接的远程服务器和台式机.我们可以用ssh user

  • Vue微信项目按需授权登录策略实践思路详解

    项目采用Vue作为开发框架,用户浏览页面时有两种情况: 一种是需要用户先登录之后才能继续浏览: 另一种是用户无需登录即可随意浏览. 在无需用户登录的页面中,可能包含需要用户信息的操作,此时就需要用户登录之后方能进行后续操作.因此,需要对授权登录策略进行区分. 思路 1.一般而言,我们为微信开发的H5页面,进入页面的时候就进行鉴权,要求用户登录之后才能继续浏览.但由于产品需求,这个项目我们需要对不同页面的鉴权策略进行划分,按照一般与特殊进行设计: 2.一般情况,用户进入页面第一时间要求用户授权登录

  • Linux服务器配置ip白名单防止远程登录以及端口暴露的问题

    前言 博主用的服务器是阿里云购买的,其实阿里云已经提供安全策略共给我们使用了,但是如果是公司自己的服务器,或者是我们自己的虚拟机等.还是需要自己看看配置好防火墙和如何配置白名单的. 1.阿里云的服务器,本身并没有防火墙,但是我们可以安装一个IPtable防火墙(这里阿里云的服务器系统为Centos),这样的话,就需要防火墙和阿里云网址配置的白名单同时生效才可以喽. 1.服务器防火墙 1.1.下面这个是初始化的防火墙配置 vim /etc/sysconfig/iptables # sample c

  • python pexpect ssh 远程登录服务器的方法

    使用了python中的pexpect模块,在测试代码之前,可输入python进入交互界面,输入help('pexpect'),查询是否本地含有pexpect模块. 如果没有,linux系统输入 easy_install pexpect便可自动安装. 测试代码,连接127.0.0.1 下面是我手动连接127.0.0.1, 发现只有在首次使用ssh连接127.0.0.1时,需要输入yes or no ,而后再次使用ssh ,则不需要再次输入yes 直接输入密码即可. 后续测试代码是二次链接,无需查询

随机推荐