一、telnet

  telnet是一种远程连接协议,它为用户提供了在本地计算机上登录远程主机工作的能力。它采用明文传送报文,因此安全性不好,现已基本被ssh取代

  telnet工具是telnet协议的开源实现,基于C/S架构:

     server:telnet-server23/tcp,其服务进程为telnetd,为瞬时守护进程,由超级守护进程xinetd管理。

        telnet服务端默认禁止以管理员身份直接登录,但可以普通用户身份登录后再 su 到管理员

     client:telnet

        telnet客户端程序的用法为:

           telnet remote_host [port]  例如 telnet 192.168.30.20

        telnet命令除了用来登录远程主机,还可确定远程主机的某个端口是否能访问

        例 telnet 192.168.30.20 80


二、ssh

  ssh(secure shell,安全外壳协议),为建立在应用层和传输层基础上的安全协议,是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议

  ssh版本:

     sshv1:基于CRC-32做MAC,不安全

     sshv2:加密机制及MAC机制由双方协商选定;

          基于DH实现密钥交换,基于RSA或DSA实现身份认证;

          客户端通过检查服务器端的主机密钥来判断是否能够继续通信;


三、openssh

  openssh是ssh的开源实现,是一组用于安全地访问远程计算机的连接工具。 它可以作为 rlogin、 rsh rcp 以及 telnet 的直接替代品使用。更进一步,其他任何 TCP/IP 连接都可以通过 SSH 安全地进行隧道/转发。OpenSSH 对所有的传输进行加密,从而有效地阻止了窃听、连接劫持,以及其他网络级的***。OpenSSH 由 OpenBSD project 维护。


  登录过程和使用 rlogin 或 telnet 建立的会话非常类似。在连接时,SSH 会利用一个密钥指纹系统来验证服务器的真实性。只有在第一次连接时,用户会被提示输入 yes。之后的连接将会验证预先保存下来的密钥指纹。如果保存的指纹与登录时接收到的不符,则将会给出警告。指纹保存在~/.ssh/known_hosts 中,对于 SSH v2 指纹,则是 ~/.ssh/known_hosts2


  默认情况下,较新版本的 OpenSSH 只接受 SSH v2 连接。如果能用版本 2 则客户程序会自动使用, 否则它会返回使用版本 1 的模式。此外,也可以通过命令行参数 -1 或 -2 来相应地强制使用版本 1 或 2。保持客户端的版本 1 能力是为了考虑较早版本的兼容性。

[root@node1 ~]# rm -f .ssh/*
[root@node1 ~]# ssh 192.168.30.20   #第一次连接会提示是否保存ssh服务端的密钥指纹
The authenticity of host '192.168.30.20 (192.168.30.20)' can't be established.
RSA key fingerprint is a3:d3:a0:9d:f0:3b:3e:53:4e:ee:61:87:b9:3a:1c:8c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.30.20' (RSA) to the list of known hosts.
root@192.168.30.20's password: 
Last login: Tue Nov 24 17:33:25 2015 from node1
[root@node2 ~]# logout
Connection to 192.168.30.20 closed.
[root@node1 ~]# cat .ssh/known_hosts 
192.168.30.20 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAzanDCNAhPaTOyvmOF3zWM0LaxPTTZnYqNeRAdtiEj5F4SS3f0JRbCt9vDNELLOtOMpPwehqmvxDtfjQ4l/3nQkMlt7FXJuLCuLSjORTEK3T5GDLXh7S8ZoiNy8TQqg+XqfI+7GTkMpgsQ+ITbvSVXlhyOXKKCgrVQmPnIkzRSuutfJH/PdoCz/cK3txgk8uWUdE+OahoFcxpjZH7qk/ly98QfgEZz36U1adH1upvd6NQzLJtFNAJapBgUmnCWriOytj2Nyu8QAHFvef9ZATUxI6vup99wfXKHBzeszWNeC9ttvKmn/qlDf2M37H3YcKJ1FJ6YM+t77lIIh41zMdagw==
[root@node1 ~]# ssh -2 192.168.30.20


  1、openssh采用C/S架构:

      server:openssh-server,sshd,22/tcp

      client:openssh-clients(软件包),ssh

        windows上常用的ssh客户端工具:xshell,putty,securecrt,sshshellclient


  2、openssh客户端

      配置文件:/etc/ssh/ssh_config

      ssh命令的使用:

        ssh [-p PORT] [username@]host [COMMAND] 或者ssh [-p PORT] -l username host [COMMAND]

        后面若带上 COMMAND 则表示只是临时登录远程主机执行指定命令,取回结果后就立即断开,返回本地  

