如何用 Nginx 代理 MySQL 连接,并限制可访问IP?

共 4432字,需浏览 9分钟

 ·

2023-08-07 17:34




点击关注公众号,Java干货及时送达👇





我们的生产环境基本上都部署在云服务器上,例如应用服务器、MySQL服务器等。如果MySQL服务器直接暴露在公网,就会存在很大的风险,为了保证数据安全,MySQL服务器的端口是不对外开放的。


好巧不巧,线上业务遇到bug了,开发的小伙伴需要远程连接MySQL来查看数据,那应该怎么办呢?


我们可以通过Nginx代理(“跳板机”)来进行连接。


2.Nginx代理连接


要实现对连接的代理转发,我们需要一台服务器并安装Nginx,且与MySQL服务器处于一个内网之中,内网之间可以访问。


其次,我们需要用到ngx_stream_core_module模块,该模块不是默认构建的,我们需要在configure时添加--with-stream来进行构建。


添加过程可以参照【Nginx基本命令&不停机版本升级】一文进行,我们这里不再赘述。


既然要用到ngx_stream_core_module模块,首当其冲,是看看其提供的指令,我们才知道怎么来进行配置。


1)stream


该指令定义了stream服务器。与http块平级,定义在main块中。





  • 作用域:main





  • 语法:stream {...}




示例:


 stream {
     server {
         ......
     }
 }

2)server


该指令定义一个虚拟主机,与http块中的server类似。我们可以在stream块中定义多个server块。





  • 作用域:stream





  • 语法:server {...}




stream {
     server {
         ......
     }
     server {
         ......
     }
 }

3)listen


该指令定义虚拟主机server要监听的socket的地址和端口。





  • 作用域:server





  • 语法:listen address:port;




示例:


listen 127.0.0.1:3306;
 listen *:3306;
 # 效果与listen *:3306一样
 listen 3306;
 listen localhost:3306;

4)配置示例


MySQL服务器,端口3306(单机环境)


stream  {
     server {
         listen 3306;
         proxy_pass 192.168.110.101:3306;
     }
 }

MySQL服务器,端口3306(集群环境)


stream  {
     upstream mysql_socket {
         server 192.168.110.101:3306;
     }
     server {
             listen 3306;
             proxy_pass mysql_socket;
     }
 }

此时,我们就可以通过例如Navicat等客户端进行连接。


3.限制访问IP


实现了对连接的代理,所有人都可以通过访问Nginx来连接MySQL服务器,解决了外网无法连接的问题。


为了更进一步的缩小访问范围,保证数据安全,我们可以限制只有公司网络的IP地址可以通过Nginx进行连接。


Nginx提供了ngx_stream_access_module模块,其指令非常简单,仅包含allow和deny指令。


1)allow


该指令设置指定的IP允许访问。可以和deny指令配合使用





  • 作用域:stream, server





  • 语法:allow address | CIDR | unix: | all;




示例:


 # 允许192.168.110.1访问
 allow 192.168.110.1;
 
 # 允许192.168.110.1到192.168.255.254
 allow 192.168.110.0/16;
 
 # 允许192.168.110.1到192.168.110.254
 allow 192.168.110.0/24;
 
 # 允许所有的IP访问
 allow all;

2)deny


该指令设置指定的IP禁止访问。可以和allow指令配合使用。





  • 作用域:stream, server





  • 语法:deny address | CIDR | unix: | all;




# 禁止192.168.110.1访问
 deny 192.168.110.1;
 
 # 禁止192.168.110.1到192.168.255.254
 deny 192.168.110.0/16;
 
 # 禁止192.168.110.1到192.168.110.254
 deny 192.168.110.0/24;
 
 # 禁止所有的IP访问
 deny all;

3)配置示例


禁止所有的IP访问,192.168.110.100除外。


allow 192.168.110.100;
 deny all;


Tips:如果指定了allow,需要配合deny使用,否则就是允许所有的IP地址访问。



4.综合案例


只允许192.168.110.100通过Nginx连接MySQL服务器。


stream  {
     allow 192.168.110.100;
     deny all;
     server {
         listen 3306;
         proxy_pass 192.168.110.101:3306;
     }
 }





来源:toutiao.com/article/7234104886726705716















公司新来了一个同事,把权限系统设计的炉火纯青!


Docker 入门终极指南,详细版!别再说不会用 Docker 了!


一行 log 日志,结果引发了 P1 的线上事故





最近面试BAT,整理一份面试资料Java面试BATJ通关手册,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。

获取方式:点“在看”,关注公众号并回复 Java 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。










浏览 715
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报