У меня есть сервер на Digital Ocean, и я использую его для развертывания нескольких Docker-контейнеров и использую обратные прокси-серверы для их размещения на Nginx.
У меня есть 2 домена, привязанных к моему серверу (один публичный IP). Давайте назовем их domain1.com и domain2.com
Теперь у меня на Docker запущено 2 сервиса: Postgres (порт 5432) и MySQL (порт 3306).
Я настроил обратные прокси-серверы для перевода domain1.com в localhost:5432 и domain2.com в localhost:3306:
server {
listen 80;
server_name domain1.com;
location / {
proxy_pass http://localhost:5432;
}
}
server {
listen 80;
server_name domain2.com;
location / {
proxy_pass http://localhost:3306;
}
}
Меня беспокоит то, что если я пытаюсь получить доступ к domain1.com:3306, соединение работает, а мне не нужно. Я хочу, чтобы каждый домен был доступен только назначенному ему сервису.
Например, telnet-подключение к domain1.com:5432 извне должно работать, а telnet-подключение к domain2.com:3306 — нет.
Может ли кто-нибудь помочь?
решение1
Вы должны сделать свойmysqlэкземпляр будет прослушиваться только локально (хост контейнера), поэтому конечные пользователи не смогут получить к нему доступ извне, это могут сделать только nginx и другие локальные процессы.
Так что для этого вам нужно просто перестроить ваш образ с правильной конфигурациеймой.cnf:
FROM mysql
COPY custom.cnf /etc/mysql/my.cnf
Или без пересборки образа (перед запуском):
docker run -v <path_to_custom.cnf>:/etc/mysql/conf.d
Гдемой.cnfдолжен содержать следующую конфигурацию:
bind-address=<host_ip>
Вы можете сделать то же самое дляПостгрес.
EDIT 1: С момента вашего последнего комментария:
server{
listen 3306;
server_name domain2.com;
return 403;
}
Вы можете сделать это наоборот, чтобы заблокировать трафик наnginxуровне; но если вы хотите полностью заблокировать трафик, чтобы он не обрабатывался ядром, например, telnet покажет, что соединение отклонено, вам нужно сделать это наСлой 3сiptables.