我在 Digital Ocean 上有一台伺服器,我用它來部署多個 docker 容器,並使用反向代理將它們託管在 Nginx 上。
我有 2 個網域連結到我的伺服器(單一公用 IP)。我們將它們命名為domain1.com 和domain2.com
現在我有2個服務在docker上運行,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,連接會正常工作,但我不希望這樣做。我希望每個網域只能由分配給它們的服務存取。
例如,從外部遠端登入domain1.com:5432應該可以工作,但是從外部遠端登入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>
你可以做同樣的事情Postgres。
編輯 1:自您上次評論以來:
server{
listen 3306;
server_name domain2.com;
return 403;
}
您可以反之亦然來阻止流量nginx等級;但是如果你想完全阻止流量,這樣它就不會被核心處理,例如 telnet 將顯示連線被拒絕,你必須在第3層和iptables。