CentOS之OpenSSH

OpenSSH

OpenSSH 是 SSH (Secure SHell) 协议的免费开源实现。SSH协议族可以用来进行远程控制, 或在计算机之间传送文件。而实现此功能的传统方式,如telnet(终端仿真协议)、 rcp ftp、 rlogin、rsh都是极为不安全的,并且会使用明文传送密码。OpenSSH提供了服务端后台程序和客户端工具,用来加密远程控件和文件传输过程中的数据,并由此来代替原来的类似服务。

服务端配置文件:/etc/ssh/sshd_config,客户端配置文件/etc/ssh/sshd_config

Centos下的openssh软件包

openssh
openssh-clients
openssh-server

一些命令

ssh 连接远程服务器,选项在下面介绍
ssh-keygen 用于为ssh生成、管理和转换认证密钥,它支持RSA和DSA两种认证密钥
-b:指定密钥长度; 
-B:先生密钥文件的信息
-e:读取openssh的私钥或者公钥文件,将OpenSSH转换为RFC 4716密钥文件 
-C:添加注释; 
-c:更改注释
-f:指定用来保存密钥的文件名; 
-i:读取未加密的ssh-v2兼容的私钥/公钥文件,然后在标准输出设备上显示openssh兼容的私钥/公钥
-l:显示公钥文件的指纹数据; 
-N:提供一个新密语; 
-P:提供旧密码,来重新设置密码
-p:重新设置私钥文件的密码 
-q:静默模式; 
-t:指定要创建的密钥类型。
ssh-copy-id 命令可以把本地主机的公钥复制到远程主机的authorized_keys文件上
-i 指定公钥文件
ssh-agent 私钥代理程序运行ssh-agent以后,使用ssh-add将私钥交给ssh-agent保管
-a:将代理绑定到UNIX域的套接字绑定地址
-c:生成C-shell风格的命令输出。 
-d:调试模式。 
-k:把ssh-agent进程杀掉。 
-s:生成Bourne shell 风格的命令输出。 
-t life:设置默认值添加到代理人的身份最大寿命
ssh-add 把私钥的密码添加给agent
-D:删除ssh-agent中的所有密钥
-d:从ssh-agent中的删除密钥 
-e pkcs11:删除PKCS#11共享库pkcs1提供的钥匙 
-s pkcs11:添加PKCS#11共享库pkcs1提供的钥匙 
-L:显示ssh-agent中的公钥 
-l:显示ssh-agent中的密钥 
-t life:对加载的密钥设置超时时间,超时ssh-agent将自动卸载密钥 
-X:对ssh-agent进行解锁 
-x:对ssh-agent进行加锁
ssh-keyscan 是一个收集大量主机公钥的使用工具
-f:从指定文件中读取“地址列表/名字列表”
-p:指定连接远程主机的端口
-T:指定连接尝试的超时时间 
-t:指定要创建的密钥类型
-v:信息模式,打印调试信息

服务器守护进程sshd

sshd
-4:强制使用IPv4地址; 
-6:强制使用IPv6地址; 
-D:以后台守护进程方式运行服务器; 
-d:调试模式; 
-e:将错误发送到标准错误设备,而不是将其发送到系统日志; 
-f:指定服务器的配置文件; 
-g:指定客户端登录时的过期时间,如果在此期限内,用户没有正确认证,则服务器断开次客户端的连接; 
-h:指定读取主机key文件; 
-i:ssh以inetd方式运行; 
-o:指定ssh的配置选项; 
-p:静默模式,没有任何信息写入日志; 
-t:测试模式。

选项ssh,

-p port     远程服务器监听的端口
-b          指定连接的源IP
-v          调试模式
-C          压缩方式
-X          支持x11转发
-Y          支持信任x11转发,但是要在配置文件中设置ForwardX11Trusted yes
-t          强制伪tty分配,ssh - t remoteserver1 ssh remoteserver21作为2的跳板主机
-1          强制使用ssh协议版本1 
-2          强制使用ssh协议版本2
-4          强制使用IPv4地址 
-6          强制使用IPv6地址 
-A          开启认证代理连接转发功能 
-a          关闭认证代理连接转发功能   
-F          指定ssh指令的配置文件
-f          后台执行ssh指令
-g          允许远程主机连接主机的转发端口 
-i          指定身份文件 
-l          指定连接远程服务器登录用户名 
-N          不执行远程指令
-o          指定配置选项
-x          关闭X11转发功能

基于口令的连接方式

