sshd 响应慢缘由分析及使用 iptables 解决

在某些状况下,你链接某台服务器时发现 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 的响应速度就提升了。
相关文章
相关标签/搜索