[root@node2 ~]# ssh wittgenstein@192.168.30.10 hostname
wittgenstein@192.168.30.10's password: 
node1
[root@node2 ~]#


  3、基于ssh协议的scp和sftp

  ■scp:利用ssh协议在主机之间实现文件安全传输的工具

   用法:scp [option] SRC1... DEST

   分两种情形:

     ①源文件在本机,目标为远程

       # scp /path/to/somewhere... USERNAME@HOST:/path/to/somewhere

     ②源文件在远程,本地为目标

       # scp USERNAME@HOST:/path/to/somewhere /path/to/somewhere   

   常用选项:

      -r:复制目录

      -p:保持源文件的元数据信息,包括mode和timestamp

      -q:静默模式

      -P PORT:指定远程主机端口号;如非默认的22号端口,则需使用该选项明确指定

      -l : limit,限制传输速率,单位Kbit/s

[root@node2 ~]# scp anaconda-ks.cfg 192.168.30.10:/tmp
root@192.168.30.10's password: 
anaconda-ks.cfg                                                                                                                          100% 1282     1.3KB/s   00:00    
[root@node2 ~]# scp -r 192.168.30.10:/root/test /tmp/
root@192.168.30.10's password: 
c.txt                                                                                                                                    100%    0     0.0KB/s   00:00    
b.txt                                                                                                                                    100%    0     0.0KB/s   00:00    
[root@node2 ~]# ls /tmp/test
b.txt  c.txt


  ■sftp:基于ssh的ftp服务,安全性比ftp好得多,openssh服务端内置并默认启用该功能

   用法:sftp [-oPORT=#] USERNAME@HOST[:/path/to/somewhere]

   若openssh服务端不是默认的22号端口,要用选项-oPORT指定

   cd:切换远程目录

   lcd:切换本地目录

[root@node1 ~]# sftp -oPORT=7796 tesla@192.168.30.20
Connecting to 192.168.30.20...
sftp> help
Available commands:
bye                                Quit sftp
cd path                            Change remote directory to 'path'
chgrp grp path                     Change group of file 'path' to 'grp'
chmod mode path                    Change permissions of file 'path' to 'mode'
chown own path                     Change owner of file 'path' to 'own'
df [-hi] [path]                    Display statistics for current directory or
                                   filesystem containing 'path'
exit                               Quit sftp
get [-P] remote-path [local-path]  Download file
help                               Display this help text
lcd path                           Change local directory to 'path'
lls [ls-options [path]]            Display local directory listing
lmkdir path                        Create local directory
ln oldpath newpath                 Symlink remote file
lpwd                               Print local working directory
ls [-1aflnrSt] [path]              Display remote directory listing
lumask umask                       Set local umask to 'umask'
mkdir path                         Create remote directory
progress                           Toggle display of progress meter
put [-P] local-path [remote-path]  Upload file
pwd                                Display remote working directory
quit                               Quit sftp
rename oldpath newpath             Rename remote file
rm path                            Delete remote file
rmdir path                         Remove remote directory
symlink oldpath newpath            Symlink remote file
version                            Show SFTP version
!command                           Execute 'command' in local shell
!                                  Escape to local shell
?                                  Synonym for help
sftp> ls
tesla.txt  
sftp> get tesla.txt /tmp/test
Fetching /home/tesla/tesla.txt to /tmp/test/tesla.txt
sftp> quit
[root@node1 ~]# ls /tmp/test
tesla.txt

  4、openssh的服务器端:      

      服务脚本:/etc/rc.d/init.d/sshd

      脚本配置文件:/etc/sysconfig/sshd

      配置文件:/etc/ssh/sshd_config

        配置参数:(man sshd_config)

          Port:修改默认监听的端口

          ListenAddress

    ★为安全起见,在网络上提供ssh服务的主机应尽量不要使用众所周知的22号端口,容易被暴力***;使用 lastb 命令可查看最近登录系统失败的信息(该命令详见博客http://9124573.blog.51cto.com/9114573/1700512),还可查看/var/log/secure(只有管理员才有权限访问)获取详细信息

[root@node2 ~]# vim /etc/ssh/sshd_config 
...
#Port 22    #默认监听22号端口
port 7796    #修改监听的端口
#AddressFamily any    #监听的地址家族(ipv4还是ipv6)
#ListenAddress 0.0.0.0    #默认监听在本机所有地址(ipv4)上
#ListenAddress ::    #默认监听在本机所有地址(ipv6)上

# Disable legacy (protocol version 1) support in the server for new
# installations. In future the default will change to require explicit
# activation of protocol 1
Protocol 2    #优先使用ssh v2

# HostKey for protocol version 1
#HostKey /etc/ssh/ssh_host_key    #ssh v1所用的密钥指纹
# 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

# Authentication:

#LoginGraceTime 2m    #等待客户端执行登录操作的时长
#PermitRootLogin yes   #是否允许以管理员身份直接登录;建议改为no,以普通用户登录后再su到管理员
#StrictModes yes
#MaxAuthTries 6   #最大尝试次数,避免暴力***
#MaxSessions 10   #最大ssh会话数

#RSAAuthentication yes
#PubkeyAuthentication yes    #是否支持公钥认证
#AuthorizedKeysFile     .ssh/authorized_keys   #认证客户端的密钥文件
#AuthorizedKeysCommand none
#AuthorizedKeysCommandRunAs nobody

...
#ClientAliveInterval 0   #客户端空闲时长,超时则自动断开
#ClientAliveCountMax 3   #允许客户端空闲的次数
#ShowPatchLevel no
#UseDNS yes
#PidFile /var/run/sshd.pid
#MaxStartups 10:30:100
#PermitTunnel no
#ChrootDirectory none

# no default banner path
#Banner none

# override default of no subsystems
Subsystem       sftp    /usr/libexec/openssh/sftp-server    #默认启用sftp功能

# Example of overriding settings on a per-user basis
#Match User anoncvs
#       X11Forwarding no
#       AllowTcpForwarding no
#       ForceCommand cvs server
[root@node2 ~]# service sshd restart
#修改服务监听的端口或地址后要重启服务,而其它修改通常只需reload即可
Stopping sshd:                                             [  OK  ]
Starting sshd:                                             [  OK  ]
[root@node2 ~]# netstat -tnl   #可以看到7796端口已被监听
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State      
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      
tcp        0      0 0.0.0.0:7796                0.0.0.0:*                   LISTEN      
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      
tcp        0      0 127.0.0.1:6010              0.0.0.0:*                   LISTEN      
tcp        0      0 0.0.0.0:49951               0.0.0.0:*                   LISTEN      
tcp        0      0 :::111                      :::*                        LISTEN      
tcp        0      0 :::49553                    :::*                        LISTEN      
tcp        0      0 :::7796                     :::*                        LISTEN      
tcp        0      0 ::1:631                     :::*                        LISTEN      
tcp        0      0 ::1:6010                    :::*                        LISTEN
[root@node2 ~]# iptables -R INPUT 4 -p tcp --dport 7796 -j ACCEPT   #若有开启防火墙,还要修改防火墙规则
[root@node2 ~]# logout
...
[c:\~]$ ssh 192.168.30.20 7796   #指定新的端口重新登录


Connecting to 192.168.30.20:7796...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.

Last login: Tue Nov 24 19:46:16 2015 from 192.168.30.1
[root@node2 ~]#


  5、sshd认证客户端的方式:

     (1)基于口令的认证

     (2)基于密钥的认证

       ①客户端生成密钥对       

          # ssh-keygen -t rsa

           常用选项:        

             -f /path/to/somefile:密钥文件保存位置;默认位于当前用户家目录下的.ssh目录中

             -P '':指定oldpassword

           生成的密钥默认为id_rsa, id_rsa.pub

       ②将公钥信息导入到远程主机某个用户家目录下的 .ssh/authorized_keys 文件中

          方式有两种:

            ㈠客户端:scp -P 7796 .ssh/id_rsa.pub 用户@192.168.30.20:用户的家目录

             服务器端:cat id_rsa.pub >> .ssh/authorized_keys

            ㈡ssh-copy-id -i .ssh/id_rsa.pub USERNAME@HOST

             如果远程主机不是监听在默认的22号端口,则要指明端口:

             ssh-copy-id -i .ssh/id_rsa.pub '-p PORT USERNAME@HOST'


  示例:以下node2为openssh服务端,node1为客户端

[root@node1 ~]# ssh-keygen -t rsa   #生成密钥对
Generating public/private rsa key pair.
Enter file in which to save the key (/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.
The key fingerprint is:
ca:8c:ba:06:7a:33:58:73:54:fe:f1:f6:59:89:a7:d0 root@node1
The key's randomart p_w_picpath is:
+--[ RSA 2048]----+
|                 |
|      .          |
|     o           |
|    . . .        |
|   .   .So . . . |
|. o .+ .. + E +  |
|.+ o. +  . o =   |
|o =.        +    |
| oo+             |
+-----------------+
[root@node1 ~]# ls .ssh
id_rsa  id_rsa.pub  known_hosts
[root@node1 ~]# ll .ssh
total 12
-rw------- 1 root root 1675 Nov 24 21:23 id_rsa
-rw-r--r-- 1 root root  392 Nov 24 21:23 id_rsa.pub
-rw-r--r-- 1 root root  395 Nov 24 09:51 known_hosts
[root@node1 ~]# scp -P 7796 .ssh/id_rsa.pub 192.168.30.20:/root   #第一种方式,将公钥先传给远程主机的某个用户
root@192.168.30.20's password: 
id_rsa.pub                                                                                                                               100%  392     0.4KB/s   00:00    
[root@node1 ~]# ssh-copy-id -i .ssh/id_rsa.pub '-p 7796 tesla@192.168.30.20'
#第二种方式,直接将公钥信息导入远程主机某个用户的.ssh/authorized_keys文件中
tesla@192.168.30.20's password: 
Now try logging into the machine, with "ssh '-p 7796 tesla@192.168.30.20'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

[root@node1 ~]# ssh -p 7796 tesla@192.168.30.20   #不用再输密码了
Last login: Fri Nov 27 03:30:38 2015 from 192.168.30.1
[tesla@node2 ~]$ logout
Connection to 192.168.30.20 closed.
[root@node2 ~]# ls
anaconda-ks.cfg  boot.iso  digest     Downloads  httpd.crt  id_rsa.pub   install.log.syslog  key2      messages.cipher  Pictures  Templates  test.sh  vmware-tools-distrib
awk.txt          Desktop   Documents  fstab      httpd.csr  install.log  key1                messages  Music            Public    test       Videos
[root@node2 ~]# cat id_rsa.pub >> .ssh/authorized_keys   #将客户端传来的公钥信息追加至.ssh/authorized_keys中
[root@node2 ~]# cat .ssh/authorized_keys 
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAzMvlCKm+I3UgisZAak3Os6MTcNaC2mtP8H31L+mf0m+hsrq1fXk+QTMPsel1NHkPF5k3p3aMzbar+xpw57Tv97/amnhFATDA+rFCwT6bHyoxV2z+UhlhAFPGzin9bbBsBAqnxtNxuCDdQPUpXgbmz7zF3Impy/386Xt03fO3nnbcVnF5n6kMQ1tMD7x0ldPaR6N5kc92FtFMPrEKBiponsck8duW+73zHk9alcK0Q8e7Y+KFcMJtJogQsWjzjBbcunDLpzmHN3qAFna9sHQ93Xxy2WRuqfcJT/kYBWTHWHm7i+xW+fKhbvvuKRARXH8nVCdumELE44xACoPbCKIThQ== root@node1
[root@node2 ~]# ll .ssh
total 8
-rw-r--r-- 1 root root 392 Nov 27 22:59 authorized_keys
-rw-r--r-- 1 root root 395 Nov 27 19:02 known_hosts
[root@node2 ~]# chmod 600 .ssh/authorized_keys   #通常应缩小.ssh/authorized_keys的访问权限
[root@node1 ~]# ssh -p 7796 root@192.168.30.20   #可以不输密码连接了
Last login: Sat Nov 28 00:06:48 2015 from 192.168.30.1
[root@node2 ~]#

           

 7、ssh实践建议:

    ①不要使用默认的22号端口

    ②不要使用protocol 1

    ③限制可登录的用户

       在sshd配置文件中:

         白名单:

           AllowUsers user1 user2 ...

           AllowGroups grp1 grp2...

         黑名单:

           DenyUsers 

           DenyGroups

    ④设定空闲会话超时时长

       ClientAliveInterval 300 

       ClientAliveCountMax 0

    ⑤利用防火墙设置ssh访问策略;

    ⑥仅监听在特定的IP地址上,而非本机所有的IP地址;

    ⑦使用强密码策略

       # tr -dc A-Za-z0-9_ < /dev/urandom | head -c 30 | xargs

    ⑧尽量基于密钥而非口令认证;        

       PubkeyAuthentication yes

       AuthorizedKeysFile     .ssh/authorized_keys


       PasswordAuthentication no

    ⑨禁止使用空密码;

    ⑩禁止root用户直接登录;

    ⒒限制ssh的访问频度

    ⒓做好日志,经常分析;