ssh -l root 192.168.1.1

当用户第一次连接远程主机是会提示远程主机不安全要不要连接,在配置文件中设置StrictHostKeyChecking no第一次连接服务器是不提示 。第一次连接时客户端会复制ssh服务器/etc/ssh/ssh_host*key.pub( CentOS7默认是ssh_host_ecdsa_key.pub)文件中的公钥到客户机的~./ssh/know_hosts中。下一次时连接远程主机会使用自己的私钥加密连接信息,客户机使用远程主机的公钥解密,以此来验证远程主机的身份。

使用-X 选型可以通过X11协议转发,来连接到远程主机的图形界面,但是需要远程主机安装图形软件,客户机也在图形界面下。在Windows下使用Xmanager软件也可以给连接Linux桌面,就像Windows的远程桌面一样。这里就不演示了。

当你的主机地址无法通过防火墙,而不能访问远程主机,可以使用跳板机,通过你和远程主机都可以连接的主机

[root@CentOS6.9 ~]#ssh  192.168.166.130 ssh 192.168.166.131  #先连接到跳板机,再从跳板机连接到远程主机,但是直接连接远程主机会报错误提示不是通过终端连接的
[root@CentOS6.9 ~]#ssh  -t 192.168.166.130 ssh 192.168.166.131    #我们可以通过-t 选项强制跳板机分配终端

基于密钥

  1. 生成公钥和私钥文件
[root@CentOS6.9 ~]#ssh-keygen                   #生成密钥文件
Generating public/private rsa key pair.                    
Enter file in which to save the key (/root/.ssh/id_rsa):    #设置密钥文件的名字,默认为/root/.ssh/id_rsa
Enter passphrase (empty for no passphrase):                 #设置私钥文件的密码
Enter same passphrase again:                                #确认密码
Your identification has been saved in /root/.ssh/id_rsa.    #私钥文件的路径
Your public key has been saved in /root/.ssh/id_rsa.pub.    #公钥文件的路径
[root@CentOS6.9 ~]#ls .ssh/                                  #查看公钥和私钥文件,known_hosts文件中保存的是远程主机的公钥                                
id_rsa       id_rsa.pub   known_hosts                       
  1. 把公钥上传到远程主机用户的家目录下的authorized_keys文件中
[root@CentOS6.9 ~]#ssh-copy-id  root@192.168.1.1            #指定远程主机的用户和IP地址,root是客户机连接远程主机的用户
root@192.168.166.130's password:      #远程主机用户的密码                      
  1. 测试
[root@CentOS6.9 ~]#ssh -l root 192.168.166.130           #连接远程主机
Enter passphrase for key '/root/.ssh/id_rsa':            #输入私钥文件的密码
  1. 其实不光客户机连接远程主机时可以使用密钥连接,Windows中的软件如“xshell”、“SRT”也可以使用密钥方式来连接。我这里就使用xshell来演示一下。


    image.png

    新建一个主机密钥

image.png

image.png

把密钥保存到文件,然后把密钥文件上传到远程主机,再把里面的内容写入authorized_keys文件中

配置文件

#Port 22                    #SSH端口,可以修改
#AddressFamily any          #指定sshd应当使用暗中地址族{any(默认)、inet(仅ipv4)、inet6(仅ipv6)}  
#ListenAddress 0.0.0.0      #指定监听的IP网络地址,默认监听所有地址
#ListenAddress ::  
···省略
# HostKey for protocol version 1  #设定包含主机私人密钥的文件  
#HostKey /etc/ssh/ssh_host_key  
# HostKeys for protocol version 2  
#HostKey /etc/ssh/ssh_host_rsa_key  
#HostKey /etc/ssh/ssh_host_dsa_key  
······ 
# Lifetime and size of ephemeral version 1 server key  
#KeyRegenerationInterval 1h     #设置服务器密钥的自动更新时间,  
#ServerKeyBits 1024             #定义服务器密钥的位数  
······
# Logging  
# obsoletes QuietMode and FascistLogging  
#SyslogFacility AUTH  
SyslogFacility AUTHPRIV         #指定日志消息通过那个日志子系统发送 
#LogLevel INFO                  #设定sshd的日志等级 
······
# Authentication:  
#LoginGraceTime 2m              #限定用户必须在指定的时间内认证登陆,0表示无限制,默认是120秒
#PermitRootLogin yes            #是否允许管理员直接登陆 
#StrictModes yes                #指定是否要求在接受连接请求前对用户主目录和相关的配置文件进行宿主和权限检查 #MaxAuthTries 6                 #指定每个连接最大允许的认证次数。默认值是6  
#MaxSessions 10                 #指定最多的会话连接,默认值是10
······
#RSAAuthentication yes          #设置是否允许只有RSA安全验证  
#PubkeyAuthentication yes       #是否允许公钥认证。默认值为”yes” 
#AuthorizedKeysFile .ssh/authorized_keys  #存放用户连接该主机的公钥存储文件
······

