MySQL читает /etc/hosts.allow и /etc/hosts.deny
В сообщениях об ошибках одной из моих служб сообщалось о проблемах при подключении к моему серверу 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-адрес будет сопоставлен с этим файлом, а запрет не будет прочитан)...
1 ответ
MySQL Server не читает эти файлы сам по себе, за это отвечает библиотека TCP Wrappers. Вы можете скомпилировать MySQL без поддержки библиотеки, но я не вижу смысла калечить ее, потому что вы правы в том, что IP-адреса из разрешенного файла не проверяются по запрещающему файлу, поэтому просто сделайте это, если хотите добавить его в белый список.
Но если ваши проблемы с подключением являются случайными, я, вероятно, буду искать другую причину.
Я бы предположил, что на сервере работает что-то вроде fail2ban или denyhosts, у них есть функции, которые отслеживают неудачные попытки входа в систему и имеют настраиваемые
bantime
и сбросить при успешном завершении. Даже если они не обязательно настроены для отслеживания сбоев входа в MySQL, они могут отслеживать другие ошибки входа, такие как SSH, и если они настроены на использование
/etc/hosts.deny
, а затем MySQL подхватит это.
Я бы порекомендовал вам сначала разобраться, почему эти клиенты попадают в этот файл, а затем принять обоснованное решение на основе того, что вы узнаете.
Если это какой-либо из двух инструментов, заполняющих
/etc/hosts.deny
файл для вас, их можно настроить на игнорирование определенных диапазонов IP-адресов, может быть, вы хотите разрешить rfc1918? Однако я бы не стал предпринимать таких действий, не понимая, что в первую очередь заставляет этих клиентов появляться в этом файле.