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

news2024/12/28 3:07:28

如果将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.coloradmin.cn/o/920230.html

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

相关文章

网络知识点之-堆叠与集群(2-集群)

本文章收录至《网络》专栏&#xff0c;点击右上角专栏图标可访问本专栏&#xff01; 集群是一种用于集团调度指挥通信的​​​​​​移动通信系统&#xff0c;主要应用在专业移动通信领域。该系统具有的可用信道可为系统的全体用户共用&#xff0c;具有自动选择信道功能&#x…

5G NR:PRACH频域资源

PRACH在频域位置由IE RACH-ConfigGeneric中参数msg1-FrequencyStart和msg1-FDM所指示&#xff0c;其中&#xff0c; msg1-FrequencyStart确定PRACH occasion 0的RB其实位置相对于上行公共BWP的频域其实位置(即BWP 0)的偏移&#xff0c;即确定PRACH的频域起始位置msg1-FDM的取值…

UNIX网络编程卷一 学习笔记 第二十八章 原始套接字

原始套接字提供普通的TCP和UDP套接字不具备的以下3个能力&#xff1a; 1.有了原始套接字&#xff0c;进程可以读写ICMPv4、IGMPv4、ICMPv6等分组。例如&#xff0c;ping程序就使用原始套接字发送ICMP回射请求并接收ICMP回射应答。多播路由守护程序mrouted也使用原始套接字发送和…

Linux服务——http协议及nginx服务

目录 一、HTTP协议 1、跨网络的主机间通讯方式 套接字相关的系统调用 2、HTTP协议访问网站的过程 3、http协议状态码分类 常见的http协议状态码 4、MIME 5、URL组成 6、HTTP协议版本 7、系统处理http请求的工作模式 8、apache与nginx的区别 二、I/O模型 I/O模型相关…

春秋云镜 CVE-2019-16113

春秋云镜 CVE-2019-16113 Bludit目录穿越漏洞 靶标介绍 在Bludit<3.9.2的版本中&#xff0c;攻击者可以通过定制uuid值将文件上传到指定的路径&#xff0c;然后通过bl-kernel/ajax/upload-images.php远程执行任意代码。 启动场景 漏洞利用 exp https://github.com/Kenun…

Matlab绘制灰度图像

灰度图介绍 灰度图像是指每个像素的信息由一个量化的灰度级来描述的图像。如果每个像素的灰度值用一个字节表示&#xff0c;灰度值级数就等于256级&#xff0c;每个像素可以是0-255之间的任何一个数。其特点是&#xff1a;它只有亮度信息&#xff0c;没有颜色信息。占据存储空…

Java IO流(四)Netty理论[模型|核心组件]

概述 Netty是由JBOSS提供的一个Java开源框架,可从Github获取独立项目Netty是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端(摘录官网)Netty所谓的异步是针对用户使用Channel进行IO操作,会立即返回ChannelFuture。但IO操作的任务是提…

AutoSAR配置与实践(基础篇)3.5 BSW 的模式管理

传送门 -> AUTOSAR配置与实践总目录 AutoSAR配置与实践(基础篇)3.5 BSW 的模式管理 一、模式管理的组成二、模式项内容简介一、模式管理的组成 AUTOSAR为ECU的运行时软件的状态处理提供了模式管理组件,如下 • BswM模式管理器 • NM网络管理 • EcuM状态管理器 • ComM通…

Kaggle分类问题Titanic——Machine Learning from Disaster

目录 前言1 题目介绍2 数据清洗3 数据可视化分析4 模型训练5 源码 前言 这是我在大三选修课的课程设计&#xff0c;内容参考了Kaggle上高赞的代码&#xff0c;有详细批注&#xff0c;整体比较基础&#xff0c;结构相对完整&#xff0c;便于初学者学习。这个是一个分类问题&am…

vue 简单实验 v-if 条件判定

1.代码 <script src"https://unpkg.com/vuenext" rel"external nofollow" ></script> <div id"conditional-rendering"><span v-if"seen">现在你看到我了</span> </div> <script> const C…