#PasswordAuthentication yes     #基于口令的认证  
#PermitEmptyPasswords no        #是否允许空密码  
PasswordAuthentication yes      
······
#Kerberos认证相关  
# Kerberos options  
#KerberosAuthentication no  
#KerberosOrLocalPasswd yes  
#KerberosTicketCleanup yes  
#KerberosGetAFSToken no  
······
#GSSAPIAuthentication no           #是否允许使用基于 GSSAPI 的用户认证。默认值为no
GSSAPIAuthentication yes  
#GSSAPICleanupCredentials yes      #是否在用户退出登录后自动销毁用户凭证缓存。默认值是yes
GSSAPICleanupCredentials yes  
·······
#PAM认证模块  
# Set this to 'yes' to enable PAM authentication, account processing, 
# and session processing. If this is enabled, PAM authentication will 
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication.  Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
#UsePAM no
UsePAM yes
UsePAM yes  
······

#AllowTcpForwarding yes         #是否允许TCP转发,默认值为”yes”  
#GatewayPorts no  
·······

#X11Forwarding no               #设置是否允许X11转发  
X11Forwarding yes  
#X11DisplayOffset 10            #指定X11 转发的第一个可用的显示区(display)数字。默认值是 10 
#X11UseLocalhost yes            #sshd是否应当将X11转发服务器绑定到本地loopback地址。默认值是”yes” 
#PrintMotd yes                  #设置sshd是否在用户登录的时候显示“/etc/motd”中的信息 
#PrintLastLog yes               #指定sshd是否在每一次交互式登录时打印最后一位用户的登录时间 默认值是”yes”
#TCPKeepAlive yes               #指定系统是否向客户端发送 TCP keepalive 消息。默认值是”yes”  
#UseLogin no                    #是否在交互式会话的登录过程中使用 login默认值是”no” 
#UsePrivilegeSeparation yes     #是否让sshd通过创建非特权子进程处理接入请求的方法来进行权限分离 默认值是”yes  
#PermitUserEnvironment no  
#Compression delayed             #是否对通信数据进行加密,还是延迟到认证成功之后再对通信数据加密 可用值:yes、no、delayed  
#ClientAliveInterval 0           #设置一个以秒记的时长,如果超过这么长时间没有收到客户端的任何数据,sshd 将通过安全通道向客户端发送一个”alive”消息,并等候应答。默认值 0 表示不发送”alive”消息 
#ClientAliveCountMax 3          #Sshd在未收到任何客户端回应前最多允许发送多少个”alive”消息 默认值是 3  
#ShowPatchLevel no  
#UseDNS yes                     #指定在登陆是要不要将IP地址解析,建议设置未no,可以提高连接速度
#PidFile /var/run/sshd.pid      #指定在哪个文件中存放SSH守护进程的进程号,默认为 /var/run/sshd.pid文件
#MaxStartups 10                 #最大允许保持多少个未认证的连接 默认值是 10 
#PermitTunnel no  #是否允许 tun 设备转发
·······
# override default of no subsystems  #是否允许启动sftp-server  
Subsystem   sftp    /usr/libexec/openssh/sftp-server  

sshd限制主机登陆

ALLOWUSERS    root@192.168.166.1      #只允许192.168.1.1这一台主机以root设置登陆

SSH端口转发

SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据。但是, SSH 还能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的加密及解密服务。这一过程也被叫做“隧道”( tunneling),这是因为 SSH 为其他 TCP 链接提供了一个安全的通道来进行传输而得名。例如, Telnet, SMTP, LDAP 这些 TCP应用均能够从中得益,避免了用户名,密码以及隐私信息的明文传输。而与此同时,如果工作环境中的防火墙限制了一些网络端口的使用,但是允许SSH 的连接,也能够通过将 TCP 端口转发来使用 SSH 进行通讯

SSH 端口转发能够提供两大功能:

  1. 加密 SSH Client 端至 SSH Server 端之间的通讯数据
  2. 突破防火墙的限制完成一些之前无法建立的TCP连接

