有关skip_name_resolve参数的总

作MySQL调优的同一组成部分,很多口还推荐开启skip_name_resolve。这个参数是不准域名解析的(当然,也席卷主机名)。很多童鞋会好奇,这背后的规律是什么,什么动静下开之参数比较合适。

 

根据以下原因,MySQL服务端会在内存中保障着同份host信息,
包括三有的:IP,主机名和错误信息。主要用于非本地TCP连接。

  1. 经以第一糟糕建立连接时缓存IP和host
    name的照关系,同一主机的存续连接将一直翻host
    cache,而不用再行展开DNS解析。

  2. host
    cache中同样会含有IP登录失败的错误信息。可因这些信,对这些IP进行相应的范围。后面将会见切实涉及。

host cache的消息但经过performance_schema中host_cache表查看。

 

那么,IP和host name的照射关系是何等建立的呢?

  1. 当有一个初的客户端连接上时,MySQL Server会为是IP在host
    cache中确立一个初的笔录,包括IP,主机名及client lookup validation
    flag,分别对应host_cache表中的IP,HOST和HOST_VALIDATED这三排列。第一糟糕建立连接为光来IP,没有主机名,所以HOST将装为NULL,HOST_VALIDATED将安装也FALSE。

  2. MySQL
    Server检测HOST_VALIDATED的值,如果也FALSE,它见面打算进行DNS解析,如果条分缕析成,它用创新HOST的价为主机名,并将HOST_VALIDATED值设为TRUE。如果没有解析成,判断失败的原由是恒久的尚是现之,如果是世代的,则HOST的值依旧为NULL,且以HOST_VALIDATED的价设置也TRUE,后续连接不再进行辨析,如果该由是临时的,则HOST_VALIDATED依旧吧FALSE,后续连接会再次展开DNS解析。

 

任何,解析成的标志并无特是经过IP,获取到主机名即可,这就是中同样步,还有平等步是透过分析后的主机名来反而为解析为IP,判断该IP是否跟原本IP相同,如果同样,才看清也剖成,才会创新host
cache中的消息。

 

因上面的总结,下面谈谈 host cache的得失:

缺点:当起一个初的客户端连接上时,MySQL
Server都设树一个新的笔录,如果DNS解析很缓慢,无疑会影响属性。如果吃允许看的主机很多,也会影响属性,这个和host_cache_size有关,这个参数是5.6.5引入的。5.6.8事先默认是128,5.6.8之后默认是-1,基于max_connections的价值动态调整。所以如果叫允许看的主机很多,基于LRU算法,先前树立的连续可能会见为挤丢,这些主机重新上时,会还开展DNS查询。

瑜:通常情况下,主机名是无换的,而IP是形成的。如果一个客户端的IP经常转移,那基于IP的授权将凡一个麻烦的进程。因为您老麻烦确定IP什么时候别。而因主机名,只待一坏授权。而且,基于host
cache中的失败信息,可在必程度达堵住外界的暴力破解攻击。

 

关于阻止外界的暴力破解攻击,涉及到max_connect_errors参数,默认为100,官方的解释如下:

If more than this many successive connection requests from a host are interrupted without a successful connection, the server blocks that host from further connections.

倘若某客户端的总是上了max_connect_errors的范围,将吃禁止访问,并提示以下错误:

Host 'host_name' is blocked because of many connection errors.
Unblock with 'mysqladmin flush-hosts'

 

脚来法一下

首先,设置max_connect_errors的值

mysql> show variables like 'max_connect_errors';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| max_connect_errors | 100   |
+--------------------+-------+
1 row in set (0.00 sec)

mysql> set global max_connect_errors=2;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'max_connect_errors';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| max_connect_errors | 2     |
+--------------------+-------+
1 row in set (0.00 sec)

通过telnet模拟interrupted without a successful connection。

[root@mysql-slave1 ~]# telnet 192.168.244.145 3306
Trying 192.168.244.145...
Connected to 192.168.244.145.
Escape character is '^]'.
N
5.6.26-log
          K]qA1nYT!w|+ZhxF1c#|kmysql_native_password
^]
!#08S01Got packets out of orderConnection closed by foreign host.
[root@mysql-slave1 ~]# telnet 192.168.244.145 3306
Trying 192.168.244.145...
Connected to 192.168.244.145.
Escape character is '^]'.
N
Y#>PVB(>!Bl}NKnjIj]sMmysql_native_password
^]
!#08S01Got packets out of orderConnection closed by foreign host.
[root@mysql-slave1 ~]# mysql -h192.168.244.145 -uroot -p123456
Warning: Using a password on the command line interface can be insecure.
ERROR 1129 (HY000): Host '192.168.244.144' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'

