Nginx 代理 MySQL 连接,并限制可访问IP

1.前言

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

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

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

2.Nginx代理连接

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

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

既然要用到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;
     }
 }

文章来源:https://www.cnaaa.net,转载请注明出处:https://www.cnaaa.net/archives/9563

(0)
郭靖的头像郭靖
上一篇 2023年8月17日 下午5:35
下一篇 2023年8月22日 下午10:35

相关推荐

  • PHP编译安装时常见错误及解决办法

    1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. *27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. …

    2023年4月28日
    1.4K00
  • 宝塔部署java项目

    进入宝塔官方网站 url地址 https://www.bt.cn/download/linux.html 下滑看到安装命令(我这边使用的是centos7.8)复制相应脚本命令 Centos安装脚本 输入复制的命令 等待安装宝塔面板,粘贴点击回车即可 中间会输入一次确认是否安装 输入 y 回车 安装需要一小段时间,最后当出现有宝塔面板地址和账号密码的时候证明安…

    2023年4月3日
    1.2K00
  • Discuz! X 3.4, 更新PHP7.4后无法打开uc_server的解决方案!

    页面报错:Deprecated: Array and string offset access syntax with curly braces is deprecated in/www/wwwroot/***/uc_server/admin.php on line53 出现报错原因: PHP7.4不再支持使用大括号访问数组以及字符串的偏移 将53行修改为:

    2023年7月31日
    3.0K00
  • Tomcat日志切割工具 logrotate

    Tomcat日志切割工具 logrotate 在我们生产环境中经常遇到tomcat log清理的问题,曾经做过实验通过重定向的方式把日志清空,但是发现日志tomcat里面的catalina.out不输出日志了。这时候我们可以考虑一下日志管理工具Logrotate 一、日志工具Logrotate简介 二、Logrotate运行机制 系统会定时运行logrota…

    2023年3月24日
    1.0K00
  • 解决Composer Installing dependencies from lock file

    1、问题描述 2、原因 这是因为不匹配composer.json要求的版本。提示我的PHP 7版本太高,不符合composer.json需要的版本,但是在PHP 7下应该也是可以运行的,composer可以设置忽略版本匹配。 3、解决方案 composer install –ignore-platform-reqs 或者 composer update -…

    2023年2月14日
    1.4K00

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

在线咨询: QQ交谈

邮件:712342017@qq.com

工作时间:周一至周五,8:30-17:30,节假日休息

关注微信