SSH端口转有三种

  1. 本地端口转发
  2. 远程转发
  3. 动态转发

注:如果不是以root身份设置端口转发的话,转发端口只能使用大于1024的端口号

本地转发,在访问本地设置好的监听端口时,主机会自动和跳转机建立ssh连接,然后把数据封装在ssh协议建立的隧道中,传输给跳转的主机,在跳转主机哪里把数据解封,再由跳转机和目标主机建立服务连接,把主机的数据转发给远程主机。

选项

-N:不执行命令
-f:后台执行
-L:local本地端口转发
-g:启用网关功能,允许网络上其他机器连接监听端口,否则只有本机可用。

示例

环境

  1. 主机A IP地址192.168.166.129 主机名CentOS 6.9
  2. 主机B IP地址192.168.166.130 主机名CentOS 7.3
  3. 主机C IP地址192.168.166.131 主机名CentOS 6.9-1
  4. 服务telnet
[root@CentOS6.9 ~]#ssh -NF -L 9527:192.168.166.131:23  root@192.168.166.130     
  1. -Nf指定不执行命令,后台执行,
  2. 9527指定本地的转发端口,
  3. 192.168.166.131:23 最终访问的远程主机的IP的和端口
  4. root@192.168.166.130 跳转机的ip地址和用户名
[root@CentOS6.9 ~]#telnet 127.0.0.1 9527     #设置好后,使用telnet访问本机127.0.0.1  9725端口 
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
CentOS release 6.9 (Final)
Kernel 2.6.32-696.el6.x86_64 on an x86_64
CentOS6.9-1 login:                           #跳转到了目标主机                      

注:可以一次设置多个转发:ssh -L 8888:目标主机地址:80 -L 110:目标主机地址:110 -L 跳转机地址

远程转发,一般的公司里的主机是不直接连接网络的,那本地转发就无法实现,这里就可以使用远程转发用,用公司内部建立SSH连接。

在内网的跳转机设置,内网的主机作为客户端,外网的主机作为服务端,跳转机通过ssh协议连接到外网的主机,然后监听设置好外网主机端口,发现监听端口有人访问,就在和外网的主机建立一个ssh连接,把数据通过这个ssh连接隧道封装,传输到内网的跳转机解封,然后在转发给目标主机。

[root@CentOS7.3 ~]#ssh -Nf -R 9528:192.168.166.131:23  192.168.166.129
# 这次在CentOS 7 设置远程转发,监听外网主机centos 6.9的9528端口

  1. -R 远程转发
  2. 9528 要监听的端口号
  3. 192.168.166.131:23 转发目标主机的IP地址和服务端口
  4. 192.168.166.129 要监听的端口
[root@CentOS6.9 ~]#telnet 127.0.0.1 9528                 #访问本机的9528端口
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
CentOS release 6.9 (Final)
Kernel 2.6.32-696.el6.x86_64 on an x86_64
CentOS6.9-1 login:                                       #连接到了目标主机

动态转发

工作原理是这样的, 本地机器上分配了一个socket侦听端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 根据应用程序的协议可以判断出远程主机将和哪里连接。

选项

-D port 指定一个本地 “动态的’’ 应用程序端口转发

[root@CentOS7.3 ~]#ssh -Nfg -D 1080 192.168.166.129    #所用到1080端口的数据都转发到192.168.166.129

注:有些路由器会把长时间没有通信的连接断开。SSH客户端的TCPKeepAlive选项可以避免这个问题的发生,默认情况下它是被开启的。如果它被关闭了,可以在ssh的命令上加上-o TCPKeepAlive=yes来开启。

检查隧道状态

有些时候隧道会因为一些原因通信不畅而卡死,这种时候,往往SSH客户端并不退出,而是卡死在那里。一种应对方法是,使用SSH客户端的ServerAliveInterval和ServerAliveCountMax选项。S
erverAliveInterval会在隧道无通信后的一段设置好的时间后发送一个请求给服务器要求服务器响应。如果服务器在 ServerAliveCountMax次请求后都没能响应,那么SSH客户端就自动断开连接并退出,将控制权交给你的监控程序。这两个选项的设置方法分别是在ssh时加入-o ServerAliveInterval=n和-o ServerAliveCountMax=m。其中n, m可以自行定义

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,907评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,546评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,705评论 0 238
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,624评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,940评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,371评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,672评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,396评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,069评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,350评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,876评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,243评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,847评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,004评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,755评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,378评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,266评论 2 259

推荐阅读更多精彩内容