如果将PC电脑变成web服务器:使用python3监测公网IP实现DDNS

如果将PC电脑变成web服务器:使用python3监测公网IP实现DDNS

上一篇文章中,我们使用Nignx的反向代理和端口转发实现域名访问家里主机上的web了。

由于家庭宽带基本都是动态IP,每当你重启一次光猫,IP地址就会变化一次。当光猫因为停电、故障、维护等原因重启过后,网站就无法访问了。网上基本的解决方法是使用花生壳做DDNS(动态域名解析),但那个需要绑定自己的域名要付费不说,且linux无法使用,本文通过python和socket实现DDNS。

(因平台原因本文中www即为xxx ,com即为zzz,http/ccccc即为cccc/ccccc)

这个程序是一个典型的C/S程序,有客户端和服务端。画张草图来解释下这个python程序的运行原理:

 

说明:这个程序分为客户端和服务端。客户端运行在内网主机上,服务端运行在服务器上。客户端会每隔30秒主动检测一次自己的公网IP是否变化,如果地址改变,则会通过socket连接服务端程序,把改变后的地址发送给服务端。服务端接收到地址后,先校验一遍地址是否合fa,如果地址OK,那么将地址写入Nginx的反代理配置文件,反代理生效并指向新的内网主机公网地址,从而实现DDNS。

一、程序的使用环境

服务器系统需是centos7,内网主机可以是windows或者centos7。

注意:程序是使用python3开发的,不兼容python2。因此如果使用centos7默认自带的python2运行会报错。

1. 服务端环境:python3、retry模块。

python3环境搭建请看主页

搭建完成后,使用pip安装retry模块:

pip install retry

2. 客户端环境:python3、beautifulsoup4模块、retry模块

这里演示一下windows怎么安装python3和模块。

windows版python3地址:ccccc://xxx.python.org/ftp/python/3.6.5/python-3.6.5-amd64.exe

直接打开安装,记得把下图箭头的地方勾上:

 

装完了win+R运行cmd,打开命令提示符窗口,输入python -V。有如下回显表示成功:

 

然后我们更新一下pip版本到10.0.1,默认的是9.0.3:

python -m pip install --upgrade pip

安装retry和beautifulsoup4模块

pip install retry

pip install beautifulsoup4

 

 

二、程序运行

1.服务端

服务端运行在服务器地址上,使用以下命令即可下载运行。

wget ccccc://xxx.27server.zzz/shell/ddns_server.py ;

python3 ddns_server.py

如图,程序运行后输入上一篇文章你绑定的域名和反代理的端口号,程序会实时监听。

 

2. 客户端

客户端以windows为例:

程序地址:ccccc://xxx.27server.zzz/shell/ddns_client.py

将下载好的程序放到D盘根目录,然后打开cmd执行以下命令:

d:

python ddns_client.py

如图,程序运行后输入服务端的地址,即可开始工作:

 

这样我们就实现了ddns了。当运行在内网主机上的客户端检测到自己的公网IP变更,则会主动把变更后的IP发送给云服务器上的服务端,服务端检测无误后,将地址写入nginx的配置文件。无论家庭的公网IP怎么变化,都可以正确指向。

运行截图(中间重启了光猫):

 

我们通过socket随便发个不是IP地址的文本给服务端:

 

服务端只会接受正确的IP地址格式,并写入配置文件,防止出错。

三、源码

#coding=utf-8

import timeimport socketfrom retry import retryimport os

os.system('clear')

server_name=str(input('输入你的网址:'))

port=int(input('输入反代理端口号(1-65535):'))if port > 65535:

print('端口不合fa!')

exit()elif port <1:

print('端口不合fa!')

exit()

@retry()def recv_ip():

sk=socket.socket(socket.AF_INET,socket.SOCK_STREAM,socket.IPPROTO_TCP)

addr=('0.0.0.0',8888)

sk.bind(addr)

sk.listen(1)

conn,addr=sk.accept()

global new_ip

new_ip=conn.recv(30).decode()

#sk.sendto(send_data,addr)

sk.close()

conn.close()

if len(new_ip)>15:

print('地址不合fa!')

elif len(new_ip)<8;

print('xxx')

else:

print("客户机公网地址变更:",new_ip)

def write_to():

proxy='server{\nlisten 80;\nserver_name xxx.27server.com;\nlocation / {\n    proxy_pass cccc://'+new_ip+':'+str(port)+';\n} \n access_log off;\n   }';

os.remove('/usr/local/nginx/conf/vhost/'+server_name+'.conf')

f=open('/usr/local/nginx/conf/vhost/'+server_name+'.conf','w',encoding='utf-8')

f.write(proxy)

f.close()

print("----写入配置文件成功----")

os.system('service nginx restart')

print("已生效,当前反代理规则为:"+new_ip+':'+str(port))

print('\n------继续监听ing..------')

