需求
对于部署在阿里云上的重要系统一般是不让其他人访问的,所以会在负载均衡(SLB)上加上访问控制列表。而使用ASDL拨号上网的宽带来说一般公网IP都不会固定的,会随时变更公网IP,所以此脚本正是解决此需求。
说明
脚本运行前需要先安装aliyun-python-sdk-core 和aliyun-python-sdk-slb 2个sdk,并且在阿里云账户里面创建access_key和access_secret。
脚本会查询到目前的公网IP,如何创建本地一个文件将IP记录到文件里,下次执行时会将查询到的IP和文件里的对比,如果IP和文件里记录的IP不一致则将IP添加到访问控制列表里。
最后只需要在服务器里每隔一段时间执行一次此脚本就OK。
sdk 下载:https://developer.aliyun.com/tools/sdk#/python
提醒
如果是重要的数据在公网传输,还是尽量使用加密传输。毕竟阿里云的SSL 和IPSEC 也很完善了,推荐使用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
#!/usr/bin/env python3
#coding:utf-8
from aliyunsdkcore import client
import time,requests
from aliyunsdkslb.request.v20140515 import AddAccessControlListEntryRequest
from aliyunsdkcore.profile import region_provider
#region_provider.modify_point('slb', '<regionId>', 'slb.<regionId>.aliyuncs.com')
# 名称:阿里云负载均衡白名单自动修改脚本
### 变量配置 ###
# 保存历史IP地址的文件名
file_save_ipaddr = 'ipaddr.txt'
# 一些可以获取本机出口IP的API地址
ip_api_list = 'http://icanhazip.com,http://ident.me,http://ifconfig.me,http://ipecho.net/plain,http://whatismyip.akamai.com,http://myip.dnsomatic.com'
# SLB 配置,此 Access Key 只需添加 ACL 的权限
aliyun_access_key = 'xxxxxxxxx'
aliyun_access_secret = 'xxxxxxxxxxxxxx'
# 在这里可以获取region:https://help.aliyun.com/document_detail/40654.html
aliyun_region = 'cn-hangzhou'
# 访问列表一(acl-bp1792k8uvk11xxpgu5l)
# 访问列表二(acl-bp1okd1kud9a41kyjkja)
# 需要修改的ACL的ID,进入负载均衡控制台 -> 访问控制 -> 策略ID
aliyun_acl_id = [ 'acl-bp1okd1kud9a41kyjkja' , 'acl-bp1792k8uvk11xxpgu5l' ]
### 配置结束 ###
def getExitIpAddr(ip_api_list):
'''获取出口IP地址'''
url_list = str (ip_api_list).split( ',' )
ip = None
for url in url_list:
resp = requests.get(url,timeout = 3 )
if resp.status_code = = 200 :
ip = resp.text.strip()
break
return ip
def setAcl(access_key,access_secret,region,acl_id,ip):
'''修改ACL'''
clt = client.AcsClient(access_key,access_secret,region)
# 设置参数
request = AddAccessControlListEntryRequest.AddAccessControlListEntryRequest()
request.set_accept_format( 'json' )
request.add_query_param( 'AclId' ,acl_id)
request.add_query_param( 'RegionId' ,region)
request.add_query_param( 'Tags' , 'API自动添加' )
request.add_query_param( 'AclEntrys' , '[{{"entry":"{ip}/32","comment":"此处是注释{d}"}}]' . format (ip = ip,d = time.strftime( "%Y-%m-%d" ,time.localtime())))
#添加ip并添加注释
# 发起请求
response = clt.do_action_with_exception(request)
print (response)
def getSavedIp(filename):
'''获取已保存的IP'''
try :
with open (filename, 'r' ,encoding = 'utf-8' ) as f:
return f.readline()
except IOError:
print ( "文件不存在" )
def saveNewIp(filename,ipaddr):
'''保存新IP'''
with open (filename, 'w' ,encoding = 'utf-8' ) as f:
f.write(ipaddr)
def main():
current_ip = getExitIpAddr(ip_api_list)
saved_ip = getSavedIp(file_save_ipaddr)
print ( '当前IP' ,current_ip)
print ( '保存的IP' ,saved_ip)
if current_ip = = saved_ip:
print ( 'IP无变化' )
exit( 0 )
else :
for acl_id in aliyun_acl_id:
setAcl(access_key = aliyun_access_key,
access_secret = aliyun_access_secret,
region = aliyun_region,
acl_id = acl_id,
ip = current_ip)
time.sleep( 5 )
saveNewIp(file_save_ipaddr,current_ip)
if __name__ = = '__main__' :
main()
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.51cto.com/billy98/2358807