Локальное соединение Docker заблокировано UFW
ситуация
Я пытаюсь научиться использовать докер на моей локальной машине. Локальный компьютер настроен на маршрутизацию трафика только через 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 ответ
Я нашел решение своей проблемы.
Решение
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. Вы можете прочитать больше о том, как я нашел эту маску здесь.
Это дает нам всю информацию, необходимую для написания правила. Если вы публикуете контейнер на другом порту, вы можете проверить номер порта и протокол, выполнив следующие действия:
- Найдите идентификатор вашего контейнера
docker container ls
- Найдите порт вашего контейнера
docker container port {id}