print("开始监听客户机")

recv_ip()

write_to()

i=0while i==0:

time.sleep(5)

recv_ip()

if new_ip == None:

print('地址不能为空!')

continue

elif new_ip==[]:

print('禁止元素!')

continue

elif len(new_ip) >15:

print('地址过长!')

continue

elif len(new_ip)<8:

print('非fa地址!')

continue

else:

write_to()

2. client端

#coding=utf-8#author:aixi#blog:ccccc://xxx.27server.zzz/

import urllib.requestfrom bs4 import BeautifulSoupimport socketimport timefrom urllib.error import URLErrorfrom retry import retry

ip_addr=str(input('输入服务端IP:'))

ip_port=8888#ip_port=int(input('输入服务端端口(1-65535):'))#if ip_port > 65535:#    print('端口不合fa!')#    exit()#elif ip_port <1:#    print('端口不合法!')#    exit()

@retry()def get_ip():

url = 'cccc://xxx.net.cn/static/customercare/yourip.asp'

req = urllib.request.Request(url)

rsp=urllib.request.urlopen(req)

html=rsp.read().decode('utf-8',"ignore")

html=BeautifulSoup(html,'html.parser')

iph2=html.h2

global ip

ip=iph2.get_text()

#print("你的公网IP是:",ip)

@retry()def send_ip():#    ip_addr='alish02.ssrcn.me'

addr=(ip_addr,ip_port)

sk=socket.socket(socket.AF_INET,socket.SOCK_STREAM,socket.IPPROTO_TCP)

sk.connect(addr)

sk.send(ip.encode())

sk.close()

print("\n----开始侦测本机公网IP地址----")

get_ip()

send_ip()

i=0while i == 0:

get_ip()

print ("当前公网IP:",ip)

tmp1_ip=ip#    print("tmp1_ip:",tmp1_ip)

print("------休息30秒------")

time.sleep(30)

get_ip()

tmp2_ip=ip#   print("tmp2_ip:",tmp2_ip)

if tmp1_ip == tmp2_ip:

print("########OJBK,地址没变!########")

else:

ip=tmp2_ip

print("公网地址改变:",ip)

send_ip()

print("同步到远程服务器成功!")

print("\n########继续检查########")

我是艾西,今天的分享就到这里啦希望对有需要的小伙伴有帮助我们下期见

拥有一台服务器可以做很多有趣的事情!

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

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

相关文章

ubuntu修改默认文件权限umask

最近在使用ubuntu的过程中发现一个问题&#xff1a; 环境是AWS EC2&#xff0c;登录用户ubuntu&#xff0c;系统默认的umask是027&#xff0c;修改/etc/profile文件中umask 027为022后&#xff0c;发现从ubuntu用户sudo su过去root用户登录查询到的umask还是027&#xff0c;而…

C++动态库编程 | C++名称改编、标准C接口、extern “C”、函数调用约定以及def文件详解

目录 1、导入导出声明 2、C函数名称改编与extern "C" 3、函数调用约定与跨语言调用 3.1、函数调用约定 3.2、跨语言调用dll库接口 3.3、函数调用约定以哪个为准 4、def文件的使用 5、在C程序中引用ffmpeg库中的头文件链接报错问题 6、最后 VC常用功能开发汇…

基于RUM高效治理网站用户体验入门-价值篇

用户体验 用户体验基本包含访问网站的性能、可用性和正确性。通俗的讲&#xff0c;就是一把通过用户访问测量【设计者】意图的尺子。 本文目的 网站如何传递出设计者的意图&#xff0c;可能收页面加载时间太长、或者页面在用户的浏览器中渲染时间太慢&#xff0c;或者第三方设…

使用Maven父工程构建spring boot子工程

1.父工程删除src目录&#xff0c;pom文件配置parent为spring-boot-starter-parent 2.创建子工程&#xff0c;子工程引入一个springboot相关依赖 注意&#xff1a;子工程引入springboot相关依赖之后子工程才能被解析为springboot模块

单片机学习-蜂鸣器如何发出声音

硬件电路 软件编写 ①发出声音 #include "reg52.h" typedef unsigned int u16; // 重新定义 类型 typedef unsigned char u8; // 重新定义 类型sbit BEEP P2^5; //定义 P2第五个管教 为BEEP // 延时函数 void delay_time(u16 times) {while(times--); } vo…

qt tableview setEditTriggers解析

EditTrigger EditTrigger是QAbstractItemView Class的Public Function This property holds which actions will initiate item editing 此属性保存哪些操作将启动项编辑 This property is a selection of flags defined by EditTrigger, combined using the OR operator. T…

python编程环境使用技巧2-python环境迁移

Python环境迁移步骤 将Python环境从一个计算机迁移到另一个计算机可以按照以下步骤进行&#xff1a; 1-备份环境&#xff1a; 在源计算机上&#xff0c;使用pip工具备份当前Python环境的包列表到一个文本文件。在命令行终端中执行以下命令&#xff1a; pip freeze > requi…

