Подходящим решением которое я нашел для запуска MySQL сервера на конкретных IP адресах, это запустить его на всех и потом отфильтровать подключаемых клиентов через iptables.
Для теста я использовал Ubuntu Server 16.04.5 LTS, который имел более 200 внешних белых IP и был высоконагруженным.
MySQL сервер был установлен так:
sudo apt-get install mysql-server mysql-client mysql -V mysql Ver 14.14 Distrib 5.7.23, for Linux (x86_64) using EditLine wrapper
К MySQL серверу нужен был доступ от localhost и нескольких адресов в интернете.
Поэтому я запустил MySQL сервер на всех IP, закомментировав «bind-address» в конфигурации:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf #bind-address = 127.0.0.1 #skip-networking sudo service mysql restart
Создал пользователей для хостов с которых будут выполнятся подключения, более детально смотрите в моей статье — Как создать пользователя MySQL и настроить права доступа
Потом через iptables разрешил подключения только с нужных IP:
/sbin/iptables -A INPUT -s 127.0.0.1 -p tcp --destination-port 3306 -j ACCEPT /sbin/iptables -A INPUT -s 192.168.1.5 -p tcp --destination-port 3306 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 3306 -j DROP
Правило DROP должно быть только последним, если нужно еще добавить IP в iptables, то удалим DROP и в конце снова добавим:
/sbin/iptables -D INPUT -p tcp --dport 3306 -j DROP /sbin/iptables -A INPUT -s 192.168.5.33 -p tcp --destination-port 3306 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 3306 -j DROP
Кстати, на тесте при попытке указать несколько адресов в bind-address, MySQL запускался только на последнем:
bind-address = 192.168.1.11 bind-address = 127.0.0.1
Как вариант, у меня возникает еще такая идея, запустить MySQL только на 127.0.0.1 (bind-address = 127.0.0.1), через iptables переадресовать на любой внешний IP, ну и потом правилами выше можно еще ограничить доступ):
sudo sysctl -w net.ipv4.conf.all.route_localnet=1 sudo iptables -t nat -A PREROUTING -i enp0s3 -p tcp -d 192.168.1.11 --dport 3306 -j DNAT --to-destination 127.0.0.1:3306
Смотрите также мои статьи:
IPTables правила для MySQL
Установка и настройка MySQL сервера на Ubuntu