如何用 Nginx 代理 MySQL 連接,并限制可訪問 IP?
1.前言
我們的生產(chǎn)環(huán)境基本上都部署在云服務(wù)器上,例如應(yīng)用服務(wù)器、MySQL服務(wù)器等。如果MySQL服務(wù)器直接暴露在公網(wǎng),就會(huì)存在很大的風(fēng)險(xiǎn),為了保證數(shù)據(jù)安全,MySQL服務(wù)器的端口是不對(duì)外開放的。
好巧不巧,線上業(yè)務(wù)遇到bug了,開發(fā)的小伙伴需要遠(yuǎn)程連接MySQL來查看數(shù)據(jù),那應(yīng)該怎么辦呢?
我們可以通過Nginx代理(“跳板機(jī)”)來進(jìn)行連接。
2.Nginx代理連接
要實(shí)現(xiàn)對(duì)連接的代理轉(zhuǎn)發(fā),我們需要一臺(tái)服務(wù)器并安裝Nginx,且與MySQL服務(wù)器處于一個(gè)內(nèi)網(wǎng)之中,內(nèi)網(wǎng)之間可以訪問。
其次,我們需要用到ngx_stream_core_module模塊,該模塊不是默認(rèn)構(gòu)建的,我們需要在configure時(shí)添加--with-stream來進(jìn)行構(gòu)建。
添加過程可以參照【Nginx基本命令&不停機(jī)版本升級(jí)】一文進(jìn)行,我們這里不再贅述。
既然要用到ngx_stream_core_module模塊,首當(dāng)其沖,是看看其提供的指令,我們才知道怎么來進(jìn)行配置。
(1) stream
該指令定義了stream服務(wù)器。與http塊平級(jí),定義在main塊中。
- 作用域:main
- 語法:stream {...}
示例:
stream {
server {
......
}
}
(2) server
該指令定義一個(gè)虛擬主機(jī),與http塊中的server類似。我們可以在stream塊中定義多個(gè)server塊。
- 作用域:stream
- 語法:server {...}
stream {
server {
......
}
}
(3) listen
該指令定義虛擬主機(jī)server要監(jiān)聽的socket的地址和端口。另外,搜索公眾號(hào)頂級(jí)架構(gòu)師后臺(tái)回復(fù)“算法”,獲取一份驚喜禮包。
- 作用域:server
- 語法:listen address:port;
示例:
listen 127.0.0.1:3306;
listen *:3306;
# 效果與listen *:3306一樣
listen 3306;
listen localhost:3306;
(4) 配置示例
MySQL服務(wù)器,端口3306(單機(jī)環(huán)境)
stream {
server {
listen 3306;
proxy_pass 192.168.110.101:3306;
}
}
MySQL服務(wù)器,端口3306(集群環(huán)境)
stream {
upstream mysql_socket {
server 192.168.110.101:3306;
}
server {
listen 3306;
proxy_pass mysql_socket;
}
}
此時(shí),我們就可以通過例如Navicat等客戶端進(jìn)行連接。
3.限制訪問IP
實(shí)現(xiàn)了對(duì)連接的代理,所有人都可以通過訪問Nginx來連接MySQL服務(wù)器,解決了外網(wǎng)無法連接的問題。
為了更進(jìn)一步的縮小訪問范圍,保證數(shù)據(jù)安全,我們可以限制只有公司網(wǎng)絡(luò)的IP地址可以通過Nginx進(jìn)行連接。
Nginx提供了ngx_stream_access_module模塊,其指令非常簡(jiǎn)單,僅包含allow和deny指令。
(1) allow
該指令設(shè)置指定的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
該指令設(shè)置指定的IP禁止訪問??梢院蚢llow指令配合使用。
- 作用域: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服務(wù)器。
stream {
allow 192.168.110.100;
deny all;
server {
listen 3306;
proxy_pass 192.168.110.101:3306;
}
}