在某些情况下,你连接某台服务器时发现 sshd 时响应很慢,可能十多秒,甚至几十秒。然后你会在网上查找原因,可能会找到缓慢的原因是: 
SSHD 服务的 DNS 反向解析  功能默认开启所造成,且找到修正方法为: 

1. 编辑 /etc/ssh/sshd_config 文件 
2. 找到 #UseDNS yes 
3. 将其改为 UseDNS no 
4. 重启 sshd 服务


上面的修正方法是禁用了 sshd 服务的 DNS 反向解析功能。 

其实,默认开启反向解析是其中原因之一,但是背后真正的元凶是开启了严格的 iptables 防火墙规则,如果禁用掉 iptables 防火墙,那么服务器可以高速自由的连接 DNS 服务器,那么即使反向解析开启,那么对连接速度也没太多影响。 

下面具体分析: 

首先,我在服务器上设置两条规则: 

复制代码

  1. iptables  -P INPUT DROP

  2. iptables -A INPUT -p tcp --dport 22 -j ACCEPT



第 1 条规则设置 INPUT 链中的默认策略是 DROP,即不接受任何输入连接。这里需要相当注意,你需要能够接触到物理主机,否则在远程连接的状态下运行此命令,将导致你和服务器中断连接,以后就再也无法连接了,若是 VPS ,上面还放着网站什么的其它服务,那就更杯具了,大半情况下,得重装系统才能解决了。当然,可以先停止 iptables 服务,然后将规则写到一个脚本中,并将该脚本放在 /etc/rc.d/rc.local 文件中,然后重启服务器即可。若不,还可以在停止 iptables 服务后,将规则事先写到 /etc/sysconfig/iptables 文件中,然后再重启 iptables 服务。 

第 2 条规则是允许 22 端口的连接。 

所以,在第 1 和 第 2 条规则的配合下,服务器只接受 sshd 服务的连接,其它的一律拒绝。在这种情况下,就会出现 sshd 响应慢的问题了。原因如下: 

当 ssh 客户端发来连接时,sshd 服务器将客户端所在主机的 IP 到 DNS 服务器去执行反向解析。注意,此时防火墙的 OUTPUT 链是不做任何限制的,因此这个反向解析请求是能够发到 DNS 服务器那边去,而 DNS 也会回应。这时问题就出现了,由于上面的 iptables 规则的限制,DNS 的回应没法被服务器所接收到,因此 sshd 只有不断的去重复反向解析操作,会一直等到请求超时为止。这里,这个重复去请求反向解析的操作所耗去的时间就是你连接 sshd 时发现很慢的这一事实。在超时后,sshd 这才去应答 ssh 客户端,因此给我们的感觉就是”为什么网络或者服务器着么差啊“。 

在了解上面的原因之后,解决办法就简单了。在 iptables 的 state 模块里定义了一个 ESTABLISHED 的状态,该状态简而言之就是只要发送端或接收端只要有一方已经成功建立了连接,那么我们就认为这个状态是 ESTABLISHED ,另外,DNS 解析使用的是 udp 协议,因此我们可以用再为 iptables 添加一条规则: 

复制代码

  1. iptables -A INPUT -p udp -m state --state ESTABLISHED -j ACCEPT


这么做之后,在发生 DNS 反向解析时防火墙不会再阻拦 DNS 服务器端发送过来的响应,因此 sshd 的响应速度就提高了。



转载:https://my.oschina.net/jccpp/blog/122584