layUI 中 穿梭框无法获取值的细节问题

初始化的时候一定要指定id&#xff0c;不然就会出现无法调用 获得右侧数据和实例重载的方法

C++ Primer 第2章 变量和基本类型

C Primer 第2章 变量和基本类型 2.1 基本内置类型2.1.1 算术类型一、带符号类型和无符号类型练习 2.1.2 类型转换一、含有无符号类型的表达式 2.1.3 字面值常量一、整型和浮点型字面值二、字符和字符串字面值三、转义序列四、指定字面值的类型五、布尔字面值和指针字面值 2.2 变…

网络字节序——TCP接口及其实现简单TCP服务器

网络字节序——TCP接口及其实现简单TCP服务器 文章目录 网络字节序——TCP接口及其实现简单TCP服务器简单TCP服务器的实现1. 单进程版&#xff1a;客户端串行版2. 多进程版&#xff1a;客户端并行版netstat查看网络信息3.多线程版&#xff1a;并行执行log.hpp 守护进程fg、bg s…

Vue的使用

Vue的使用 Vue到底是啥&#xff1f;Vue中包含了两部分虚拟DOM 模块化编程虚拟DOM&#xff0c;在我们重用模板的时候&#xff0c;在Vue中存在虚拟DOM 虚拟DOM是为了更好的去重用我们的DOM (增加元素的时候&#xff0c;先去虚拟DOM找是否存在&#xff0c;如果有那么不用生成&am…

android系统启动流程之init启动分析

先根据上图来描述下安卓整个系统的启动流程&#xff1a; 当上电时&#xff0c;系统先执行BootRom, 加载引导程序执行。 然后进入bootloader&#xff0c;在安卓系统中基本上这个bootloader是uboot, 通过uboot引导启动内核&#xff0c;此时运行在kernel空间&#xff0c;这时的i…

【Go 基础篇】Go语言中的自定义错误处理

错误是程序开发过程中不可避免的一部分&#xff0c;而Go语言以其简洁和高效的特性闻名。在Go中&#xff0c;自定义错误&#xff08;Custom Errors&#xff09;是一种强大的方式&#xff0c;可以为特定应用场景创建清晰的错误类型&#xff0c;以便更好地处理和调试问题。本文将详…

基于Googlenet深度学习网络的交通工具种类识别matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ....................................................................................% 获…

SpringCloud之断路器聚合监控

一、Hystrix Turbine简介 看单个的Hystrix Dashboard的数据并没有什么多大的价值&#xff0c;要想看这个系统的Hystrix Dashboard数据就需要用到Hystrix Turbine。Hystrix Turbine将每个服务Hystrix Dashboard数据进行了整合。Hystrix Turbine的使用非常简单&#xff0c;只需要…

CSS中如何改变鼠标指针样式(cursor)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ CSS中改变鼠标指针样式&#xff08;cursor&#xff09;⭐ 示例&#xff1a;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅…

废品回收抢单派单小程序开源版开发

废品回收抢单派单小程序开源版开发 用户注册和登录&#xff1a;用户可以通过手机号码注册和登录小程序&#xff0c;以便使用废品回收抢单派单功能。废品回收订单发布&#xff1a;用户可以发布废品回收订单&#xff0c;包括废品种类、数量、回收地点等信息。废品回收抢单&#…

【CSS】网站 网格商品展示 模块制作 ( 清除浮动需求 | 没有设置高度的盒子且内部设置了浮动 | 使用双伪元素清除浮动 )

一、清除浮动需求 ( 没有设置高度的盒子且内部设置了浮动 ) 绘制的如下模块 : 在上面的盒子中 , 没有设置高度 , 只设置了一个 1215px 的宽度 ; 在列表中每个列表项都设置了 浮动 ; /* 网格商品展示 */ .box-bd {/* 处理列表间隙导致意外换行问题一排有 5 个 228x270 的盒子…

Aidex 移动端快速开发框架# RuoYi-Uniapp项目,uniapp vue app项目跨域问题

参考地址&#xff1a; manifest.json官方配置文档&#xff1a;manifest.json 应用配置 | uni-app官网 Chrome 调试跨域问题解决方案之插件篇&#xff1a; uni-app H5跨域问题解决方案&#xff08;CORS、Cross-Origin&#xff09; - DCloud问答 其实uni-app官方有解决跨域的办…

逆向抓包大神

0x01 前言 抓包应该是我们逆向的第一步&#xff0c;只有先抓到包&#xff0c;才能决定我们是否要进行脱壳、逆向。万一他没有加密、万一数据不是我们想要的那岂不是白忙活了。但是目前很APP都设置了门槛&#xff0c;比如新版的抖音、淘宝、天眼查等挂上代理就直接无数据或者就…