MySQL Ошибка 2003 (HY000): Can't connect to MySQL server (111 Connection refused)
Сетевая подсистема TCP/IP и привязка адресов (bind-address) в MySQL
При попытке удаленного подключения клиента к серверу СУБД по сети TCP/IP клиент отправляет TCP SYN-пакет на указанный IP-адрес и порт (по умолчанию 3306). Если на целевом сервере сетевой стек ядра возвращает TCP RST-пакет (сброс соединения), клиентская библиотека прерывает попытку подключения с системной ошибкой:
«ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.1.100:3306' (111 Connection refused)»
или в ОС Windows:
«ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.1.100' (10061)»
Бизнес-риски
Полная изоляция базы данных от внешних бэкенд-серверов, разрыв репликации между нодами кластера, недоступность API микросервисов.
Типовые причины ошибки Connection Refused (111)
| Источник проблемы | Конфигурация | Симптом |
|---|---|---|
| Привязка только к Localhost | bind-address = 127.0.0.1 | Сервер слушает только локальные пакеты и сбрасывает любые внешние IP. |
| Межсетевой экран (Firewall) | UFW / iptables / Security Group | Пакеты на порт 3306 сбрасываются правилом REJECT. |
| Служба MySQL выключена | Демон mysqld не запущен | Порт 3306 не слушается ни одним процессом в ОС. |
| Директива skip-networking | skip-networking = 1 | TCP/IP стек в MySQL полностью отключен (только Unix-сокеты). |
Регламент сетевой диагностики и настройки удаленного доступа к MySQL
Шаг 1: Проверка сетевых портов и директивы bind-address
Проверьте, какой IP-адрес и порт слушает демон СУБД:
# 1. Проверка открытых портов на сервере базы данных:
sudo ss -tulpn | grep 3306
# Если вывод содержит '127.0.0.1:3306' -> удаленные подключения ЗАПРЕЩЕНЫ!
# Ожидаемый вывод для работы по сети: '0.0.0.0:3306' или '*:3306'
# 2. Настройка конфигурации my.cnf:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
# Установите прослушивание всех интерфейсов (или конкретного приватного IP):
[mysqld]
bind-address = 0.0.0.0
# Убедитесь, что параметр skip-networking закомментирован!
# skip-networking
# 3. Перезапустите службу:
sudo systemctl restart mysqlШаг 2: Настройка правил межсетевого экрана (UFW / iptables / NFTables)
Откройте доступ к порту 3306 строго для IP-адресов ваших серверов приложений:
# Для Ubuntu / Debian (UFW) - разрешить доступ только с IP бэкенд-сервера:
sudo ufw allow from 192.168.1.50 to any port 3306 proto tcp
sudo ufw reload
# Для RHEL / CentOS / AlmaLinux (Firewalld):
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.50" port protocol="tcp" port="3306" accept'
sudo firewall-cmd --reload
# Прямое правило Iptables:
sudo iptables -A INPUT -p tcp -s 192.168.1.50 --dport 3306 -j ACCEPTШаг 3: Проверка доступности порта с клиентского сервера
# Проверка доступности порта 3306 с клиентской машины через netcat / telnet:
nc -zv -w 3 192.168.1.100 3306
# Ожидаемый ответ: Connection to 192.168.1.100 3306 port [tcp/mysql] succeeded!Типовые ошибки администраторов
- Открытие bind-address = 0.0.0.0 в публичный интернет без Firewall: Порт СУБД становится уязвим для постоянных атак брутфорса и сканеров ботнетов. Доступ к 3306 должен быть ограничен через VPN или белый список IP.
- Блокировка на уровне облачных провайдеров (AWS Security Groups / Cloud Firewalls): Правила фаервола открыты внутри Linux, но входящий трафик отсекается виртуальным файрволом облачной платформы (Yandex Cloud, AWS, Hetzner).
Эксперты ITSTM выстроят безопасную сетевую топологию, настроят VPN/VPC туннели и обеспечат защиту трафика через TLS/SSL шифрование.
Частые вопросы (FAQ)
В чем разница между Connection refused (111) и Connection timed out (110)?
Connection refused означает, что сервер доступен, но порт закрыт или пакет отброшен с TCP RST (активный сброс). Timed out означает, что пакеты 'молча' дропаются фаерволом (DROP) или отсутствует сетевой маршрут.
Можно ли указать несколько IP-адресов в bind-address?
Начиная с MySQL 8.0.13, директива bind-address поддерживает перечисление нескольких IP через запятую или пробел (например: bind-address = 127.0.0.1, 192.168.1.100).
Как сменить стандартный порт 3306 на другой для безопасности?
Задайте директиву port = 3307 в секции [mysqld] файла my.cnf и перезапустите сервер.
Почему при bind-address = 0.0.0.0 не работает подключение по IPv6?
Для одновременной поддержки IPv4 и IPv6 задайте bind-address = :: или добавьте параметр bind-address = *.