Локальное соединение Docker заблокировано UFW - PullRequest
0 голосов
/ 06 января 2019

Положение

Я пытаюсь научиться использовать докер на моей локальной машине. Локальный компьютер настроен на маршрутизацию трафика только через VPN. Политика UFW по умолчанию - DENY весь входящий и исходящий трафик (кроме как через VPN).

Проблема

Когда я пытаюсь запустить Docker-контейнер docker container run -p 80:80 nginx, я не могу подключиться к контейнеру nginx, используя localhost в моем браузере .

Однако я могу подключиться к локальному контейнеру nginx через telnet

$ telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.

Причина, по которой я знаю, что это может быть вызвано UFW, заключается в том, что, как только я отключаю UFW, я могу без проблем подключиться к localhost в браузере.

Вопрос

Как мне подключиться к локальному контейнеру nginx из моего браузера, если UFW настроен на запрет всех соединений?

1 Ответ

0 голосов
/ 06 января 2019

Я нашел решение своей проблемы.

Решение

ufw allow out on docker0 from 172.17.0.0/16

Поскольку я знаю конкретный порт, который использует nginx, я также могу сделать это правило более строгим, выполнив

ufw allow out on docker0 from 172.17.0.0/16 port 80 proto tcp

Объяснение

Docker создает новый интерфейс для контейнеров, и вы можете увидеть его, запустив ifconfig:

docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:a4:5e:e9:9c  txqueuelen 0  (Ethernet)
        RX packets 87  bytes 17172 (17.1 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 117  bytes 14956 (14.9 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Этот интерфейс маршрутизирует трафик через 172.17.xxx.xxx. Вы можете прочитать больше о том, как я нашел эту маску здесь .

Это дает нам всю информацию, необходимую для написания правила. Если вы публикуете контейнер на другом порту, вы можете проверить номер порта и протокол, выполнив следующие действия:

  1. Найдите идентификатор вашего контейнера docker container ls
  2. Найдите порт вашего контейнера docker container port {id}
...