Вопрос Можно ли ограничить подключение к базе данных в контейнере Docker на конкретном интерфейсе на Ubuntu 16?


У меня есть база данных MySQL на сервере (я использую Percona в докер контейнер) с несколькими сетевыми интерфейсами.

Моя система Ubuntu 16.04.2 LTS,

ifconfig

eth0      Link encap:...
          inet addr:95.*.*.*

eth1      Link encap:...
          inet addr:10.*.*.*

Можно ли ограничить доступ с помощью ufw в базу данных по eth0 интерфейса, но eth1?

Таким образом, он сможет получить доступ к БД с помощью 10.*.*.*:6603 и не сможет получить доступ с помощью 95.*.*.*:6603,

Обновление (04.03.2017):

Я использовал эту команду для добавления правила:

sudo ufw deny in on eth0 to any port 6603 from any proto tcp

Положение дел:

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
6603/tcp on eth0           DENY        Anywhere
6603/tcp (v6) on eth0      DENY        Anywhere (v6)

Но я, несмотря на правило отказа, могу войти в свою БД с помощью MySQL клиент.

Но 6603 порт по-прежнему открыт:

nmap -p 6603 95.85.54.75

Starting Nmap 7.01 ( https://nmap.org ) at 2017-03-04 16:14 UTC
Nmap scan report for 95.85.54.75
Host is up (0.0012s latency).
PORT     STATE SERVICE
6603/tcp open  unknown

Nmap done: 1 IP address (1 host up) scanned in 0.65 seconds

2
2018-03-03 08:17


происхождения


Есть ли это работа для вас? - Kevin
@Kevin, я бы опубликовал это как ответ и процитировал соответствующую информацию, а также отредактировал информацию в соответствии со своим сценарием - asmith
@Kevin Я пробовал ваш совет, но порт все еще открыт. Можете ли вы помочь мне найти ошибку в моем правиле или дать мне совет для решения моей проблемы (подробности см. В разделе вопросов)? - Roman Cherepanov


ответы:


Вместо того, чтобы использовать ufw, вы можете привязать MySQL к одному интерфейсу.

Файл конфигурации mysqld (обычно на /etc/mysql/my.cnf) имеет опцию, называемую bind-address который позволяет вам установить один IP-адрес (например, 10.0.4.25, например), чтобы заставить MySQL прослушивать только этот интерфейс.

Однако это не пуленепробиваемое решение, поскольку на хостах, использующих слабая модель хоста (например, некоторые дистрибутивы Linux) можно подключиться к службам, связанным на одном интерфейсе с другим.


1
2018-03-03 08:42



Это не обязательно лучше. Linux считает, что адреса IPv4 принадлежат хосту, а не принадлежат интерфейсу, поэтому привязка к адресу не автоматически привязывается к интерфейсу. (Последнее возможно, но нуждается в отдельном sockopt.) Поэтому, если кто-то находится на одной и той же ссылке, например. другой сервер 146.x.x.x, то они все равно могут легко подключаться даже к службам, связанным с адресом другого интерфейса. Между тем правило брандмауэра будет всегда Работа. - grawity
@grawity Трудно тебе поверить. - jcbermu
Не был бы первым, кто сказал бы это, и все же я успешно кашель использовали эту ошибку в прошлом ... Взгляните на «сильную модель хоста» (предпочтительнее для IPv6) и «слабая модель хоста» (общая для IPv4) для получения дополнительной информации. (По умолчанию Linux будет даже отвечать на запросы ARP на «неправильном» интерфейсе, вы можете настроить это с помощью arp_filter / arp_ignore, но даже тогда добавленный вручную маршрут или запись ARP все еще позволяют подключения.) - grawity
@grawity Вы правы. Я не знал об этом. это правда, что Ты узнаешь что-то новое каждый день, Я изменил свой ответ, чтобы включить это. - jcbermu


Проблема заключалась в том, что Docker сжимает правила брандмауэра.

Согласно этим сообщениям (Опасности UFW + Docker, Как установить Docker 1.12+, чтобы НЕ мешать IPTABLES / FirewallD):

  • Я создал файл /etc/docker/daemon.json с содержанием:

    {
        "iptables": false
    }
    
  • Я добавил правило для ufw:

    sudo ufw allow in on eth1 to any port 6603 
    

    чтобы разрешать соединения только с ufw.

  • перезагрузите демон докеров

    sudo service docker stop
    sudo service docker start
    

Заметка: это исправление работает только для контейнеров, созданных с помощью docker run..., Для контейнеров, созданных с помощью Docker Swarm, это исправление не работает.


1
2018-03-04 18:17