В отчетах об ошибках одной из моих служб сообщалось о проблемах с подключением к моему серверу MySQL. Эти проблемы не были последовательными, это происходило несколько раз на разных серверах.
Я начал отладку, используя strace
и заметил, что MySQL читает оба /etc/hosts.allow
и /etc/hosts.deny
каждый раз, когда он пытается открыть новое соединение:
read(127, "# /etc/hosts.allow: list of hosts that are allowed to access the system.\n# See the manual pages hosts_access(5) and hosts_options(5).\n#\n# Example: ALL: LOCAL @some_netgroup\n# ALL: .foobar.edu EXCEPT terminalserver.foobar.edu\n#\n# If you're going to protect the portmapper use the name \"portmap\" for the\n# daemon name. Remember that you can only use the keyword \"ALL\" and IP\n# addresses (NOT host or domain names) for the portmapper, as well as for\n# rpc.mountd (the NFS mount daemon). See portmap(8) and rpc.mountd(8)\n# for further information.\n#\n\n", 4096) = 580
read(127, "", 4096) = 0
close(127) = 0
munmap(0x7f94533f9000, 4096) = 0
open("/etc/hosts.deny", O_RDONLY) = 127
fstat(127, {st_mode=S_IFREG|0644, st_size=880, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f94533f9000
read(127, "# /etc/hosts.deny: list of hosts that are _not_ allowed to access the system.\n# See the manual pages hosts_access(5) and hosts_options(5).\n#\n# Example: ALL: some.host.name, .some.domain\n# ALL EXCEPT in.fingerd: other.host.name, .other.domain\n#\n# If you're going to protect the portmapper use the name \"portmap\" for the\n# daemon name. Remember that you can only use the keyword \"ALL\" and IP\n# addresses (NOT host or domain names) for the portmapper, as well as for\n# rpc.mountd (the NFS mount daemon). See portmap(8) and rpc.mountd(8)\n# for further information.\n#\n# The PARANOID wildcard matches any host whose name does not match its\n# address.\n#\n# You may wish to enable this to ensure any programs that don't\n# validate looked up hostnames still leave understandable logs. In past\n# versions of Debian this has been the default.\n# ALL: PARANOID\n\n", 4096) = 880
read(127, "", 4096) = 0
close(127) = 0
[...]
getpeername(127, {sa_family=AF_INET, sin_port=htons(33362), sin_addr=inet_addr("10.2.3.19")}, [16]) = 0
getsockname(127, {sa_family=AF_INET, sin_port=htons(3306), sin_addr=inet_addr("10.2.2.9")}, [16]) = 0
Я предполагаю, что это ожидаемое поведение, но я хочу знать, могу ли я как-нибудь обойти чтение этих файлов? Думаю, просто добавив ip-адрес в /etc/hosts.allow
сделает это (поскольку IP-адрес будет сопоставлен с этим файлом, и отказ не будет прочитан) ...
Сервер MySQL не читает эти файлы сам по себе, он TCP-оболочки библиотека, которая отвечает. Вы можете скомпилировать MySQL без поддержка библиотеки, но я не вижу смысла портить его, потому что вы правы в том, что IP-адреса из позволять файл не проверяется на Отрицать файл, так что просто сделайте это, если хотите внести его в белый список.
Но если ваши проблемы с подключением случайны, я, вероятно, поищу другую причину.
Я бы предположил, что на сервере есть что-то вроде fail2ban или запретить работают на нем, у них есть функции, которые отслеживают неудачные попытки входа в систему и имеют настраиваемые bantime
и сбросить в случае успеха. Даже если они не обязательно настроены для отслеживания сбоев входа в систему MySQL, они могут отслеживать другие ошибки входа в систему, такие как SSH, и если они настроены для использования /etc/hosts.deny
, а затем MySQL подхватит это.
Я бы порекомендовал вам сначала разобраться, почему эти клиенты попадают в этот файл, а затем принять обоснованное решение на основе того, что вы узнаете.
Если это какой-либо из двух инструментов, заполняющих /etc/hosts.deny
файл для вас, их можно настроить на игнорирование определенных диапазонов IP-адресов, может быть, вы хотите разрешить rfc1918? Однако я бы не стал предпринимать таких действий, не понимая, что в первую очередь заставляет этих клиентов появляться в этом файле.