Как я могу настроить свой брандмауэр для работы с Докером?

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

NETWORK ID          NAME                DRIVER              SCOPE
4d4b5e752963        bridge              bridge              local               
c387eb42698a        project_default     bridge              local               
6818c0eb94bf        host                host                local               
f7e4ed6c05a2        none                null                local  

Этот мост (раздражающе) всегда имеет случайным образом сгенерированный идентификатор, который изменяется каждый раз, когда я перезапускаю своего Докера, Составляют установку:

br-c387eb42698a Link encap:Ethernet  HWaddr 02:42:29:95:fd:2c  
          inet addr:172.18.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:29ff:fe95:fd2c/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:405753 errors:0 dropped:0 overruns:0 frame:0
          TX packets:530699 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:85147217 (85.1 MB)  TX bytes:75260996 (75.2 MB)

Короче говоря, мне нужно следующее:

  • Любой хост на br-c387eb42698a (или независимо от того, что сетевое имя) к порту доступа 1234 на моей локальной машине (удобно 172.18.0.1)
  • Моя машина, чтобы смочь получить доступ к любому порту на любом хосте на той подсети. (значение по умолчанию)
  • Мир, чтобы никогда не смочь получить доступ к любому порту от подсети или порту 1234.

Идеально, решение здесь работало бы агностическим IP способом, таким образом, что оно не зависит от моста, идущего 172.18.0.0/24 подсеть, и при этом это не повредило бы или позволило бы утечки данных, если я подключен к сети, которая, оказывается, содержит 172.18.0.0/24 подсеть.

Самая легкая вещь, о которой я могу думать, состояла бы в том, чтобы израсходовать имя интерфейса и установить правила UFW вокруг этого, но я не могу действительно сделать этого, поскольку мой интерфейс постоянно изменяется.

Как я могу сделать это? В то время как я предпочел бы выполнять в этом чистом ufw (или iptables при необходимости), я открыт для решений, которые влекут за собой Докера конфигурирования, чтобы всегда присвоить персистентный идентификатор (или даже пользовательское имя?) к интерфейсу моста.

4
задан 10 April 2017 в 23:34

2 ответа

Это не возможно в ванильном UFW из-за того, что имя интерфейса находится в постоянном состоянии unguessability. Для установки чего-то вроде этого вручную определенная сеть должна быть создана. Короче говоря, можно использовать опции драйвера из Докера bridge в составить конфигурации для создания пользовательская сеть . Это посмотрит что-то как:

networks:
    my_bridge:
        driver: bridge
        driver_opts:
            com.docker.network.bridge.name: my-bridge

Отсюда, конфигурация моста может быть добавлена к каждому сервису в составить файле:

myimage:
    image: myimage:1.0
    ports:
        - "2580:2580"
    networks:
        - my_bridge

Затем на следующий запуск Составить системы, новая сеть будет создана с именем собственным:

my-bridge Link encap:Ethernet  HWaddr 11:22:33:44:55:66  
      inet addr:172.18.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
      inet6 addr: fe80::42:1122:3344:5566/64 Scope:Link
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:11 errors:0 dropped:0 overruns:0 frame:0
      TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:0 
      RX bytes:788 (788.0 B)  TX bytes:695 (695.0 B)

Оттуда, добавляя правила UFW позволить соединение с портом 1234 тривиальны:

ufw allow in on my-bridge from any to any port 1234

И внезапно, все работает отлично!

6
ответ дан 1 December 2019 в 09:13

Для интеграции принятого ответа можно также использовать команду докера для создания сети за пределами докера - сочините:

sudo docker network create -d bridge -o com.docker.network.bridge.name=my-bridge my_bridge

После этого можно осмотреть издание сетей

ip link show

Теперь, в Вашем составлять файлы можно просто перенаправить стандартную сеть или определить любую сеть, Вам нравится повторно отображать ее на уже существующую

version: "3"
services:
  test:
    image: nginx:alpine
    ports:
      - "80:80"
networks:
  default:
    external:
      name: my_bridge
1
ответ дан 1 December 2019 в 09:13

Другие вопросы по тегам:

Похожие вопросы: