По умолчанию хост Docker отбрасывает сетевые пакеты, нацеленные на его контейнер, если эти пакеты не являются ответами на соединения, инициированные из контейнера. Инициирование подключения к контейнеру извне работает только для опубликовано порты (через NAT). Однако процесс, запущенный на хосте, по-прежнему может инициировать соединение, используя внутренний IP-адрес контейнера.
Я не нашел «официального» способа запретить локальным процессам подключаться к контейнерам. Проанализировав iptables
правил Docker, я пришел к выводу, что простейший способ добиться этого - это:
iptables -A OUTPUT -j DOCKER-ISOLATION-STAGE-2
DOCKER-ISOLATION-STAGE-2
просто включает правила отбрасывания всех пакетов, нацеленных на любой из внутренних интерфейсов Docker:
Chain DOCKER-ISOLATION-STAGE-2 (4 references)
pkts bytes target prot opt in out source destination
0 0 DROP all -- any br-dabc893185cc anywhere anywhere
0 0 DROP all -- any docker0 anywhere anywhere
0 0 DROP all -- any br-e6c0c86193e5 anywhere anywhere
0 0 RETURN all -- any any anywhere anywhere
Быстрый тест подтвердил, что это делает то, что я хочу, и я не заметил никаких побочных эффектов. Могло ли это иметь непредвиденные непредвиденные последствия? Есть лучший способ сделать это?
Я использую только мост сети.