Redian新闻
>
Nginx 代理 MySQL 连接,并限制可访问 IP

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

公众号新闻

链接:https://www.toutiao.com/article/7234104886726705716


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.1192.168.255.254
 allow 192.168.110.0/16;
 
 # 允许192.168.110.1192.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.1192.168.255.254
 deny 192.168.110.0/16;
 
 # 禁止192.168.110.1192.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;
     }
 }

END

官方站点:www.linuxprobe.com

Linux命令大全:www.linuxcool.com

刘遄老师QQ:5604215

Linux技术交流群:2636170

(新群,火热加群中……)

想要学习Linux系统的读者可以点击"阅读原文"按钮来了解书籍《Linux就该这么学》,同时也非常适合专业的运维人员阅读,成为辅助您工作的高价值工具书!


微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
MyBatis 动态 SQL 最全教程,这样写 SQL 太爽了!4 种 MySQL 同步 ES 方案美好水乡功课:俄罗斯简史与文物遗存MySQL 之父:不要把一个优秀的开发者提升为管理者,那会是种资源浪费一网打尽总结 Mysql 的所有 Buffer在临海小镇做全麻手术SQL骚操作,一条SQL 统计近 7天、30天、全部的订单量重磅 |《开源数据库生态发展研究报告》发布 GreatSQL为MySQL5.7最佳替代方案!弃用 MySQL 后存储成本降低 85%,携程业务系统数据库升级技术实践“MySQL 之父”的 MariaDB 要完蛋了?叫停两款核心产品并裁员 28%MySQL 调整版本控制模型,发布首个创新版本 8.1.0阿里终面:10亿数据如何快速插入MySQL?为什么Uber的底层存储从Postgres换成MySQL了?为何在中国MySQL远比PostgreSQL流行MySQL 运维常用脚本为什么不建议在 Docker 中跑 MySQL ?MySQL到底是 join 性能好,还是in一下更快呢?聊聊即将到来的MySQL5.7停服事件中转MySQL中update“经典”的坑,这样写语句,直接劝退!技术同学必会的MySQL设计规约,都是惨痛的教训那些MySQL 8.0中的隐藏特性一文了解MySQL全新版本模型MySQL到TiDB:Hive Metastore横向扩展之路基于MySQL多通道主主复制的机房容灾方案“MySQL 之父”的 MariaDB 要完蛋了?叫停两款核心产品并裁员 28%,分析师:该行为无异于自毁长城MySQL binlog 三个典型的业务应用场景MySQL数据导入方案推荐Nginx 代理 MySQL 连接,并限制可访问IPVLDB顶会论文解读 | PolarDB MySQL高性能强一致集群核心技术详解MySQL 巨坑:永远不要在 MySQL 中使用 UTF-8!!生产环境遇到MySQL数据页损坏问题如何解决?DoltgreSQL发布,基于Git的PostgreSQL
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。