Как правильно натянуть презерватив
Вот поставил ты docker, запустил на нем контейнер, пробросил порты, збс! Только вот есть одно НО. Проброшенные порты торчат жопой наружу и любой желающий может получить к ним доступ.
Хуйня! У меня например на хостовой машине стоит nginx, который прокси-пасит по урлам на нужные приложения, например:
curl https://bashdays.ru/vault/
И оно проксирует на localhost:8002, на этом порту крутится контейнер с vault hashicorp.
Но если сделать так:
curl XXX.XXX.XXX.XXX:8002
Ты сразу попадешь в контейнер, минуя nginx и все его правила. Говно!
Напрашивается iptables, но в связке с docker это то еще приключение.
Есть решение гораздо изящнее. Рассмотрим пример с gitea.
Это урезанный docker-compose.yml:
version: "3"
networks:
gitea:
external: false
services:
server:
image: gitea/gitea:latest
networks:
- gitea
volumes:
- gitea:/data
ports:
- "127.0.0.1:3000:3000"
- "127.0.0.1:2221:22"
Смотрим секцию с портами и видим там биндинг на 127.0.0.1. Вот это оно и есть. То есть ты и порты пробрасываешь на хостовую машину и наружу ими не светишь.
Nginx на хостовой машине отлично сходит на 127.0.0.1:3000, но вот если снова выполнить:
curl XXX.XXX.XXX.XXX:3000
То тебе покажут письку!
Вроде элементарно, но как оказалось дохуя специалистов этого не знают и продолжают трахаться с iptables.
И да, оказывается многие (в основном деды) не знают, что docker-compose (тот что бинарник) это легаси и файлики docker-compose.yml теперь можно запускать так:
docker compose up -d
А вообще если у тебя всё в контейнерах крутится, выкинь nginx и замени на traefik и никакие порты по умолчанию жопой наружу торчать не будут + автоматическое получение SSL для доменов.
Пользуйтесь!








Комментарии