没固定公网 IP 的公司内网实现动态域名解析( 阿里云万网解析 )
前段时间应公司需求,需要将内网的服务映射到公网。由于公司使用的是类似家庭宽带的线路,没有固定的公网 IP 地址,所以决定使用域名来完成。
当时有几种方案:
1、花生壳:但是目前需要乱七八糟的认证备案,舍弃!
2、NAT123:花里胡哨的,感觉像垃圾软件,也舍弃!
3、holer:GITHUB 上面的一个项目,但是我们只能安装 Client 端,Server 端在别人手里,不安全,舍弃!
...
还有其它的乱七八糟的很多,但是都觉得要么是 C/S 架构,麻烦。要么就是使用别人的,定制要么收费,要么不安全,也都放弃了,最后决定参考网上的 Python 调用阿里云 API 通过 Linux 定时任务来更新解析!
简单的网络拓扑如下图:

说明:
1、电信 ASDL 拨号,会有一个会变化的公网 IP 地址,我们的域名就是要解析到最新的该 IP 地址上面
2、公司内网是一个路由器接交换机的方式,路由器比较 Low,H3C 的,简单的进行一个端口转发到指定的服务器 192.168.1.100
3、192.168.1.100 上面安装 Nginx,做反向代理,同时也作为统一的管理入口,方便管理,同时也做定时更新 DNS 解析的任务
首先,我们需要去阿里云创建一个 Accesskey ,这个东西将作为我们登录阿里云更新解析的用户,具体创建方法可以参考百度,创建完成后记得保留好生成的 Key 和 Secret:

