За последние 24 часа нас посетили 18096 программистов и 1669 роботов. Сейчас ищут 2037 программистов ...

Открыть порт MySQL для определенного адреса

Тема в разделе "Настройка веб-сервера", создана пользователем artoodetoo, 1 мар 2016.

  1. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.116
    Симпатии:
    1.244
    Адрес:
    там-сям
    Не селен во всяких iptables, выручайте.
    Задача: открыть доступ к MySQL извне, но только с адреса нужного мне сервера. А лучше с пары адресов, чтобы я еще с локалки мог потестить.

    Я в курсе, конечно, про правила MySQL
    Код (PHP):
    1. GRANT … TO user@address
    мне интересны именно настройки файрвола. И чтобы они не слетели после перезагрузки.
    Debian Wheezy, MariaDB 10

    Заранее спасибо!

    P.S. про ssh -L я в курсе. мне нужен девственный доступ не туннелированный.
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Код (PHP):
    1. iptables -A INPUT -p tcp --dport 8000 -s 1.2.3.-j ACCEPT
    2. iptables -A INPUT -p tcp --dport 8000 -j DROP
    где 8000 - твой порт мускула (я правильно понял что там не будет подмены номера порта?), ну а 1234 - тот адрес, которому можно. добавь вторую-третью-энную строку для расширения списка хороших адресов.

    а вот по поводу сохранения - у тебя как сейчас устроена работа фаервола? или ты там еще не ковырялся?
     
  3. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.116
    Симпатии:
    1.244
    Адрес:
    там-сям
    Подмена номера допустима, наверное даже желательна. Сейчас слушается 127.0.0.1:3306

    Щаз попробую твой рецепт…

    Добавлено спустя 7 минут:
    Подставил свои цифры: 3306 и внешний IP моей локалки

    mysql -h адрес-мускульного-сервера -u myuser -pmypassword
    Код (PHP):
    1. ERROR 2003 (HY000): Can't connect to MySQL server on 'адрес-мускульного-сервера' (10061)
    Добавлено спустя 1 минуту 21 секунду:Ну и telnet-ом попробовал: Connection refused
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ну я перед тем как тебе слить - на своих кошках проверил. ну чтоб фуфлом не быть и всё такое))))
    iptables-save что показывает?
     
  5. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.116
    Симпатии:
    1.244
    Адрес:
    там-сям
    Ganzal, а слушать при этом надо внешний интерфейс, а не 127.0.0.1, я правильно понимаю? Твои правила это не проброс, а фильтр пакетов, да?

    Добавлено спустя 1 минуту 57 секунд:
    Код (PHP):
    1. # Generated by iptables-save v1.4.21 on Tue Mar  1 08:42:12 2016
    2. *filter
    3. :INPUT ACCEPT [451:43257]
    4. :FORWARD ACCEPT [0:0]
    5. :OUTPUT ACCEPT [319:430339]
    6. :fail2ban-ssh - [0:0]
    7. -A INPUT -p tcp -m multiport --dports #### -j fail2ban-ssh
    8. -A INPUT -s мой-айпишник/32 -p tcp -m tcp --dport 3306 -j ACCEPT
    9. -A INPUT -p tcp -m tcp --dport 3306 -j DROP
    10. -A fail2ban-ssh -RETURN
    11. COMMIT
    12. # Completed on Tue Mar  1 08:42:12 2016
    13.  
     
  6. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    да, мускулу желательно изначально слушать тот интерфейс, на котором ты вешаешь фильтр.
     
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.116
    Симпатии:
    1.244
    Адрес:
    там-сям
    поменял в my.conf bind-address на 0.0.0.0 и получил
    Код (PHP):
    1. ERROR 1045 (28000): Access denied for user 'я'@'мой-айпишник' (using password: YES)
    это уже внушает надежду! надо проверить как с других хостов…

    Добавлено спустя 14 минут 29 секунд:
    Да, всё ок: с указанного хоста заходит, а с неуказанного Can't connect to MySQL server.
    Спасибо!
     
  8. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    пожалуйста!
     
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.116
    Симпатии:
    1.244
    Адрес:
    там-сям
    Для полноты шпаргалки дописываю инструкцию:
    Если нам надо разрешить доступ к серверу MySQL не только с локального (по отношению к нему) веб-сервера, но и с каких-то адресов извне, делаем так:

    1. Начинаем слушать внешний сетевой интерфейс. Для этого проверяем, что в my.conf у нас как-то так:
    Код (PHP):
    1. #bind-address           = 127.0.0.1
    2. #skip-networking
    Т.е. не биндимся на локальный IP, а слушаем всё. А раньше слушал, как видите, локальный адрес. Запрета сетевой активности нет.
    Закомментировать bind-address это то же самое, что написать bind-address = 0.0.0.0
    Если бы я просто изменил 127.0.0.1 на IP внешнего сетевого интерфейса, мне бы пришлось переписывать все конфиги сайтов, в которых указан 127.0.0.1 )))

    2. Настраиваем сетевой фильтр:
    Код (PHP):
    1. iptables -A INPUT -p tcp --dport 3306 -s 1.2.3.-j ACCEPT
    2. iptables -A INPUT -p tcp --dport 3306 -j DROP
    Здесь 1.2.3.4 это адрес того хоста, которому разрешен доступ. Повторяем первую строчку для каждого из разрешенных адресов.

    3. Настраиваем фильтр MySQL:
    От имени рута или другого суперпользователя разрешаем доступ конкретного пользователя к конкретной базе:
    Код (PHP):
    1. GRANT ALL PRIVILEGES ON 'mydatabase'.* TO 'myuser'@'1.2.3.4' IDENTIFIED BY 'mypassword';
     
  10. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    это ПОЛНЫЙ доступ. в целях безопасности всё же лучше лимитировать глобальные привилегии этой учетки, и раздать её еще и конкретные права на конкретные базы/таблицы.
     
  11. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.116
    Симпатии:
    1.244
    Адрес:
    там-сям
    на конкретную базу же
    ON 'mydatabase'.*
     
  12. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а, блин, этого слона я и не приметил)
     
  13. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.116
    Симпатии:
    1.244
    Адрес:
    там-сям
    Ты можешь пояснить как эти iptables работают? Почему, например, они НЕ блокируют локальный доступ, ведь про 127.0.0.1 здесь ничего не сказано.
     
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я правила так профигариваю из консоли
    Код (PHP):
    1. firewall-cmd --zone=public --add-port=80/tcp --permanent
    2. firewall-cmd --zone=public --add-port=22/tcp --permanent
    3. firewall-cmd --reload
    только, да, это не iptables
     
  15. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.116
    Симпатии:
    1.244
    Адрес:
    там-сям
    Добавлю ещё, что из коробки правила iptables не сохраняются и после перезагрузки наши добавочки пропадут. Но под Debian есть пакет iptables-persistent, который при ахтунге сохраняет, а при загрузке восстанавливает правила.
    Код (PHP):
    1. sudo apt-get install iptables-persistent
    Дело сделано!

    Добавлено спустя 4 минуты 52 секунды:
    Я кое-где использовал arno-iptables-firewall, он сохраняет правила, облегчает составление белых списков, но это только малый кусочек чего могут iptables.
    Боюсь, что ручные правила могут затираться сгенеренными из визарда. Наверное надо либо всё через магию, либо всё ручками.
     
  16. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    возможно это связано с тем что дефолтные политики у тебя ACCEPT стоят. у меня на серверах дефолтны DROP, а потом идет список разрешений в т.ч. и для lo. я в жизни никогда не задумывался о блокировках на лупбэке :D