一、前言

在日常工作中,经常存在下面场景:1.数据库安装的主机不能本地直接访问,但是本地可以访问的主机到数据库是没问题的。2.基于安全原因等导致部分主机对外访问开放,或者开放主机有限等。这个时候我们就想通过这台可直接访问的主机访问数据库,结合nginx反向代理,本文主要阐述配置过程。

二、nginx配置

2.1 nginx模块升级

如果基于现有nginx进行升级,可以查看博客(《如何对在用的nginx添加新模块》)[/2022/05/23/如何对在用的nginx添加新模块/]。

2.2 安装ngx_stream_core_module

需要用到ngx_stream_core_module模块,该模块不是默认构建的,需要在configure时添加--with-stream来进行构建。如下所示:

1
./configure --prefix=/opt/nginx --with-http_stub_status_module --with-stream

2.3 配置ngx_stream_core_module

配置模式主要使用stream作用域,与http块平级,定义在main块中。如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  stream  {
upstream ddmysql_socket {
server 135.202.xxx.xxx:xxxx;
}
upstream ckpg_socket {
server 135.202.xxx.xxx:xxxx;
}

server {
listen 7709;
proxy_pass ddmysql_socket;
}
server {
listen 7708;
proxy_pass ckpg_socket;
}
}

上面使用了7708端口代理了135.202.xxx.xxx:xxxx地址的pg数据库;使用了7709端口代理了135.202.xxx.xxx:xxxx地址的mysql数据库。

2.4 限制访问 IP

实现了对连接的代理,所有人都可以通过访问Nginx来连接MySQL服务器,解决了外网无法连接的问题。为了更进一步的缩小访问范围,保证数据安全,我们可以限制只有公司网络的IP地址可以通过Nginx进行连接。Nginx提供了ngx_stream_access_module模块,其指令非常简单,仅包含allow和deny指令。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 # 允许192.168.137.1访问
allow 192.168.137.1;

# 允许192.168.137.1到192.168.255.254
allow 192.168.137.0/16;

# 允许192.168.137.1到192.168.137.254
allow 192.168.137.0/24;

# 允许所有的IP访问
allow all;

# 禁止192.168.137.1访问
deny 192.168.137.1;

# 禁止192.168.137.1到192.168.255.254
deny 192.168.137.0/16;

# 禁止192.168.137.1到192.168.137.254
deny 192.168.137.0/24;

# 禁止所有的IP访问
deny all;

注意:如果指定了allow,需要配合deny使用,否则就是允许所有的IP地址访问。