注意:创建的 AccessKey 用户一定要记得授权 DNS 管理 的权限,否则无法更新!
其次,我们需要有一个已经备案完成的域名,如 abc.com!
最后,有一台内网的 Linux 机器,个人推荐 CentOS,几年运维下来,几乎用的都是这个,不为别的,就为了比较好管理。
【1】CentOS 服务器安装 Python: 默认情况下,CentOS 是拥有 Python 的,一般都是 2.6 或者 2.7,但是不一定有 pip,我们需要安装 pip,这里采用的 epel 源:
yum -y install epel-release
yum -y install python-pip
【2】安装依赖的阿里云 Python 包:前者是阿里云需要的包,后者是模拟请求需要的包
pip install aliyun-python-sdk-alidns
pip install requests
【3】编辑更新脚本 ddns_update.py,内容如下:
备注:脚本参考网上的老哥的分享,然后自己做了一些修改
注意:这里解析有一个前提条件,就是你需要修改的那条解析规则必须已经存在,该脚本不能新增,只能修改旧的
#coding:utf-8
from aliyunsdkcore import client
from aliyunsdkalidns.request.v20150109 import DescribeDomainsRequest,DescribeDomainRecordsRequest,UpdateDomainRecordRequest
import json,urllib,re ######################################################################################
# 个人配置区域
#####################################################################################
# 创建的 AccessKey
ID="xxxxx"
Secret="xxxxx" # 默认
RegionId="cn-hangzhou" # 你的域名
DomainName="abc.com" # 你想解析的二级域名,是一个列表,可以写多个
HostNameList = ['test','hello', 'world'] # 默认
Types = "A"
clt = client.AcsClient(ID,Secret,RegionId)
###################################################################################### # 动态获取当前公司对外的公网 IP
def GetLocalIP():
IPInfo = urllib.urlopen("http://ip.chinaz.com/getip.aspx").read()
IP = re.findall(r"ip:'(.*?)',", IPInfo)[0]
return IP # 更新域名 IP
def EditDomainRecord(HostName, RecordId, Types, IP):
UpdateDomainRecord = UpdateDomainRecordRequest.UpdateDomainRecordRequest()
UpdateDomainRecord.set_accept_format('json')
UpdateDomainRecord.set_RecordId(RecordId)
UpdateDomainRecord.set_RR(HostName)
UpdateDomainRecord.set_Type(Types)
UpdateDomainRecord.set_TTL('')
UpdateDomainRecord.set_Value(IP)
UpdateDomainRecordJson = json.loads(clt.do_action_with_exception(UpdateDomainRecord))
print UpdateDomainRecordJson # 获取域名信息
def GetAllDomainRecords(DomainName, Types, IP):
DomainRecords = DescribeDomainRecordsRequest.DescribeDomainRecordsRequest()
DomainRecords.set_accept_format('json')
DomainRecords.set_DomainName(DomainName)
DomainRecordsJson = json.loads(clt.do_action_with_exception(DomainRecords)) print DomainRecordsJson['DomainRecords']['Record'] for HostName in HostNameList:
for x in DomainRecordsJson['DomainRecords']['Record']:
RR = x['RR']
Type = x['Type']
if RR == HostName and Type == Types:
RecordId = x['RecordId']
print RecordId
EditDomainRecord(HostName, RecordId, Types, IP) IP = GetLocalIP()
GetAllDomainRecords(DomainName, Types, IP)
【4】添加定时任务: 每两小时更新一次
# 授执行权限
chmod 755 /scripts/ddns_update.py # 添加定时任务
echo "* */2 * * * /usr/bin/python /scripts/ddns_update.py" >> /var/spool/cron/root
【5】配置完成,此时你可以手动执行检验该脚本是否能够正常的修改域名解析!至于后面的 Nginx 反向代理,网上的方法很多,这里就不一一缀诉!
这里感谢提供这个脚本的大神,但是我写这个的时候已经离找到这个脚本有一段时间了,所以就无法具体到哪位,有些遗憾!
没固定公网 IP 的公司内网实现动态域名解析( 阿里云万网解析 )的更多相关文章
- 阿里云万网虚拟主机安装配置Https(SSL)教程
太多太多的用户咨询阿里云虚拟主机是否可以安装SSL数字证书?万网空间是否可以支持HTTPS协议访问网站?答案只有一个:目前阿里云虚拟主机都不支持安装SSL证书!但是,但是,可以曲线实现目标! 1.为了 ...
- TP5验证码上传阿里云万网虚拟主机后,验证码不显示的解决办法
TP5不显示验证码 清除缓冲区就应该可以了,今天我刚好也遇到了,解决的办法是在vendor/topthink/think-captcha/CaptchaController.php中加上这个ob_cl ...
- Openvpn完美解决公司网络没有固定公网IP的问题
方案背景: 公司办公网络使用长城宽带上网有一段时间了,有4个固定IP(2个电信,2个网通),链路不太稳定,经常有问题,因此考虑取消长城宽带,采用原来的adsl上网.但是有个问题,因为公司内网有几台服务 ...
- CentOS下OpenVPN实现公网IP映射到内网(iptables转发功能)(转)
说明:这种方案的实现前提是必须要有一台拥有公网IP的电脑,OpenVPN搭建过程很普通,关键技术在于iptables的转发.搭建教程可能有点旧了,可以只看iptables的关键点技术. 方案背景: 公 ...
- Windows Azure Virtual Network (7) 设置Azure Virtual Machine固定公网IP (Virtual IP Address, VIP) (2)
<Windows Azure Platform 系列文章目录> 本文介绍的是,当用户在创建Azure Virtual Machine的时候,忘记绑定公网IP,需要重新绑定公网IP的具体操作 ...
- 多个分布式系统如何共享使用一个固定公网IP
传统的做法,一个分布式业务系统就有一个中间件,一个中间件需要使用至少一个固定公网IP,这样的话,多个业务系统就需要使用多个固定公网IP. 大家知道,固定公网IP价格可是不菲的.能不能让多个分布式业务系 ...
- 阿里云 云解析使用方法/在阿里云ESC服务器解析域名并绑定服务器IP后上传文件通过域名访问步骤教程
第一步:登录阿里云官网,获取服务器ECS的指定公网IP地址. 1.输入阿里云官网账号进入首页,如下图: 2.点击进入"管理控制台",如下图: 3.点击"云服务器ECS&q ...
- Windows Azure Virtual Network (6) 设置Azure Virtual Machine固定公网IP (Virtual IP Address, VIP) (1)
<Windows Azure Platform 系列文章目录> 注意:本文介绍的是Global Azure (http://www.windowsazure.com),如果你使用的是由世纪 ...
- Windows Azure Web Site (17) Azure Web Site 固定公网IP地址
<Windows Azure Platform 系列文章目录> 在之前的文档中,笔者介绍了Azure Web Site是一个多租户的环境,每个部署单元有一个可以通过Internet访问的入 ...
随机推荐
- java编程思想第九章接口
9.1抽象类和抽象方法 为什么要有抽象类? 是希望通过通用接口操作一系列类. 那么抽象类的形式是什么样的呢? 声明类的使用使用abstract关键字,且在该类中应该具有抽象方法. 注:抽象方法被关键字 ...
- Python 修改ha配置文件
任务要求: 1.用户输入字符串 {"backend": "test.oldboy.org","record":{"server&q ...
- kibana 统计field所有值百分比
步骤: 1.创建新的Visualize——Pie chart 2.工具栏设置 metrics: slice size Count (默认) buckets:Split Slices 注意调整size: ...
- microsoft windows network 不允许一个用户使用一个以上用户名与服务器或共享资源的多重连接
运行CMD在命令行中运行net use * /del /y 命令中断开所有连接最后,你再次访问 ,就不会有问题了. 而且可以连接多个samba用户.
- Azure disk iops的测试
在Public Cloud中,VM.Storage和Network是IaaS的三大基础.本文将介绍在Azure的VM上测试磁盘IOPS的工具和方法. 一.添加磁盘.初始化磁盘 1.添加磁盘 把相应的信 ...
- Python numpy函数:reshape()
reshape()函数用于改变数组对象的形状: import numpy as np a = np.array([1,2,3,4,5,6,7,8]) #转换成2D数组 b = a.reshape((2 ...
- 模块化方案esl以及amd的依赖方式
来自AMD设计思想的总结和思考 在之前了解es6模块化的时候有遇到过依赖循环的问题,在es6中对于模块是引用性的,而当时于es6模块化做对比的commonjs(CMD规范)对于模块是值类型(会将其缓存 ...
- Oracle 静默安装的db_install.rsp 文件
Oracle 静默安装的db_install.rsp 文件,已修改好值 ################################################################ ...
- TCS3200颜色传感器测试实验
TCS3200颜色传感器测试实验 2013-08-02 17:18:24 分享: 标签: Arduino TCS3200 传感器 TCS3200颜色传感器是一款全彩的颜色检测器,包括了一块TAO ...
- HTML5的头部、拨号、短信、邮件(转)
HTML5[语法要点] 一.头部设置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <!--页面窗口自动调整到设备 ...