文档章节

SSH端口转发及免密登录原理

damon4u
 damon4u
发布于 2016/09/21 21:37
字数 2677
阅读 127
收藏 0

1.SSH

The Secure Shell (SSH) Transport Layer Protocol

The Secure Shell (SSH) is a protocol for secure remote login and other secure network services over an insecure network. This document describes the SSH transport layer protocol, which typically runs on top of TCP/IP. The protocol can be used as a basis for a number of secure network services. It provides strong encryption, server authentication, and integrity protection. It may also provide compression.

SSH协议是建立在TCP/IP协议之上的一个远程安全登录协议。提供奖状的加密、服务器身份验证和完整性校验。

我们经常使用的一个客户端是Open SSH。

ssh (SSH client) is a program for logging into a remote machine and for executing commands on a remote machine. It is intended to replace rlogin and rsh, and provide secure encrypted communications between two untrusted hosts over an insecure network. X11 connections and arbitrary TCP ports can also be forwarded over the secure channel.

SYNOPSIS

     ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address]
         [-c cipher_spec] [-D [bind_address:]port]
         [-e escape_char] [-F configfile] [-I pkcs11]
         [-i identity_file]
         [-L [bind_address:]port:host:hostport]
         [-l login_name] [-m mac_spec] [-O ctl_cmd]
         [-o option] [-p port]
         [-R [bind_address:]port:host:hostport]
         [-S ctl_path] [-W host:port]
         [-w local_tun[:remote_tun]] [user@]hostname
         [command]

一般的远程登录命令为:

ssh [user@]hostname

2.端口转发(Port forwarding)

PortForwarding

Port forwarding via SSH (SSH tunneling) creates a secure connection between a local computer and a remote machine through which services can be relayed. Because the connection is encrypted, SSH tunneling is useful for transmitting information that uses an unencrypted protocol, such as IMAP, VNC, or IRC.

计算机有两种虚拟的网络端口(Internet port):TCP端口UDP端口。 每台计算机总共有65535个TCP端口,其中部分端口被分配给特殊的服务,例如80端口是给HTTP Web服务端口。 而网络是连接在一起的,这样就可以对将对一台机器某个端口的请求转发给另一台机器的某个端口,这就是粗浅端口转发。

SSH有三种端口转发:

  1. Local port forwarding: connections from the SSH client are forwarded via the SSH server, then to a destination server
  2. Remote port forwarding: connections from the SSH server are forwarded via the SSH client, then to a destination server
  3. Dynamic port forwarding: connections from various programs are forwarded via the SSH client, then via the SSH server, and finally to several destination servers

2.1 本地端口转发(-L)

假设现在有三台主机:

HostA 本地主机
HostB 远程主机(线上机)
HostC 其他主机(线上数据库)

HostA可能因为防火墙的关系,无法直接连接HostC,但是可以先连接到HostB,通过HostB连接HostC。 更具体的例子,假设HostC是线上数据库,监听端口3312,正常情况下,是无法直接从本地HostA连接线上数据库的,会被拒绝。通常的做法是,先登录线上机器HostB,然后才有权限连接数据库。

这时,可以使用本地端口转发:

ssh -fgNL [HostA:]3333:HostC:3312 user@HostB

建立HostA:3333经由HostB到HostC:3312的连接。 这样,在HostA连接HostA:3333就会经由HostB转发,连接到HostC:3312。 其中HostA:是可选的。 主要的参数是-L

-L [bind_address:]port:host:hostport

Specifies that the given port on the local (client) host is to be forwarded to the given host and port on the remote side.
This works by allocating a socket to listen to port on the local side, optionally bound to the specified bind_address. Whenever a connection is made to this port, the connection is forwarded over the secure channel, and a connection is made to host port hostport from the remote machine.
Port forwardings can also be specified in the configuration file. IPv6 addresses can be specified by enclosing the address in square brackets. Only the superuser can forward privileged ports(1023及一下的端口).
By default, the local port is bound in accordance with the GatewayPorts setting. However, an explicit bind_address may be used to bind the connection to a specific address. The bind_address of localhost indicates that the listening port be bound for local use only, while an empty address or '*' indicates that the port should be available from all interfaces.

2.2 远程端口转发(-R)

HostB可能因为防火墙的关系,无法直接连接到HostC,但是可以连到HostA,想通过HostA连HostC。

ssh -fNR 2222:HostC:22 user@HostB

建立HostB:2222经由HostA到HostC:22的连接。 在HostB连localhost:2222时就会通到HostC:22。 注意,在HostB连localhost:2222相当于HostB:2222。

