Tengo un servidor en Digital Ocean y lo estoy usando para implementar múltiples contenedores acoplables y uso servidores proxy inversos para alojarlos en Nginx.
Tengo 2 dominios vinculados a mi servidor (IP pública única). Llamémoslos dominio1.com y dominio2.com
Ahora tengo 2 servicios ejecutándose en Docker, Postgres (puerto 5432) y MySQL (puerto 3306).
Configuré servidores proxy inversos para traducir domain1.com a localhost:5432 y domain2.com a 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;
}
}
Lo que me molesta aquí es que si intento acceder a domain1.com:3306, la conexión funciona y no quiero. Quiero que cada dominio sea accesible únicamente mediante el servicio que se les ha asignado.
Por ejemplo, un telnet a dominio1.com:5432 desde el exterior debería funcionar, pero un telnet a dominio2.com:3306 no.
Puede ayudarme alguien, por favor ?
Respuesta1
Tienes que hacer tuMySQLinstancia para escuchar localmente (host del contenedor), por lo que los usuarios finales no podrán acceder a ella desde fuera, solo nginx y otros procesos locales pueden hacerlo.
Entonces, para esto solo tienes que reconstruir tu imagen con la configuración correcta demi.cnf:
FROM mysql
COPY custom.cnf /etc/mysql/my.cnf
O sin reconstruir la imagen (antes de ejecutar):
docker run -v <path_to_custom.cnf>:/etc/mysql/conf.d
Dóndemi.cnfdebe contener la siguiente configuración:
bind-address=<host_ip>
Puedes hacer lo mismo paraPostgres.
EDITAR 1: Desde su último comentario:
server{
listen 3306;
server_name domain2.com;
return 403;
}
Puedes hacerlo al revés para bloquear el tráfico ennginxnivel; pero si desea bloquear totalmente el tráfico para que no sea procesado por el kernel, por ejemplo, telnet mostrará conexión rechazada, debe hacerlo enCapa 3coniptables.