Я пытаюсь сделать порт (который предоставляется docker-compose) на общедоступном IP-адресе доступным только для некоторых других моих IP-адресов. Мне все еще нужны другие порты для приема подключений с любых IP-адресов.
Я пробовал использовать ufw для этого, но, по-видимому, сам докер вносит некоторые изменения в iptables, которые я не смогу сделать обычным способом.
Одним из вариантов может быть использование обратного прокси (контейнер nginx \ traefik \ haproxy?) Для приложения, которое выполняет фильтрацию за вас.
Не уверен, насколько хорошо это переводится в UFW, но правила iptables для выполнения этих шагов включают что-то вроде:
iptables -I DOCKER-USER -i eth0 -s 10.0.0.0/24 -p tcp \
-m conntrack --ctorigdstport 8080 -j ACCEPT
iptables -I DOCKER-USER -i eth0 ! -s 10.0.0.0/24 -p tcp \
-m conntrack --ctorigdstport 8080 -j DROP
Вот подробности о частях этих команд:
DOCKER-USER
который докер будет предоставлять, выполнять все запросы и не изменять эту таблицу, как другие таблицы.DOCKER-USER
вместо добавления, потому что правило по умолчанию в конце этой таблицы - принимать все. Добавление правила после этого будет проигнорировано.eth0
, это внешний сетевой интерфейс. Часто вы не хотите блокировать запросы внутренне, с помощью обратной связи или между контейнерами.10.0.0.0/24
, или сеть класса C 10.0.0.*
. Все остальное к целевому порту блокируется вторым правилом.conntrack
и ctorigdstport
необходим для указания исходного порта назначения, также известного как опубликованный порт, а не порта контейнера. После того, как правила mangle изменили пакеты для связи с контейнером, порт, видимый iptables, будет портом контейнера, и несколько контейнеров могут прослушивать один и тот же порт внутри и публиковать на разных портах на хосте.