家里闲置着一台老款的Mac mini Server,跑OS X越来越慢,索性装上了Cent OS 7,变成了一台家庭服务器,装上了Plex媒体服务器和Transmission下载服务,同时,也装上了Nginx、Mysql、MongoDB、Redis等,可以调试代码,甚至担当一些小型项目的服务器。

不过,只在家庭内网使用,功能太有限,于是接下来面临的一个问题就是内网穿透。使用过花生壳和花生棒,服务相当不稳定,而且种种受限,每要多加一个端口就要多花钱,安全性也有问题。

其实想想,内网穿透的最大难题无非就是家里是动态公网IP,每变换一次公网IP,需要重新解析一次域名。而阿里云等大型的云服务商,目前都已经实现了域名解析管理的API接口,而且基本都是立即就可生效 。

所以我的思路就是,系统运行一个定期执行的程序,每隔一段时间扫描一下最新的公网IP,如果发现最新的公网IP与域名解析到的IP地址不一致,就通过阿里云API自动更新解析设置即可。这样的花费不过每年一个域名的费用,最贵也就几十块钱。

具体实现步骤如下:

1. 阿里云设置

首先,要确定一个准备用于外网访问的域名,并将此域名转入到阿里云的云解析服务来解析。如图所示,添加需要管理的域名。

阿里云云解析服务

转入后,在解析设置中,设置一下A记录解析,解析的IP地址可以填当前的公网IP。如果不知道自己的公网IP,在CentOS系统下,可以输入使用以下命令获取当前的公网IP。

curl ifconfig.me

获取公网IP后,在阿里云云解析中设置完A记录解析。

设置A记录解析

在阿里云账户管理后台,点击右上角的账户头像,然后点击accesskeys,或者直接登陆https://ak-console.aliyun.com,获取阿里云的AccessKeyIDAccessKeySecret

2. 路由器设置

阿里云的设置完成后,需要对路由器设置端口映射,使外网对公网IP的端口访问能转发到内网服务器的相应端口。绝大部分的路由器都支持端口映射。

常见的服务端口包括,用于WEB访问的80端口、SSH远程管理的22端口、Mysql数据库的3306端口、Transmission下载服务管理的9091端口和Plex媒体服务的32400端口等等。不用花生壳的好处就是没有端口数量限制,想设置多少就可以设置多少。

当然,在设置端口映射之前,应确保服务器的内网IP已经设置为静态IP,而不是DHCP动态获取。

例:对外33898.,映射为本机192.168.0.8的3389端口

3. 服务器设置

服务器端安装好想要使用的各种服务后,别忘了在防火墙中开启相应的端口,在CentOS 7中,防火墙永久开启端口的命令是:

firewall-cmd --add-port=80/tcp --permanent

开启之后别忘了重新载入防火墙的设置以使其生效,命令如下:

firewall-cmd --reload

4. 自动更新域名解析程序

准备工作都做好了,接下来就是通过程序检测公网IP,并在公网IP发生变化时,及时更新阿里云的域名解析。

这个程序是用Python写的,先使用Python的包管理工具pip下载安装阿里云的Python SDK。如果没有安装pip,则先安装pip:

yum install pip

安装好pip后,安装阿里云的Python核心SDK以及云解析SDK:

pip install aliyun-python-sdk-core
pip install aliyun-python-sdk-alidns

导入项目所需要的包,如果缺少则使用pip安装:

import os
import json
from urllib2 import urlopen
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkalidns.request.v20150109 import DescribeDomainRecordsRequest
from aliyunsdkalidns.request.v20150109 import UpdateDomainRecordRequest

完整代码如下:

