Ich habe einen Server auf Digital Ocean und verwende diesen, um mehrere Docker-Container bereitzustellen und sie mithilfe von Reverse-Proxys auf Nginx zu hosten.
Ich habe 2 Domänen mit meinem Server verknüpft (einzelne öffentliche IP). Nennen wir sie domain1.com und domain2.com
Jetzt laufen bei mir 2 Dienste auf Docker, Postgres (Port 5432) und MySQL (Port 3306)
Ich habe Reverse-Proxys eingerichtet, um domain1.com in localhost:5432 und domain2.com in localhost:3306 zu übersetzen:
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;
}
}
Was mich hier stört, ist, dass die Verbindung funktioniert, wenn ich versuche, auf domain1.com:3306 zuzugreifen, was ich nicht will. Ich möchte, dass jede Domäne nur über den ihr zugewiesenen Dienst zugänglich ist.
Beispielsweise sollte ein Telnet zu domain1.com:5432 von außen funktionieren, ein Telnet zu domain2.com:3306 jedoch nicht.
Kann jemand bitte helfen?
Antwort1
Sie müssen IhreMySQLInstanz, um nur lokal (Container-Host) zu lauschen, sodass Endbenutzer nicht von außen darauf zugreifen können; nur nginx und andere lokale Prozesse können dies.
Dazu müssen Sie lediglich Ihr Image mit der richtigen Konfiguration vonmeine.cnf:
FROM mysql
COPY custom.cnf /etc/mysql/my.cnf
Oder ohne das Image neu zu erstellen (vor dem Ausführen):
docker run -v <path_to_custom.cnf>:/etc/mysql/conf.d
Womeine.cnfsollte die folgende Konfiguration enthalten:
bind-address=<host_ip>
Dasselbe können Sie tun fürPostgres.
EDIT 1: Seit Ihrem letzten Kommentar:
server{
listen 3306;
server_name domain2.com;
return 403;
}
Sie können es umgekehrt machen, um den Verkehr zu blockieren aufnginxEbene; aber wenn Sie den Verkehr vollständig blockieren möchten, so dass er nicht vom Kernel verarbeitet wird, so dass beispielsweise Telnet eine abgelehnte Verbindung anzeigt, müssen Sie dies aufSchicht 3mitiptables.