-R [bind_address:]port:host:hostport

Specifies that the given port on the remote (server) host is to be forwarded to the given host and port on the local side.
This works by allocating a socket to listen to port on the remote side, and whenever a connection is made to this port, the connection is forwarded over the secure channel, and a connection is made to host port hostport from the local machine. Port forwardings can also be specified in the configuration file. Privileged ports can be forwarded only when logging in as root on the remote machine. IPv6 addresses can be specified by enclosing the address in square brackets. By default, the listening socket on the server will be bound to the loopback interface only. This may be overridden by specifying a bind_address. An empty bind_address, or the address '*', indicates that the remote socket should listen on all interfaces. Specifying a remote bind_address will only succeed if the server's GatewayPorts option is enabled (see sshd_config(5)). If the port argument is '0', the listen port will be dynamically allocated on the server and reported to the client at run time. When used together with -O forward the allocated port will be printed to the standard output.

2.3 动态端口转发(-D)

Dynamic port forwarding turns your SSH client into a SOCKS proxy server. SOCKS is a little-known but widely-implemented protocol for programs to request any Internet connection through a proxy server. Each program that uses the proxy server needs to be configured specifically, and reconfigured when you stop using the proxy server.

动态端口转发使得SSH客户端变成一个SOCKS代理服务器。

举个例子就好明白了。 一般我们登录线上机时,都要先登录跳板机。 为了免去每次都登录跳板机的烦恼,我们可以使用SSH添加一个代理服务器。 首先,使用动态端口转发创建代理服务器:

ssh -i ~/.ssh/xxx -p 22 -D 127.0.0.1:6666 user@JumpHost

其中-i参数指定密钥文件xxx,-D参数创建动态端口转发。 之后在登录线上机时,使用:

ssh -o ProxyCommand="/usr/bin/nc -X 5 -x 127.0.0.1:6666 %h %p" -o "StrictHostKeyChecking no" -i ~/.ssh/xxx -p 5555 user@ProductHost

其中-o参数用来指定具体参数值,可以参看文档。 第一个ProxyCommand用来指定代理服务。这里使用系统的nc代理:

/usr/bin/nc -X 5 -x 127.0.0.1:6666 %h %p

-X指定SOCKS版本,-x指定代理地址和端口号,就是我们在动态端口转发时指定的代理地址和端口号。

-D [bind_address:]port

Specifies a local "dynamic" application-level port forwarding.
This works by allocating a socket to listen to port on the local side, optionally bound to the specified bind_address. Whenever a connection is made to this port, the connection is forwarded over the secure channel, and the application protocol is then used to determine where to connect to from the remote machine. Currently the SOCKS4 and SOCKS5 protocols are supported, and ssh will act as a SOCKS server.
Only root can forward privileged ports. Dynamic port forwardings can also be specified in the configuration file. IPv6 addresses can be specified by enclosing the address in square brackets. Only the superuser can forward privileged ports.
By default, the local port is bound in accordance with the GatewayPorts setting. However, an explicit bind_address may be used to bind the connection to a specific address.The bind_address of "localhost" indicates that the listening port be bound for local use only, while an empty address or '*' indicates that the port should be available from all interfaces.

3.跳过跳板机的另一种方法

ssh如何通过跳板机直接访问到后端服务器 还没有验证。

4.SSH免密码登陆详解

参考SSH基本原理和免密码登录

从客户端来看,SSH提供两种级别的安全验证:

4.1 基于口令的安全验证

只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密, 但是不能保证你正在连接的服务器就是你想连接的服务器。这个过程如下:

(1)远程主机收到用户的登录请求,把自己的公钥发给用户。

(2)用户使用这个公钥,将登录密码加密后,发送回来。

(3)远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。这种方式可能会有别的服务器在冒充真正的服务器,将公钥发送给客户端,客户端就会将密码加密后发送给冒充的服务器,冒充的服务器就可以拿自己的私钥获取到密码,也就是受到“中间人”这种方式的攻击。

值得一说的是当第一次链接远程主机时,会提示您当前主机的”公钥指纹”,询问您是否继续,如果选择继续后就可以输入密码进行登录了,当远程的主机接受以后,该台服务器的公钥就会保存到~/.ssh/known_hosts文件中。

4.2 基于密匙的安全验证

需要依靠密匙,也就是你必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下寻找你的公用密匙,然后把它和你发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密“质询”并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私人密匙解密再把它发送给服务器。用这种方式,你必须知道自己密匙的口令。但是,与第一种级别相比,第二种级别不需要在网络上传送口令。第二种级别不仅加密所有传送的数据,而且“中间人”这种攻击方式也是不可能的(因为他没有你的私人密匙)。但是整个登录的过程可能需要10秒,但是相比输入密码的方式来说10秒也不长。