#!/usr/bin/env python
# coding= utf-8import os
import json
from urllib2 import urlopen
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkalidns.request.v20150109 import DescribeDomainRecordsRequest
from aliyunsdkalidns.request.v20150109 import UpdateDomainRecordRequestclass DnsHandler:# 从阿里云开发者后台获取Access_Key_Id和Access_Key_Secretaccess_key_id = ""access_key_secret = ""# 填入自己的域名domain_name = ""# 填入二级域名的RR值rr_keyword = ""# 解析记录类型,一般为A记录record_type = "A"# 用于储存解析记录的文件名file_name = ".ip_addr"client = Nonerecord = Nonecurrent_ip  = ''# 初始化,获取client实例def __init__(self):self.client = AcsClient(self.access_key_id,self.access_key_secret,self.region_id)self.record = self.get_record()self.current_ip = self.get_current_ip()# 如果公网IP发生变化,则自动修改阿里云解析记录def reset(self):if self.current_ip <> self.get_record_value():print self.update_record(self.current_ip)self.get_record()# 获取阿里云域名解析完整记录,并使用文件缓存def get_record(self):if os.path.isfile(self.file_name) :file_handler = open(self.file_name, 'r')r = file_handler.read()file_handler.close()else :request = DescribeDomainRecordsRequest.DescribeDomainRecordsRequest()request.set_PageSize(10)request.set_action_name("DescribeDomainRecords")request.set_DomainName(self.domain_name)request.set_RRKeyWord(self.rr_keyword)request.set_TypeKeyWord(self.record_type)r = self.client.do_action_with_exception(request)file_handler = open(self.file_name, 'w')file_handler.write(r)file_handler.close()return json.loads(r)# 获取阿里云域名解析记录IDdef get_record_id(self) :return self.record["DomainRecords"]["Record"][0]["RecordId"]# 获取当前域名解析记录def get_record_value(self) :return self.record["DomainRecords"]["Record"][0]["Value"]# 修改阿里云解析记录def update_record(self, value):request = UpdateDomainRecordRequest.UpdateDomainRecordRequest()request.set_action_name("UpdateDomainRecord")request.set_RecordId(self.get_record_id())request.set_Type(self.record_type)request.set_RR(self.rr_keyword)request.set_Value(value)return self.client.do_action_with_exception(request)# 获取当前公网IPdef get_current_ip(self):return json.load(urlopen('http://jsonip.com'))['ip']# 实例化类并启动更新程序
dns = DnsHandler()
dns.reset()

将以上代码保存为dns.py文件,并赋予执行权限:

chmod +x dns.py

5. 设置定时运行

CentOS内置有强大的计划任务工具Crontab,如果系统里没有则先使用yum安装:

yum install crontabs

首先,设置执行用户的环境变量,比如,我们使用root用户来执行这一程序,则先在用户目录下建立.profile文件,或者在已有的.profile文件下加入如下一行,以使得可以使用VI来编辑cron文件:

EDITOR=vi; export EDITOR

建立mycron文件,加入如下内容:

*/10 * * * * /root/ddns/dns.py

这意味着每10分钟执行一次任务,即扫描公网IP,若与阿里云解析不一致,则修改阿里云解析。

然后,提交crontab任务:

crontab mycron

好了,大功告成,接下来,程序会每隔10分钟自动扫描公网IP,然后自动更新阿里云的解析,速度、稳定性和安全性都远胜于第三方的DDNS服务。

原文链接

ius 地址: https://www.jianshu.com/p/291a3a5283ac

