我在 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>
你也可以对Postgres。
编辑 1:自您上次评论以来:
server{
listen 3306;
server_name domain2.com;
return 403;
}
你也可以反过来阻止nginx级别;但如果你想完全阻止流量,这样它就不会被内核处理,例如 telnet 将显示连接被拒绝,你必须在第 3 层和iptables。