在ip不斷變化情況下實現自動限制動態ip訪問允許訪問限定域名內容。
摘要:
公司在託管機房有部署elasticsearch伺服器。開發需要經常連線機房的elasticsearch叢集檢視資料,但是如果把elasticsearch叢集地址配置成外網是很危險的行為,由於elasticsearch資料庫特性,因此只要別人知道你的資料庫地址和埠,就可以任意操作你的資料庫。這是萬萬不可取的。
解決辦法:
給elasticsearch-head伺服器配置域名
不能把ip和埠暴露出去,於是就想到利用es-head外掛,給es-head外掛配置域名。然後通過訪問es-head的地址,然後訪問資料,為了安全起見,給es-head配置了帳號和密碼
配置如下:
1、安裝 htpasswd 工具 用於生成nginx訪問密碼
yum -y install httpd-tools
2、執行 命令建立密碼
[[email protected] ~]# htpasswd -c /usr/local/src/nginx/passwd es
New password:
Re-type new password:
Adding password for user coderschool
輸入密碼即可建立密碼
密碼檔案記住路徑,等下配置nginx會用到。
3、配置nginx虛擬主機配置
server { listen 80; server_name es-head.qq.com; location / { auth_basic "es"; auth_basic_user_file /usr/local/src/nginx/passwd; #密碼檔案路徑 proxy_pass http://192.168.1.10:9100; include /conf.d/proxy-params.conf; } }
這樣就可以通過域名http://es-head.qq.com訪問 http://192.168.1.10:9100的內網地址了
訪問的時候可以會提示輸入賬號密碼,賬號填入es,密碼填入剛才配置的密碼即可。如下圖所以。
輸入賬號密碼就會出現es介面了
進入後,又發現了一個問題
es-head中,需要填入es伺服器地址,才能訪問資料,由於我所在的網路環境和es資料不在同一個網路環境,因此地址不能填寫內網地址,只能填寫外網。這就尷尬,搞了半天,還是無法連線資料庫。
後來想到了nginx有一個限定ip訪問域名的功能,剛好可以用上。
給elasticsearch資料庫配置域名,並限定特定的ip訪問
於是修改nginx虛擬主機配置
配置一
upstream es.qq.com
{
server 192.168.1.10:9200 weight=1;
server 192.168.1.11:9200 weight=1;
server 192.168.1.12:9200 weight=1;
server 192.168.1.13:9200 weight=1;
#ip_hash;
}
# 上面我做了一個叢集,和nginx負載均衡,可以刪除。如果刪除了,請參考配置二
server {
listen 80;
server_name es.qq.com;
location / {
include /usr/local/src/nginx/es-allow-ip.conf;
deny all;
proxy_pass http://es.qq.com;
include /conf.d/proxy-params.conf;
}
}
推薦配置二(不是叢集的,或者有叢集的都可以使用配置二):
server {
listen 80;
server_name es.qq.com;
location / {
include /usr/local/src/nginx/es-allow-ip.conf;
deny all;
proxy_pass http://es.qq.com;
include /conf.d/proxy-params.conf;
}
}
/usr/local/src/nginx/es-allow-ip.conf;檔案內容格式如下:
allow 114.114.114.114;
114.114.114.114 是你的外網ip,如果你的外網ip是固定ip,那就現在就完事了,但是很多的外網ip是動態ip。因為這個也需要動態操作的。
動態更新限定的ip,從而達到限制其他人訪問的目的
更新本地的動態ip。需要用到動態ddns解析,這個騰訊雲和阿里雲都有介面,百度一下怎麼操作。
就是一旦自己的外網ip變化了,就會動態解析到設定的域名上面去,我配置了一個域名test.qq.com,然後我通過獲取這個域名的解析地址,知道我的外網ip、
python2程式碼如下:python3程式碼略有不同。
# -*- coding: utf-8 -*-
import os
import socket
result = socket.getaddrinfo("test.qq.com", None)[0][4][0]
with open('/usr/local/src/nginx/es-allow-ip.conf','r') as f1 :
ip = f1.readline()[6:][:-1]
if ip != result:
print ip
print result
with open('/usr/local/src/nginx/es-allow-ip.conf','w') as f2 :
f2.write('allow ' + result+';')
os.system('nginx -s reload')
print('ip改變')
else:
print('ip未改變')
然後我配置一個定時任務,每小時執行一次
crontab -e
1 * * * * python /root/update_ip.py >> /root/update_ip.log
這樣就實現了外網ip自動更新白名單的操作。
從而實現了整個業務的需求。
上面就是效果圖。已經可以取到東西了、