在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自动更新白名单的操作。
从而实现了整个业务的需求。
上面就是效果图。已经可以取到东西了、