ssh
2016年05月13日

概述

SSH是Secure Shell的缩写,是一个应用层的加密网络协议,它不只可以用于远程登录,远程命令执行,还可用于数据传输.当然它由ssh Client和ssh Server端组成,有很多实现,Ubuntu上就默认安装的OpenSSH,Client端叫做ssh,Server端叫做sshd. OpenSSH只用来做远程登录和命令执行.

免密登录

查看本地~/.ssh/目录是否有id_rsa.pub,如果没有,在本地创建公钥

  1. 使用命令ssh-keygen生成密钥
ssh-keygen -t rsa

会生成一个私钥和一个公钥,在提示输入passphrase时如果不输入,直接回车,那么以后你登录服务器就不会验证密码,否则会要求你输入passphrase
id_rsa 私钥(放在本地)
id_rsa.pub 公钥(放在服务端)

  1. 把本地公钥复制到远程机器的 ~/.ssh/ 目录下,并命名为 authorized_keys
scp ~/.ssh/id_rsa.pub username@remotehost:~/.ssh/authorized_keys

#或者

ssh-copy-id -i ~/.ssh/id_rsa.pub username@remotehost

如果远程主机配置了多台机器免密登录,最好将 id_ras.pub 追加而不是覆盖到 authorized_keys

cat id_rsa.pub >> .ssh/authorized_keys 

客户端上保留私钥,公钥留不留都可以;也就是服务器上要有公钥,客户端上要有私钥.这样就可以实现无密码验证登录了

更改端口

修改sshd配置文件

vim /etc/ssh/sshd.conf
Port 22             # 修改需要的端口号

重新启动ssh服务

/etc/init.d/sshd restart
#service sshd restart

禁止ssh密码登录

修改服务端ssh配置文件

vim /etc/ssh/sshd_conf
RSAAuthentication yes
PubkeyAuthentication yes
#一般它们默认都是 yes,如果不是,请修改为 yes,保存并且重启 SSH 服务:
ChallengeResponseAuthentication no
PasswordAuthentication no
UsePAM yes

也即只能使用密匙认证的openssh,禁止使用口令认证。

保持SSH连接

配置服务端

SSH总是被强行中断,导致效率低下,可以在服务端配置,让 server 每隔30秒向 client 发送一个 keep-alive 包来保持连接:

vim /etc/ssh/sshd_config

# 添加
ClientAliveInterval 30
ClientAliveCountMax 60

第二行配置表示如果发送 keep-alive 包数量达到 60 次,客户端依然没有反应,则服务端 sshd 断开连接。如果什么都不操作,该配置可以让连接保持 30s*60 , 30 min

重启本地 ssh

#根据不同的系统自行选择
service ssh restart
/etc/init.d/ssh restart
systemctl restart ssh

如果找不到 ssh,“Failed to restart ssh.service: Unit ssh.service not found.”,需要安装

sudo apt-get install openssh-server

配置客户端

如果服务端没有权限配置,或者无法配置,可以配置客户端 ssh,使客户端发起的所有会话都保持连接:

vim /etc/ssh/ssh_config
# 添加
ServerAliveInterval 30
ServerAliveCountMax 60

本地ssh每隔30s向server端sshd发送keep-alive包,如果发送60次,server无回应断开连接

下面是man ssh_config的内容

ServerAliveCountMax Sets the number of server alive messages (see below) which may be sent without ssh(1) receiving any messages back from the server. If this threshold is reached while server alive messages are being sent, ssh will disconnect from the server, terminating the session. It is important to note that the use of server alive messages is very different from TCPKeepAlive (below). The server alive messages are sent through the encrypted channel and therefore will not be spoofable. The TCP keepalive option enabled by TCPKeepAlive is spoofable. The server alive mechanism is valuable when the client or server depend on knowing when a connection has become inactive.

The default value is 3. If, for example, ServerAliveInterval (see below) is set to 15 and ServerAliveCountMax is left at the default, if the server becomes unresponsive, ssh will disconnect after approximately 45 seconds. This option applies to protocol version 2 only; in protocol version 1 there is no mechanism to request a response from the server to the server alive messages, so disconnection is the responsibility of the TCP stack.

ServerAliveInterval Sets a timeout interval in seconds after which if no data has been received from the server, ssh(1) will send a message through the encrypted channel to request a response from the server. The default is 0, indicating that these messages will not be sent to the server, or 300 if the BatchMode option is set. This option applies to protocol version 2 only. ProtocolKeepAlives and SetupTimeOut are Debian-specific compatibility aliases for this option.

共享SSH连接

如果需要在多个窗口中打开同一个服务器连接,可以尝试添加~/.ssh/config,添加两行

ControlMaster auto
ControlPath ~/.ssh/connection-%r@%h:%p

配置之后,第二条连接共享第一次建立的连接,加快速度,添加长连接配置

ControlPersist 4h

每次SSH连接建立之后,此条连接会被保持4小时,退出服务器之后依然可以重用,配置连接中转

ForwardAgent yes

当需要从一台服务器连接另外一个服务器,而在两台服务器中传输数据时,可以不用通过本地电脑中转,直接配置以上ForwardAgent即可。

最终~/.ssh/config下的配置:

Host *
	ForwardAgent yes
	ServerAliveInterval 3
	ServerAliveCountMax 20
	TCPKeepAlive no
	ControlMaster auto
	ControlPath ~/.ssh/connection-%r@%h:%p
	ControlPersist 4h
	Compression yes

ssh 其他配置备查

以下配置项都是在/etc/ssh/sshd_config文件中修改。

  1. 禁止 root 登录
PermitRootLogin no
  1. 仅允许指定用户和组登录
    指定用户
AllowUsers ramesh john jason

指定组

AllowGroups sysadmin dba
  1. 禁止指定的用户或组登录
    指定用户
DenyUsers cvs apache jane

指定组

DenyGroups developers qa
  1. 修改 SSH 监听端口
    把 SSH 监听端口改为 222
Port 222
  1. 修改默认登录时间
    当你连接到 SSH 后,默认是提供 2 分钟的时间让你输入帐户和密码来进行登录,你可以修改这个时间为 1 分钟或 30 秒。
LoginGraceTime 1m
  1. 限制监听 IP
    如果你的服务器上有多个网卡及 IP ,那么你可以限制某些 IP 不监听 SSH,只允许通过某些 IP 来登录。
    比如你有四个网卡
eth0 – 192.168.10.200
eth1 – 192.168.10.201
eth2 – 192.168.10.202
eth3 – 192.168.10.203

你只想让用户通过 202, 203 这两个 IP 来登录,那么做以下设定

ListenAddress 192.168.10.200
ListenAddress 192.168.10.202
  1. 当用户处于非活动时断线
    当用户在 10 分钟内处于非活动状态的话,就自动断线。
ClientAliveInterval 600
ClientAliveCountMax 0
ClientAliveCountMax:默认为 3 ,表示当 SSH 没有任何活动时, SSH Server 会发送三次检查是否在线(checkalive)的消息。
ClientAliveCountMax:默认为 0,表示当过了几秒后,SSH Server 会发送消息要求用户响应(0 的话表示永远不发送),否则就断线。