(图片引用自:基于密钥交换的ssh免密码登录原理

那么如何生成自己的一对密钥呢?打开终端执行ssh-keygen,该命令会在~/.ssh/目录下创建id_rsa、id_rsa.pub两个文件,分别为您的公钥和私钥。

将公钥拷贝到服务器的~/.ssh/authorized_keys文件中就可以了。拷贝方法有如下几种:

  • 将公钥通过scp拷贝到服务器上,然后追加到~/.ssh/authorized_keys文件中,这种方式比较麻烦。scp -P 22 ~/.ssh/id_rsa.pub user@host:~/。
  • 通过ssh-copyid程序,ssh-copyid user@host即可,但是这种方式不支持更改端口号(我没找到)。该程序ubuntu系统自带无需安装,其实该程序为一个脚本。
  • 可以通过cat ~/.ssh/id_rsa.pub | ssh -p 22 user@host ‘cat >> ~/.ssh/authorized_keys’,这个也是我比较常用的方法,因为可以更改端口号。

© 著作权归作者所有

共有 人打赏支持
上一篇: 适配器模式
damon4u
粉丝 1
博文 4
码字总数 6054
作品 0
北京
程序员
私信 提问
详述 iTerm2 配色及免密登录 SSH 的方法

博主说:iTerm2 是一个 Mac 版的类似于 Xshell 的终端工具,虽然很多同学说其功能并没有 Xshell 那么强大,但它仍然能够满足我们的大部分需求了。在此文中,我们将详细介绍 iTerm2 的配色方案...

qq_35246620
2017/11/08
0
0
SSH的介绍与应用

文章作者:Tyan 博客:noahsnail.com | CSDN | 简书 1. 什么是SSH SSH是一种网络协议,主要用于计算机之间的加密登录,默认端口为22。具体可参考Secure Shell。 2. 远程登录 是远程服务器的用...

SnailTyan
2018/01/08
0
0
SSH的介绍与应用

文章作者:Tyan 博客:noahsnail.com | CSDN | 简书 1. 什么是SSH SSH是一种网络协议,主要用于计算机之间的加密登录,默认端口为22。具体可参考Secure Shell。 2. 远程登录 是远程服务器的用...

Quincuntial
2018/01/08
0
0
大数据教程(1.8):Linux之SSH免密登录配置

在工作中,有很多时候,我们需要使用自动化脚本远程安装软件或者执行程序。此时必须要实现免密码登录才好做相应操作。 博主今天就详细的分享Linux之间的ssh免密码登录配置过程,帮助小白们理...

em_aaron
2018/07/06
0
0
SSH免密登录原理及配置

一、SSH免密登录原理 SSH免密登陆配置图示 SSH免密登录原理图示 二、具体配置操作 环境准备 操作系统:centos 6.4 serverA: 192.168.100.129 serverB: 192.168.100.130 配置 没做任何配置前...

binxin5108
2016/04/01
158
1

没有更多内容

加载失败,请刷新页面

加载更多

Confluence 6 升级中的一些常见问题

升级的时候遇到了问题了吗? 如果你想尝试重新进行升级的话,你需要首先重新恢复老的备份。不要尝试再次对 Confluence 进行升级或者在升级失败后重新启动老的 Confluence。 在升级过程中的一...

honeymoose
今天
2
0
C++随笔(四)Nuget打包

首先把自己编译好的包全部准备到一个文件夹 像这样 接下来新建一个文本文档,后缀名叫.nuspec 填写内容 <?xml version="1.0"?><package xmlns="http://schemas.microsoft.com/packaging/201......

Pulsar-V
今天
2
0
再谈使用开源软件搭建数据分析平台

三年前,我写了这篇博客使用开源软件快速搭建数据分析平台, 当时收到了许多的反馈,有50个点赞和300+的收藏。到现在我还能收到一些关于dataplay2的问题。在过去的三年,开源社区和新技术的发...

naughty
今天
3
0
Python3的日期和时间

python 中处理日期时间数据通常使用datetime和time库 因为这两个库中的一些功能有些重复,所以,首先我们来比较一下这两个库的区别,这可以帮助我们在适当的情况下时候合适的库。 在Python文...

编程老陆
今天
2
0
分布式面试整理

并发和并行 并行是两个任务同时进行,而并发呢,则是一会做一个任务一会又切换做另一个任务。 临界区 临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用,但是每一次,只能有...

群星纪元
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部