现阶段,对于一个互联网公司来讲,其生产环境基本上都是在云服务器上,例如常用的一些应用服务器、数据库服务器等等。但是在我们部署引用的时候,如果直接将数据库的链接暴露在公网上很明显不现实,存在很大的安全隐患。而一般情况下,数据库服务端口是不对外开放的。但是在生产环境出现问题之后,我们又需要通过数据库来查看问题。这个问题,一般的解决方案是使用VPN技术,或者是使用跳板机技术。下面我们就来看看如何使用Nginx来实现一个跳板机。
Nginx代理原理
既然要实现代理的请求转发,必不可少的就是需要一个Nginx服务器,并且要保证其与MySQL所在的服务器在同一个内网环境中,也就是说通过内网环境可以相互访问。
其次,需要我们去安装 ngx_stream_core_module模块 这个模块并不是默认构建的,而是需要我们在安装Nginx的时候通过 -with-stream 配置来进行构建。
Nginx的Stream模块主要是用来做四层的负载均衡,流量转发。它支持TCP和UDP流量的转发。相对于HTTP流量,TCP/UDP流量的负载均衡和处理更接近底层。 使用Nginx流代理可以极大的方便解决一些TCP/UDP流量管理的问题。
在这个模块安装好之后,有如下几个配置需要我们注意
stream
这个配置模块主要用来指定stream服务器的相关配置,是与HTTP模块平级的块。其定义在main模块中
stream { server{ …… }}
server
指定一个虚拟机,与http模块中的server功能类似,我们可以在stream中定义多个server如下所示。
stream { server { ...... } server { ...... } }
listen
这个指令定义了虚拟机server所监听的socket的地址端口。
listen 127.0.0.1:3306; listen *:3306; # 效果与listen *:3306一样 listen 3306; listen localhost:3306;
配置MySQL链接
以MySQL为例来进行配置,如果是在单机环境下则是通过如下的配置实现。
stream { server { listen 3306; proxy_pass 192.168.110.101:3306; } }
如果是在集群的环境下我们可以通过如下的方式来进行配置。这个配置有点类似于我们通过Nginx配置反向代理的负载均衡的方式。
stream { upstream mysql_socket { server 192.168.110.101:3306; } server { listen 3306; proxy_pass mysql_socket; } }
完成上述配置之后,我们就可以通过MySQL的客户端工具来连接服务了。
对于IP访问的限制
配置完成之后,接下就需要对IP进行访问限制。为了保证安全Stream模块中还提供了如下的两条指令
- allow:允许访问的IP
- deny:禁止访问的IP
其配置如下。
# 允许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;
禁止访问的配置如下
# 禁止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;
我们可以通过如下的设置来限制IP的访问。
allow 192.168.110.100;deny all;
这里需要注意这两个指令是相互配合使用,如果只设置其中的一个选项,则另一个配置选项就成了默认值。
总结
通过下面这个配置,我们就可以实现一个MySQL数据库连接配置设置,允许192.168.110.100访问并且只允许192.168.110.100访问。
stream { allow 192.168.110.100; deny all; server { listen 3306; proxy_pass 192.168.110.101:3306; } }