#docker #ufw
#docker #ufw
Вопрос:
У меня есть сервер разработки с этой конфигурацией UFW:
$ sudo ufw status
Status: active
To Action From
-- ------ ----
22/tcp LIMIT Anywhere
22/tcp (v6) LIMIT Anywhere (v6)
123/udp ALLOW OUT Anywhere
DNS ALLOW OUT Anywhere
80/tcp ALLOW OUT Anywhere
443/tcp ALLOW OUT Anywhere
22/tcp ALLOW OUT Anywhere
123/udp (v6) ALLOW OUT Anywhere (v6)
DNS (v6) ALLOW OUT Anywhere (v6)
80/tcp (v6) ALLOW OUT Anywhere (v6)
443/tcp (v6) ALLOW OUT Anywhere (v6)
22/tcp (v6) ALLOW OUT Anywhere (v6)
Моя проблема в том, что это также блокирует внутренний трафик из Docker.
Я запускаю контейнер Docker, который сопоставляется 8000:8000
http
, и если я отключу UFW, я смогу отправлять запросы, как и ожидалось. Однако, когда включен UFW, я не могу достичь порта 8000 даже внутренне.
Как мне разрешить этот трафик для внутреннего использования? Я хочу получить доступ через ssh -L 8000:127.0.0.1:8000 example.com
, поэтому я не хочу открывать порт 8000 для внешнего доступа.
Обновить:
Думая, что проблема может заключаться в том, что UFW также применяет правила к интерфейсу обратной связи, я обновил свое правило этими новыми правилами:
To Action From
-- ------ ----
Anywhere on lo ALLOW Anywhere
Anywhere on 127.0.0.1 ALLOW Anywhere
Anywhere (v6) on lo ALLOW Anywhere (v6)
Anywhere (v6) on 127.0.0.1 ALLOW Anywhere (v6)
Anywhere ALLOW OUT Anywhere on lo
Anywhere ALLOW OUT Anywhere on 127.0.0.1
Anywhere (v6) ALLOW OUT Anywhere (v6) on lo
Anywhere (v6) ALLOW OUT Anywhere (v6) on 127.0.0.1
Это не решает проблему.
Ответ №1:
ufw allow from <some_address> to any app <app_name>
На странице руководства указано не вводить номер порта:
Вы не должны указывать протокол ни с одним синтаксисом, а с расширенным синтаксисом используйте app вместо предложения port . Вероятно, это означает, что он позволит <app_name>
использовать любой порт, который ему нужен
Другие команды, которые могут быть полезны:
ufw app info <app_name>
В котором указана информация о <app_name>
профиле пользователя.
ufw app update <app_name>
Который обновляет <app_name>
профиль. Вы можете использовать all для обновления всех профилей приложений.
Вы можете использовать:
ufw app update --add-new <app_name>
команда для добавления нового профиля <app_name>
и его обновления, следуя правилам, которые вы установили ufw app default <policy>
.
Профили приложений хранятся в /etc/ufw/applications.d
и иногда /etc/services
.
Для получения дополнительной информации, чтобы просмотреть справочную страницу для ufw
man ufw
Обновление: Docker использует частный интерфейс под названием docker0
, вы можете разрешить доступ для docker к вашей хост-системе.
Вы можете использовать информацию в интерфейсе для создания правила, например, ufw allow out on docker0 from 172.17.0.0/16
Используя порт, вы можете сделать это правило более строгим, используя следующую команду, например
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
This interface routes traffic through 172.17.xxx.xxx
Комментарии:
1. Разве это не откроет порты для доступа извне? Они должны быть доступны только изнутри машины.
2. Если вы используете 127.0.0.1, он должен оставаться внутренним, поскольку это адрес обратной связи.
3. Я не понимаю, как это поможет. «Приложения» — это просто псевдонимы номеров портов, и я не заинтересован в открытии для каждого порта.