1、前言
在生产环境中,我们的应用服务器、MySQL服务器等通常都部署在云服务器上。为了数据安全,MySQL服务器的端口一般不会对外开放,因为直接暴露在公网会带来很大的风险。然而,线上业务出现bug时,开发人员需要远程连接MySQL来查看数据。这时,我们可以通过Nginx代理(俗称“跳板机”)来实现安全连接。
2、Nginx代理连接
要实现对MySQL连接的代理转发,我们需要一台安装了Nginx的服务器,并且这台服务器要与MySQL服务器处于一个内网中,以便它们之间可以相互访问。此外,我们还需要用到ngx_stream_core_module
模块,该模块不是默认构建的,需要在Nginx配置时添加--with-stream
选项来进行构建。
2.1 指令介绍
1)stream
- 作用:定义stream服务器,与http块平级,定义在main块中。
- 作用域:main
- 语法:
stream {...}
- 示例:
stream {
# 配置内容
}
2)server
- 作用:定义一个虚拟主机,与http块中的server类似。可以在stream块中定义多个server块。
- 作用域:stream
- 语法:
server {...}
- 示例:
stream {
server {
# 配置内容
}
}
3)listen
- 作用:定义虚拟主机server要监听的socket的地址和端口。
- 作用域:server
- 语法:
listen address:port;
- 示例:
stream {
server {
listen 127.0.0.1:3306;
# 其他配置
}
}
2.2 配置示例
假设我们的MySQL服务器IP为192.168.110.101
,端口为3306
。
单机环境配置
stream {
server {
listen 3306;
proxy_pass 192.168.110.101:3306;
}
}
集群环境配置(假设有多个MySQL实例)
这里只是一个示例,实际配置可能需要根据具体的负载均衡策略来调整。
stream {
upstream mysql_cluster {
server 192.168.110.101:3306;
server 192.168.110.102:3306;
# 更多服务器...
}
server {
listen 3306;
proxy_pass mysql_cluster;
}
}
配置完成后,我们就可以通过例如Navicat等客户端连接到Nginx的3306端口,由Nginx代理连接到MySQL服务器。
3、限制访问IP
实现了连接代理后,任何人只要能访问Nginx就能连接MySQL服务器。为了更进一步缩小访问范围,保证数据安全,我们可以限制只有公司网络的IP地址可以通过Nginx进行连接。
Nginx提供了ngx_stream_access_module
模块,其指令非常简单,仅包含allow
和deny
指令。
3.1 指令介绍
1)allow
- 作用:设置指定的IP允许访问。可以和
deny
指令配合使用。 - 作用域:stream, server
- 语法:
allow address | CIDR | unix: | all;
- 示例:
# 允许192.168.110.1访问
allow 192.168.110.1;
# 允许192.168.110.0/16网段的IP访问
allow 192.168.110.0/16;
# 允许所有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.0/16网段的IP访问
deny 192.168.110.0/16;
# 禁止所有IP访问
deny all;
3.2 配置示例
禁止所有的IP访问,除192.168.110.100
外。
stream {
allow 192.168.110.100;
deny all;
server {
listen 3306;
proxy_pass 192.168.110.101:3306;
}
}
Tips:如果指定了allow
,一定要配合deny
使用,否则就是允许所有的IP地址访问。
4、综合案例
只允许192.168.110.100
通过Nginx连接MySQL服务器。
Nginx配置
stream {
allow 192.168.110.100;
deny all;
server {
listen 3306;
proxy_pass 192.168.110.101:3306;
}
}
运行结果
-
配置前:
- 从任意IP尝试连接Nginx的3306端口,都能成功连接到MySQL服务器。
-
配置后:
- 只有从
192.168.110.100
这个IP尝试连接Nginx的3306端口时,才能成功连接到MySQL服务器。 - 从其他IP尝试连接时,会被Nginx拒绝。
- 只有从
通过这样的配置,我们可以有效地控制能够访问MySQL服务器的IP范围,从而提高数据的安全性。希望这篇文章对大家有所帮助,如果有任何问题或建议,欢迎留言交流!