不畏后来用了无可非议的账号及密码登录,依旧会于拦住。

复来探望host_cache表中的音讯,sum_connect_errors为2了。

mysql> select ip,host,host_validated,sum_connect_errors,count_authentication_errors from performance_schema.host_cache;
+-----------------+------+----------------+--------------------+-----------------------------+
| ip              | host | host_validated | sum_connect_errors | count_authentication_errors |
+-----------------+------+----------------+--------------------+-----------------------------+
| 192.168.244.144 | NULL | YES            |                  2 |                           0 |
+-----------------+------+----------------+--------------------+-----------------------------+
1 row in set (0.00 sec)

 

该拦截会直接生效,直到采取以下操作:

1. mysql> flush hosts;

2. # mysqladmin flush-hosts

3. truncate table performance_schema.host_cache;

  1. 还是等待该记录从host cache中让挤丢。

 

设只要禁止DNS解析,可安装skip_name_resolve参数,这样,mysql.user表中因主机名的授权将无法以,且错误日志中会提示:

[Warning] 'user' entry 'root@mysql-slave1' ignored in --skip-name-resolve mode.

此处,通过mysql-slave1访问,将会见拒绝访问

[root@mysql-slave1 ~]# mysql -h192.168.244.145 -uroot -p123
Warning: Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'root'@'192.168.244.144' (using password: YES)

 

host
cache是默认开启的,如果要是禁掉,可将host_cache_size设置为0,该参数是只动态参数,可在线修改。

 

假若只要了禁掉TCP/IP连接,可每当MySQL启动时,设置skip-networking参数。

 

总结:

1.
由规律上看,DNS解析一般但对客户端的首先不成连续,客户端数据量比较粗的状态下,开销其实不雅,完全不必禁掉skip_name_resolve参数,带来的功利虽,为客户端以及形成的IP直接解耦,只待对主机名进行相同破授权。

可通过\s查看当前连接使用的凡socket还是TCP。

  1. 奇怪的是,对于skip_name_resolve参数,虽然合法文档说的凡布尔值,

但假如在配置文件被指定了,无论是skip_name_resolve=off或者skip_name_resolve=0。

最后,通过show variables like
‘%skip_name_resolve%’查看均显示ON。将欠参数设置为OFF的绝无仅有办法是勿写该参数(因为它默认值即为OFF)。

  1. 在skip_name_resolve=ON的状态下,在本地通过-h127.0.0.1不曾问题。

    [root@localhost ~]# mysql -uroot -h127.0.0.1 -p123456
    Warning: Using a password on the command line interface can be insecure.
    Welcome to the MySQL monitor. Commands end with ; or \g.
    Your MySQL connection id is 4
    Server version: 5.6.31-log MySQL Community Server (GPL)

    Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.

    Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

    root@(none) 09:02:15> \s

    mysql Ver 14.14 Distrib 5.6.31, for Linux (x86_64) using EditLine wrapper

    Connection id: 4
    Current database:
    Current user: root@127.0.0.1
    SSL: Not in use
    Current pager: stdout
    Using outfile: ”
    Using delimiter: ;
    Server version: 5.6.31-log MySQL Community Server (GPL)
    Protocol version: 10
    Connection: 127.0.0.1 via TCP/IP
    Server characterset: utf8
    Db characterset: utf8
    Client characterset: utf8
    Conn. characterset: utf8
    TCP port: 3306
    Uptime: 11 min 10 sec

    Threads: 1 Questions: 20 Slow queries: 0 Opens: 70 Flush tables: 1 Open tables: 63 Queries per second avg: 0.029

    root@(none) 09:02:18> show variables like ‘%skip_name_resolve%’;
    +——————-+——-+
    | Variable_name | Value |
    +——————-+——-+
    | skip_name_resolve | ON |
    +——————-+——-+
    1 row in set (0.06 sec)

 

假若该参数设置为OFF,则上述办法尽管会见报错,通过报错信息方可看看,它直接拿127.0.0.1转发为localhost了。

[root@localhost ~]# mysql -uroot -h127.0.0.1 -p123456 -P3306
Warning: Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

留意:
‘t1’@’%’中包含’t1’@’127.0.0.1’,如果开启skip_name_resolve参数,则’t1’@’%’中定义的密码可用于’t1’@’127.0.0.1’的报到,如果没有打开该参数,则’t1’@’127.0.0.1’会转化为’t1’@’localhost’登录,此时’t1’@’%’定义的密码并无适用。

 

参考:

  1. http://www.tuicool.com/articles/7R7BRb

2. http://dev.mysql.com/doc/refman/5.7/en/host-cache.html

3. http://dev.mysql.com/doc/refman/5.7/en/blocked-host.html

 

网站地图xml地图