1. 程式人生 > >在ip不斷變化情況下實現自動限制動態ip訪問允許訪問限定域名內容。

在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自動更新白名單的操作。

從而實現了整個業務的需求。

在這裡插入圖片描述

上面就是效果圖。已經可以取到東西了、