Ubuntu技巧-Ubuntu远程访问之电信公网IP

💡
大家好,我是可夫小子,《小白玩转ChatGPT》专栏作者,关注AIGC、互联网和自媒体。

前面文章介绍了家庭服务器接入外网的三种方式的第一种,今天介绍第二种,即通过获得电脑公网IP,然后再设置动态DNS保持更新。这种方案的成功率与你所使用网络运营商相关,我了解有些地方运营商并不同意给你分配公网IP。

框架

先看一下大概的框架,主要的思路就是自己在家庭路由器上拨号获得外网的IP,然后与服务器的端口绑定,就能通过外网访问家庭服务器了。

获得运营商的公网IP

我家里是使用电脑的网络,我就以电信为例

  1. 与10000客服沟通:电信光猫改成桥接模式,在路由器端重新拨号;

  2. 与10000客服沟通:把外网IP设置为公网IP(他们一般不会同意,说没有了。强烈要求,不给投诉,就可以免费一年)

  3. 重新在路由器上拨号就看得到公网IP(如果判断是不是公网IP,在https://www.ip138.com/查一下本机IP和外网IP是同一个,此时的IP就是公网IP)。同时也可以通过curl ifconfig.me获得外网IP。

  4. 在路由器设置端口转发

到此,已经获得一个公网IP,并与ubuntu服务器做了端口映射。

域名绑定

  1. 购买域名,在阿里云购买一个top域名,大概22元/年。

  2. 阿里云域名映射:添加一条A记录
    此时获得虽然是公网IP,但这个IP是动态,我测试下来大概一周变更一次,就需要写一个脚本,定时更新这个阿里云域名DNS服务,这个下再再讲。

  3. 测试:ssh -p 26919 koffu@xxxxx.top

动态域名设置

之前提到,运营商给发布的IP虽然是公网的,但是动态的,我测试下来大概一周变更一次。所以,接下来我们要设置一个自动化任务,每天固定时间点去获取公网IP,然后通过软件接口去更新阿里云的域名解析的A记录。那么无论你什么时候访问这个域名,都是解析到更新的正常的IP。

先在阿里云的RAM访问控制,创建一个用户。




接下来完成账号验证,就创建成功了,AccessKey ID和Secret生成了,后面需要用到。


点击用户名,进行权限管理,添加DNS解析权限

自动更新的python代码如下,自行替换自己的ID和SECRET

#!/usr/bin/env python
#coding=utf-8# 加载核心SDK
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from datetime import datetime# 加载获取 、 新增、 更新、 删除接口
from aliyunsdkalidns.request.v20150109 import DescribeSubDomainRecordsRequest, AddDomainRecordRequest, UpdateDomainRecordRequest, DeleteDomainRecordRequest# 加载内置模块
import json,urllib# AccessKey 和 Secret  建议使用 RAM 子账户的 KEY 和 SECRET 增加安全性
ID = ''
SECRET = ''# 地区节点 可选地区取决于你的阿里云帐号等级,普通用户只有四个,分别是杭州、上海、深圳、河北,具体参考官网API
regionId = 'cn-hangzhou'# 配置认证信息
client = AcsClient(ID, SECRET, regionId)# 设置主域名
DomainName = ''# 子域名列表  列表参数可根据实际需求增加或减少值
SubDomainList = ['tl']# 获取外网IP   三个地址返回的ip地址格式各不相同,3322 的是最纯净的格式, 备选1为 json格式  备选2 为curl方式获取  两个备选地址都需要对获取值作进一步处理才能使用
def getIp():# 备选地址:1, http://pv.sohu.com/cityjson?ie=utf-8    2,curl -L tool.lu/ipwith urllib.request.urlopen('https://ifconfig.me/') as response:html = response.read()ip = str(html, encoding='utf-8').replace("\n", "")return ip# 查询记录
def getDomainInfo(SubDomain):request = DescribeSubDomainRecordsRequest.DescribeSubDomainRecordsRequest()request.set_accept_format('json')# 设置要查询的记录类型为 A记录   官网支持A / CNAME / MX / AAAA / TXT / NS / SRV / CAA / URL隐性(显性)转发  如果有需要可将该值配置为参数传入request.set_Type("A")# 指定查记的域名 格式为 'test.binghe.com'request.set_SubDomain('tl.agihub.top')response = client.do_action_with_exception(request)response = str(response, encoding='utf-8')# 将获取到的记录转换成json对象并返回return json.loads(response)# 新增记录 (默认都设置为A记录,通过配置set_Type可设置为其他记录)
def addDomainRecord(client,value,rr,domainname):request = AddDomainRecordRequest.AddDomainRecordRequest()request.set_accept_format('json')# request.set_Priority('1')  # MX 记录时的必选参数request.set_TTL('600')       # 可选值的范围取决于你的阿里云账户等级,免费版为 600 - 86400 单位为秒 request.set_Value(value)     # 新增的 ip 地址request.set_Type('A')        # 记录类型request.set_RR(rr)           # 子域名名称  request.set_DomainName(domainname) #主域名# 获取记录信息,返回信息中包含 TotalCount 字段,表示获取到的记录条数 0 表示没有记录, 其他数字为多少表示有多少条相同记录,正常有记录的值应该为1,如果值大于1则应该检查是不是重复添加了相同的记录response = client.do_action_with_exception(request)response = str(response, encoding='utf-8')relsult = json.loads(response)return relsult# 更新记录
def updateDomainRecord(client,value,rr,record_id):request = UpdateDomainRecordRequest.UpdateDomainRecordRequest()request.set_accept_format('json')# request.set_Priority('1')request.set_TTL('600')request.set_Value(value) # 新的ip地址request.set_Type('A')request.set_RR(rr)request.set_RecordId(record_id)  # 更新记录需要指定 record_id ,该字段为记录的唯一标识,可以在获取方法的返回信息中得到该字段的值response = client.do_action_with_exception(request)response = str(response, encoding='utf-8')return response# 删除记录
def delDomainRecord(client,subdomain):info = getDomainInfo(subdomain)if info['TotalCount'] == 0:print('没有相关的记录信息,删除失败!')elif info["TotalCount"] == 1:print('准备删除记录')request = DeleteDomainRecordRequest.DeleteDomainRecordRequest()request.set_accept_format('json')record_id = info["DomainRecords"]["Record"][0]["RecordId"]request.set_RecordId(record_id) # 删除记录需要指定 record_id ,该字段为记录的唯一标识,可以在获取方法的返回信息中得到该字段的值result = client.do_action_with_exception(request)print('删除成功,返回信息:')print(result)else:# 正常不应该有多条相同的记录,如果存在这种情况,应该手动去网站检查核实是否有操作失误print("存在多个相同子域名解析记录值,请核查后再操作!")# 有记录则更新,没有记录则新增
def setDomainRecord(client,value,subname,domainname):info = getDomainInfo(subname + '.' + domainname)if info['TotalCount'] == 0:print('准备添加新记录')add_result = addDomainRecord(client,value,subname,domainname)print(add_result)elif info["TotalCount"] == 1:print('准备更新已有记录')record_id = info["DomainRecords"]["Record"][0]["RecordId"]cur_ip = getIp()old_ip = info["DomainRecords"]["Record"][0]["Value"]print ('当前IP:' + cur_ip + '; 原IP:' + old_ip )if cur_ip == old_ip:print ("新ip与原ip相同,不更新!")else:update_result = updateDomainRecord(client,value,subname,record_id)print('更新成功,返回信息:')print(update_result)else:# 正常不应该有多条相同的记录,如果存在这种情况,应该手动去网站检查核实是否有操作失误print("存在多个相同子域名解析记录值,请核查删除后再操作!")# 获取当前IP
IP = getIp()# 获取当前时间
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print('===ready update DNS:' + current_time + '===')# 循环子域名列表进行批量操作
for x in SubDomainList:setDomainRecord(client,IP,x,DomainName)

小结

到此,本文就详细介绍了如何从运营商获取公网IP,并绑定一个域名,同时在服务上跑一个定时任务,运行脚本更新IP和域名的映射关系,实现DDNS。如果有遇到什么问题,欢迎留言讨论

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/52490.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT Quick QML 网络助手——TCP客户端

GitHub 源码: QmlLearningPro ,选择子工程 Nettools.pro QML 其它文章请点击这里: QT QUICK QML 学习笔记 ● 运行效果: 左侧为常用的网络调试工具,右侧为本项目 UI 效果,前端使用 QML ,后端使用C &#xff…

linux(Ubuntu )搭C++ 最新版GDAL完整教程

在前面的文章中主要是介绍如何在windows系统下利用python安装gdal库,如下: 如何快速安装GDAL 在linux环境下python安装gdal也可以利用现成的whl文件,但是安装c GDAL环境的比较麻烦,目前网络上大多是安装的老版本的教程&#xff…

自适应学习率(Datawhale X 李宏毅苹果书 AI夏令营)

传统的梯度下降方法在优化过程中常常面临学习率设置不当的问题。固定的学习率在训练初期可能过大,导致模型训练不稳定,而在后期可能过小,导致训练速度缓慢。为了克服这些问题,自适应学习率方法应运而生。这些方法通过动态调整学习…

ssrf漏洞之——漏洞复现

漏洞介绍 SSRF漏洞:SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由恶意访问者构造url,由服务端对此url发起请求的一个安全漏洞。 漏洞原理 SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,并且没有对目…

工业4G路由器

设备概述 路由器是基于4G 技术研发的无线路由网关设备,除了具备传统路由器 的 VPN 、防火墙、 NAT 、 PPPoE 、 DHCP 等功能之外,还能支持 4G 无线拨号,提供最高可达 150Mbps 的无线高速带宽。路由器支持四个以太网接口,可更好…

谷歌、火狐及Edge等浏览器中实现allWebPlugin中间件自动安装及升级

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品,致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX控件直接嵌入浏览器,实现插件加载、界面显示、接口调用、事件回调等。支持Chrome、Firefo…

【Kotlin设计模式】Kotlin实现单例模式

前言 单例模式(Singleton Pattern),是确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。在 Android 中,有许多系统服务和 API 使用了单例模式,比如: Context: 通过getApplication…

Mora:多智能体框架实现通用视频生成

人工智能咨询培训老师叶梓 转载标明出处 尽管已有一些模型能够生成视频,但大多数模型在生成超过10秒的长视频方面存在局限。Sora模型的出现标志着视频生成能力的一个新时代,它不仅能够根据文本提示生成长达一分钟的详细视频,而且在编辑、连接…

Image Stride(内存图像行跨度)

When a video image is stored in memory, the memory buffer might contain extra padding bytes after each row of pixels. The padding bytes affect how the image is store in memory, but do not affect how the image is displayed. 当视频图像存储在内存时&#xff0…

【USRP】 Link 16 战术数据链 实训系统

Link 16 战术数据链 实训系统 一、基于USRP的Link16平台简介1、整体架构2、JTIDS终端架构3、平台特点3.1、提高技术理解与应用能力3.2、培养创新思维与问题解决能力3.3、加强跨学科融合与团队合作 4、平台建设4.1、基础理论教学模块4.2、LabVIEW 算法模块4.3、USRP仿真模块4.4、…

Unity+Addressable

前期准备 下载一个hfs本地服务器,打开即可 HFS ~ HTTP 文件服务器 (rejetto.com) 1.安装Addressable插件 创建组 2.使用图片创建预制体 放入Addressable Groups内 3.右键 新建组 创建预制体t拖拽放入新建组里 新组命名为Gameobject 简化名称 4.创建一个测试脚本 …

点亮编程之路:如何克服学习中的挫折感

目录 引言 一、心态调整 A. 保持积极乐观的学习态度 1. 接受错误和失败 2. 专注于过程而非结果 3. 设定合理的目标和期望 B. 培养持续学习的习惯 1. 制定学习计划 2. 定期反思和总结 3. 寻找学习的乐趣 二、学习方法 A. 有效的学习策略 1. 分解复杂问题 2. 主动实践…

jmeter中CSV 数据文件设置用例

1、CSV数据文件的基础使用 线程组->添加->配置远近->CSV数据文件设置 2、多条用例运行CSV数据文件 由于我的csv请求的json数据有“,”所以我这边 分隔符选择了*号 写了两行需要测试的用例,需要添加一个“循环控制器” 线程组->添加-&g…

内存管理篇-09伙伴系统初始化一:memblock管理

1.伙伴系统的初始化概述 硬件初始化:计算机加电后进行硬件检测。加载引导程序,将Linux内核加载到内存中。 内核初始化:内核被加载后开始初始化各个子系统。进行CPU架构相关的初始化。初始化内存控制器和其他设备驱动。 内存管理初始化&…

Oracle开始严查Java许可!

0x01、 前段时间在论坛里就看到一个新闻,说“Oracle又再次对Java下手,开始严查Java许可,有企业连夜删除JDK”,当时就曾在网上引起了一阵关注和讨论。 这不最近在科技圈又看到有媒体报道,Oracle再次严查,对…

C语言典型例题51

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 例题4.3 while循环与do……while循环的比较 代码&#xff1a; &#xff08;1&#xff09;while语句 #include <stdio.h> int main() {int sum0;// char ch;while(1){sum0;//每一次输入结束后数的和重置int …

GDB的基本使用(1)

我有话说 因为时间和精力原因&#xff0c;本文写的虎头蛇尾了&#xff0c;除了启动调试与程序执行以外只有少量截图演示&#xff0c;只是简单的说明。如果有需要可以联系我&#xff0c;我有时间的话会把演示补上&#xff0c;谢谢理解。 启动调试与程序执行 启动调试并传递参数…

dubbo:dubbo+zookeeper整合nginx实现网关(四)

文章目录 0. 引言1. nginx简介2. 集成nginx2.1 负载均衡实现 3. 源码4. 总结 0. 引言 我们之前讲解过dubbozookeeper实现服务调用和注册中心&#xff0c;但是还缺乏一个统一的入口&#xff0c;即网关服务。dubbozookeeper的模式更加适合的网关组件为nginx&#xff0c;所以今天…

SQLserver中的触发器和存储过程

在 SQL Server 中&#xff0c;触发器是一种特殊的存储过程&#xff0c;它在指定的数据库表上发生特定的数据修改事件时自动执行。触发器可以用于执行各种任务&#xff0c;如数据验证、数据审计、自动更新相关表等。 触发器的类型 SQL Server 支持以下几种类型的触发器&#x…

如何使用ssm实现开放式教学评价管理系统+vue

TOC ssm121开放式教学评价管理系统vue 第1章 绪论 1.1 背景及意义 系统管理也都将通过计算机进行整体智能化操作&#xff0c;对于开放式教学评价管理系统所牵扯的管理及数据保存都是非常多的&#xff0c;例如个人中心、教师管理、学生管理、游客管理、评价信息管理、综合评…