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

打印 上一主题 下一主题

主题 850|帖子 850|积分 2552

来源:toutiao.com/article/7234104886726705716
1.前言

我们的生产环境基本上都部署在云服务器上,例如应用服务器、MySQL服务器等。如果MySQL服务器直接暴露在公网,就会存在很大的风险,为了保证数据安全,MySQL服务器的端口是不对外开放的。
好巧不巧,线上业务遇到bug了,开发的小伙伴需要远程连接MySQL来查看数据,那应该怎么办呢?
我们可以通过Nginx代理(“跳板机”)来进行连接。
推荐一个开源免费的 Spring Boot 实战项目:
https://github.com/javastacks/spring-boot-best-practice
2.Nginx代理连接

要实现对连接的代理转发,我们需要一台服务器并安装Nginx,且与MySQL服务器处于一个内网之中,内网之间可以访问。
其次,我们需要用到ngx_stream_core_module模块,该模块不是默认构建的,我们需要在configure时添加--with-stream来进行构建。
添加过程可以参照【Nginx基本命令&不停机版本升级】一文进行,我们这里不再赘述。
既然要用到ngx_stream_core_module模块,首当其冲,是看看其提供的指令,我们才知道怎么来进行配置。
1)stream

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

  • 作用域:main
  • 语法:stream
示例:
  1. stream {
  2.      server {
  3.          ......
  4.      }
  5. }
复制代码
2)server

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

  • 作用域:stream
  • 语法:server
  1. stream {
  2.      server {
  3.          ......
  4.      }
  5.      server {
  6.          ......
  7.      }
  8. }
复制代码
3)listen

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

  • 作用域:server
  • 语法:listen address:port;
示例:
  1. listen 127.0.0.1:3306;
  2. listen *:3306;
  3. # 效果与listen *:3306一样
  4. listen 3306;
  5. listen localhost:3306;
复制代码
4)配置示例

MySQL服务器,端口3306(单机环境)
  1. stream  {
  2.      server {
  3.          listen 3306;
  4.          proxy_pass 192.168.110.101:3306;
  5.      }
  6. }
复制代码
MySQL服务器,端口3306(集群环境)
  1. stream  {
  2.      upstream mysql_socket {
  3.          server 192.168.110.101:3306;
  4.      }
  5.      server {
  6.              listen 3306;
  7.              proxy_pass mysql_socket;
  8.      }
  9. }
复制代码
此时,我们就可以通过例如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;
示例:
  1. # 允许192.168.110.1访问
  2. allow 192.168.110.1;
  3. # 允许192.168.110.1到192.168.255.254
  4. allow 192.168.110.0/16;
  5. # 允许192.168.110.1到192.168.110.254
  6. allow 192.168.110.0/24;
  7. # 允许所有的IP访问
  8. allow all;
复制代码
2)deny

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

  • 作用域:stream, server
  • 语法:deny address | CIDR | unix: | all;
  1. # 禁止192.168.110.1访问
  2. deny 192.168.110.1;
  3. # 禁止192.168.110.1到192.168.255.254
  4. deny 192.168.110.0/16;
  5. # 禁止192.168.110.1到192.168.110.254
  6. deny 192.168.110.0/24;
  7. # 禁止所有的IP访问
  8. deny all;
复制代码
3)配置示例

禁止所有的IP访问,192.168.110.100除外。
  1. allow 192.168.110.100;
  2. deny all;
复制代码
Tips:如果指定了allow,需要配合deny使用,否则就是允许所有的IP地址访问。
4.综合案例

只允许192.168.110.100通过Nginx连接MySQL服务器。
  1. stream  {
  2.      allow 192.168.110.100;
  3.      deny all;
  4.      server {
  5.          listen 3306;
  6.          proxy_pass 192.168.110.101:3306;
  7.      }
  8. }
复制代码
近期热文推荐:
1.1,000+ 道 Java面试题及答案整理(2022最新版)
2.劲爆!Java 协程要来了。。。
3.Spring Boot 2.x 教程,太全了!
4.别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!
5.《Java开发手册(嵩山版)》最新发布,速速下载!
觉得不错,别忘了随手点赞+转发哦!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

祗疼妳一个

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表