纷享销客入选“寻找创新的「踏脚石」|36氪数字创新标杆案例”

近日&#xff0c;36氪重磅发布“数字创新标杆案例&先进团队名册”&#xff0c;本期围绕寻找创新的「踏脚石」的主题&#xff0c;共遴选出36个数字创新标杆案例与10个先进团队&#xff0c;纷享销客连接型CRM凭借过硬的产品及自主科研创新实力和服务实践有幸入选。 此次评选历…

分布式定时任务框架Quartz总结和实践(2)—持久化到Mysql数据库

本文主要介绍分布式定时任务框架Quartz集成SpringBoot持久化数据到Mysql数据库的操作&#xff0c;上一篇文章使用Quartz创建定时任务都是保存在内存中&#xff0c;如果服务重启定时任务就会失效&#xff0c;所以Quartz官方也提供将定时任务等信息持久化到Mysql数据库的功能&…

[docker][WARNING]: Empty continuation line found in:

报警内容&#xff1a; 下面展示一些 内联代码片。 //执行 sudo docker build ubuntu:v1.00 . [WARNING]: Empty continuation line found in:出现上述错误原因为18行多了一个 " \" 符号&#xff0c;去除即可

Hexo添加相册

首发博客地址 https://blog.zysicyj.top/ 视频教学地址 https://www.bilibili.com/video/BV1Fw411Q7pS/ 打开butterfly配置文件&#xff0c;在menu处新增一行 menu: 主页: / || fas fa-home 时间轴: /archives/ || fas fa-archive 标签: /tags/ || fas fa-tags 分类: /cate…

函数模版c++

泛型编程 如何实现一个通用的交换函数呢&#xff0c;利用c函数重载的方式 void Swap(int& left, int& right) { int temp left; left right; right temp; } void Swap(double& left, double& right) { double temp left; left right; right temp; } vo…

AMBA总线协议(9)——AHB(七):终章

一、前言 在之前的文章中我们讲述了AHB协议的分割传输机制&#xff0c;它使得从机可以决定一次传输是否继续进行&#xff0c;以防止 传输的执行将占据大量的时钟周期&#xff0c;有效提高了总线的公平性与效率问题&#xff0c;本文中我们将一次性学习完AHB最后的内容&#xff0…

蚂蚁 SOFAServerless 微服务新架构的探索与实践

赵真灵&#xff08;有济&#xff09; 蚂蚁集团技术专家 Serverless 和微服务领域专家曾负责基于 K8s Deployment 的应用发布运维平台建设、K8s 集群的 Node/pod 多级弹性伸缩与产品建设。当前主要负责应用架构演进和 Serverless 相关工作。同时也是 SOFAArk 社区的开发和维护者…

【CP2K学习】-在Ubuntu上安装CP2K的全过程(包括gcc,gfortran,MKL等配置)

在Ubuntu中安装CP2K CP2K的安装检查系统是否安装gcc,gfortranMKL数学库的安装CP2K安装包下载CP2K的编译CP2K的测试ssmp版本测试popt版本测试 CP2K是第一性原理计算程序中发展迅速的程序之一&#xff0c;因其开源性、速度性等优点&#xff0c;是广大计算化学研究者的选择。 本文…

2023.8各大浏览器11家对比:Edge/Chrome/Opera/Firefox/Tor/Vivaldi/Brave,安全性,速度,体积,内存占用

测试环境&#xff1a;全默认设置的情况下&#xff0c;均在全新的系统上进行测试&#xff0c;系统并未进行任何改动&#xff0c;没有杀毒软件&#xff0c;浏览器进程全部在后台&#xff0c;且为小窗模式&#xff0c;小窗分辨率均为浏览器厂商默认缩放大小(变量不唯一)&#xff0…

C#|如何调试进依赖动态库中

第一步&#xff1a;打开项目属性 第二步 打开debug的本地调试可用 第三步 把要调试的代码拖进主界面打断点就可以进断点了