无需花生壳,阿里云解析实现内网穿透相关推荐

  1. 【保姆级】阿里云服务器frp内网穿透教程

    背景1: 去年买了一台阿里云服务器,轻量应用服务器,2核4G.个人比较喜欢嵌入式,开发板也不少,但是开发板连接路由器后内次都要看一下IP然后去连接(虽然可以在路由器上控设置固定IP),然后最近突发奇想 ...

  2. 阿里云centos7 frp内网穿透

    frp介绍 frp 是一个开源.简洁易用.高性能的内网穿透和反向代理软件,支持 tcp, udp, http, https等协议.frp 项目官网是 https://github.com/fatedi ...

  3. 花生壳和神卓互联内网穿透那个好用?

    目前企业级主流的穿透技术分别是花生壳和神卓互联,虽然两家公司在稳定性方面表现相当,用户可以根据自己的需求和喜好选择其中之一作为内网穿透服务.无论选择哪一个,都可以享受到高质量.稳定可靠的内网穿透服务. ...

  4. 使用python做内网穿透小工具实现花生壳功能,一键生成内网穿透端口映射

    本文是基于https://gitee.com/stlswm/transponder 这位大佬的源码的基础上,做的小工具 测试系统: 外网:linux 内网:windows python:python3 ...

  5. 阿里云的服务器内网互通的前提条件

    内网 目前阿里云的服务器内网间是千兆共享的带宽,没有特殊限制.由于是共享网络,因此无法保证带宽速度是不变的. 如果您需要两台同地域的 ECS 实例传输数据,一般建议使用内网连接.同时,RDS.SLB. ...

  6. 【阿里云】阿里云跨账号内网互通

    阿里云VPC对等连接提供连通两个VPC的网络连接,您可以使用私有IP地址直接通信,两个VPC就像在同一个网络中一样.您可以与自己同地域或者跨地域其他VPC之间创建对等连接,也可以与其他账号的同地域或者 ...

  7. 腾讯云搭建Cpolar内网穿透

    前言:此过程需要建立在购买了腾讯云以及cpolar内网穿透的前提下,腾讯云系统是centos7.6,cpolar内网穿透是购买的一年99块的,可以自己自定义域名 一.安装cpolar 国内用户使用: ...

  8. frp实现花生壳+阿里云内网穿透,实现公有IP映射到本地(支持 TCP、UDP、HTTP、HTTPS 等多种协议)

    简介: 一文搞懂frp内网穿透并搭建配置使用,Windows.Mac电脑远程链接! frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP.UDP.HTTP.HTTPS 等多种协议.可以将内 ...

  9. 花生壳 || FRP实现玩客云、树莓派...内网穿透,外网访问

    一:内外网穿透简介 内网穿透也叫做内网映射,也叫"NAT穿透".就是让外网能访问你的内网:把自己的内网(主机)当成服务器,让外网能访问.下面是我用过的两种内网穿透.个人认为FRP更 ...

  10. 【外网访问学校服务器】阿里云服务器+frp+内网服务器

    寒假将至,为了在家能继续用学校的服务器,通过云服务器的公网ip作为桥梁进行内网渗透,来访问学校的服务器. 设备:服务端(阿里云轻量服务器) 客户端( Ubuntu 20.04.1) 阿里云先设置密码 ...

最新文章

  1. FPGA的LVDS电平以及LVDS25电平能在HR Bank上使用吗?
  2. vue学习:vue中data和return data的区别
  3. poj 3537 Crosses and Crosses 博弈论之grundy值
  4. malloc,colloc,realloc内存分配,动态库,静态库的生成与调用
  5. 关于QT下配置OpenCV3.4.0后出现 error: undefined reference to ‘cv::xxx‘的问题及解决方案,直接使用编译好的opencv库
  6. atheros蓝牙设备驱动 小米_小米Air 13笔记本黑苹果WiFi蓝牙硬件改装方案二
  7. 7月9日王者荣耀服务器维护,王者荣耀 7月9日体验服停机更新公告
  8. python web开发框架 支持windows_基于Python的Web开发框架研究_曾浩
  9. tcp 协议中发送窗口的大小应该是_TCP 协议中的三次握手与四次挥手
  10. web测试的基本流程
  11. 又踩坑之16G的大avi文件的删除
  12. 上瘾读书笔记:让用户养成使用习惯的四大产品逻辑
  13. Android与bmob的有机结合
  14. 修改计算机参数,缺氧参数怎么修改 游戏内参数修改方法解答
  15. xls和xlsx的区别
  16. Latex表格线宽修改方法以及内容左对齐。
  17. Springboot手机验证码
  18. SAP_ABAP_BADI AND NEW BADI
  19. 网页设计标记工具——马克鳗
  20. 端到端无人驾驶文献学习:End-to-end Interpretable Neural Motion Planner

热门文章

  1. 如何看计算机几核,如何查看电脑CPU是几核的?,这几步你要了解
  2. xgboost缺失值处理
  3. Python招聘职位大体是两个方向
  4. C语言计算线性方程组
  5. java虎牙app弹幕_虎牙直播随机弹幕插件(OBSS)
  6. 定制合成:热激发延迟荧光材料PPZ-3TPT、PPZ-4TPT、PPZ-DPS或PXZ-DPS、DMAC-DPS
  7. SAP WORKFLOW 1创建一个简单的workflow helloworld
  8. 体重 年龄 性别 身高 预测鞋码_用身高和体重数据进行性别分类的实验报告
  9. solidworks批量转存宏程序开发【可下载】
  10. 电视android怎么连接手机助手下载,手机怎么连到电视上?