近期在项目过程中出现了Linux下很多服务远程连接慢的问题,连接延迟的时间在10秒左右,主要体现在SSH,MySQL,Zookeeper,Jetty等服务连接慢,一旦连接成功后,其他操作不受影响。
解决过程
我通过对网络链路,交换机配置,操作系统网络配置等方面进行查看,均没有发现异常问题,SCP跨主机传输文件,主要是在链接时耗时长,而一旦SSH链接建立之后,传输速度基本能够达到带宽最高速度。
最后突然想起以前遇到过MySQL连接慢时,通过配置skip-name-resolve就可以解决。于是首先在MySQL配置文件my.cnf中[mysqld]下添加skip-name-resolve,重启MySQL后问题解决。于是查看/etc/resolv.conf文件,文件中填写的nameserver对应的是8.8.8.8,但是当前服务器是部署在内网中,无法访问外部DNS。注释nameserver之后,重启所有相关服务,比如sshd,mysqld,zookeeper,jetty等服务,原有连接缓慢问题全部解决。
原理反思
DNS通常用来解析域名对应的主机IP地址,这就是通常我们所了解的正向解析。而反向解析则是通过ip查找域名,DNS反向解析用来屏蔽非法的IP访问请求;常见于邮件屏蔽系统,而apache,ssh,mysql等服务器端程序也会默认携带。
例如:邮件头包含域名和邮箱服务器的IP地址,一般邮件系统会检测发送来的域名是否合法(比对黑白名单),如果合法则接收该邮件,不合法则丢弃;对于自架邮件系统专门发送垃圾邮件的人,为了能逃避目标邮件系统的审核,此时可以通过将自己的邮件头域名篡改为常用的如Gmail邮件域名来逃脱检查。大量动态IP的非法请求催生了DNS反向解析技术的发展。
SSH中的DNS反向解析
SSH服务中的反向解析同样的也是为了通过审查请求来的IP和其IP存放在DNS服务器上面的域名是否能对应起来,来提高安全性。
但由于反向解析的存在,每个IP请求都会消耗一定时间来审查其合法性。对于局域网内服务器群、不直接连接外网的服务器或者已知访问的IP都是合法的地址等情况,其审查显得多余且长时间的查询会极大的影响SSH连接速度。
以下通过关闭SSH反向解析服务和在hosts文件中配置可信的访问地址来解决该问题。
方法1:
### 1. 备份sshd配置文件
cp /etc/ssh/sshd_config
/etc/ssh/sshd_config
.bak.20150323.UseDNSYes2No
### 2. 修改配置文件,取消sshd服务的dns反向解析
vim /etc/ssh/sshd_config
### 3. 找到选项UseDNS ,取消注释,改为
UseDNS no
### 4. 重启sshd服务
/etc/init.d/sshd restart
方法2
### 1. 备份hosts文件
cp /etc/hosts /etc/hosts.bak.20150323.addTrustedIPandName
### 2. 修改hosts文件
vim /etc/hosts
### 3. 增加可信的IP及其服务名,示例IP为10.0.0.1,名称为hadoop
10.0.0.1 hadoop
MySQL中的DNS反向解析
MySQL也提供参数配置来关闭DNS反向解析。详细操作如下:
### 1.编辑my.cnf,添加skip-name-resolve
vi /etc/my.cnf
在[mysqld]下添加skip-name-resolve
### 2.重启MySQL
service mysqld restart
关闭DNS反向解析
在私网中,往往没有DNS服务器部署,此时我们可以通过关闭dns nameserver来实现关闭DNS反向解析。
### 1.编辑/etc/resolv.conf
注释掉所有内容,或者清空该文件。
### 2.重启相关服务
参考文档
- http://blog.csdn.net/jackxinxu2100/article/details/8145318
- http://blog.csdn.net/tianlesoftware/article/details/6103857
- http://www.linuxidc.com/Linux/2013-01/78749.htm
拜读,写的很好,我很认同。
这个我也遇到过,我在国内连接北京的服务器,非常慢。后来突然想到ssh dns的这个问题才恍然大悟。