首页 > 编程语言 >如果将PC电脑变成web服务器:使用python3监测公网IP实现DDNS​

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

时间:2023-08-23 15:38:21浏览次数:71  
标签:web IP socket ip 地址 公网 print 服务端

如果将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程序的运行原理:

如果将PC电脑变成web服务器:使用python3监测公网IP实现DDNS​_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

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

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


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

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


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

python -m pip install --upgrade pip

安装retry和beautifulsoup4模块

pip install retry

pip install beautifulsoup4

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


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


二、程序运行

1.服务端

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

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

python3 ddns_server.py

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

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


2. 客户端

客户端以windows为例:

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

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

d:

python ddns_client.py

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

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


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

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

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


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

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


服务端只会接受正确的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########继续检查########")


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

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


标签:web,IP,socket,ip,地址,公网,print,服务端
From: https://blog.51cto.com/idc02/7203245

相关文章

  • WebDriver.__init__() got an unexpected keyword argument 'desired_capabilities'
    我的selenium的版本是4.11.2selenium4.10中已经不支持desired_capabilities参数如果要传这个参数的话建议用selenium==4.9.1参考《Appium新版本引发的一个问题》......
  • 【python】python开源代理ip池
    一、前言随着互联网的不断发展,越来越多的应用需要使用高匿代理IP才能访问目标网站,而代理IP作为一种能够隐藏本机真实IP地址的工具,在网络抓取、搜索引擎排名、广告投放、反爬虫等方面有着广泛的应用场景。但是,由于代理IP的稳定性难以保证,而且容易被反爬虫机制识别和封杀,为解决这些......
  • [刷题笔记] Luogu P2679 [NOIP2015 提高组] 子串
    ProblemDescription我们可以换个思路。从字符串\(A\)中拿出\(k\)个字串使其变成\(B\)。求有几种不同的方案?Analysis我们发现\(A\)中的一个字符取或者不取影响后面的决策,这并不代表它一定有后效性,我们可以记录这一层状态。和最长公共子序列同理,定义\(f_{i,j,k,l}(\fo......
  • 代理IP与Socks5代理:跨界电商智能爬虫的引擎与安全壁垒
    一、代理IP:智能爬虫的引擎多地区数据采集: 代理IP允许企业模拟不同地区的IP地址,轻松实现多地区数据采集。这为企业洞察全球市场需求提供了重要数据支持。规避反爬虫机制: 代理IP通过随机切换IP地址,规避了网站的反爬虫机制,确保数据采集的稳定性和连续性。突破地理封锁: 代理IP使企业......
  • 代理IP与Socks5代理:跨界电商智能爬虫的引擎与安全壁垒
    一、代理IP:智能爬虫的引擎多地区数据采集: 代理IP允许企业模拟不同地区的IP地址,轻松实现多地区数据采集。这为企业洞察全球市场需求提供了重要数据支持。规避反爬虫机制: 代理IP通过随机切换IP地址,规避了网站的反爬虫机制,确保数据采集的稳定性和连续性。突破地理封锁: 代理IP使企业......
  • 如何将PC电脑变成web服务器:将内网主机映射到外网实现远程访问
    如何将PC电脑变成web服务器:将内网主机映射到外网实现远程访问我是艾西,今天跟大家分享内容还是比较多人问的一个问题:如何将PC电脑变成web服务器。内网主机作为web服务器,内容包括本地内网映射、多层内网映射解决方案、绕过电信80端口封锁、DDNS功能的实现(非花生壳)、网站加速等。这也......
  • 如果将PC电脑变成web服务器:利用Nignx反向代理绕过运营商对80端口封锁
    如果将PC电脑变成web服务器:利用Nignx反向代理绕过运营商对80端口封锁在上一篇文章中,我们已经实现了内网主机的多次端口映射,将内网主机的端口映射到了公网,可以通过公网访问该主机了。因为电信的家庭宽带,默认是屏蔽80和443这类常规web端口的,我们可以用Nginx的反向代理,轻松绕过屏蔽。......
  • 【校招VIP】产品职位理解之团队的配合和推进
    考点介绍:对于简历上有实习经验的同学,对于团队配合和项目推进是一个非常常见的提问点。产品经理经常会面临项目延期,无法上线的情况。基于此,产品经理应该做些什么来保障项目按时上线呢?一、考点题目1.群面中,计时者发现自己过于投入问题本身的思考,在某个环节超时1分钟未提醒,以下哪......
  • 配置反编译eclipse直接查看源码
    https://blog.csdn.net/chinaxiaofeng8/article/details/81773729?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-3-81773729-blog-122870963.235%5Ev38%5Epc_relevant_anti_t3_base&depth_1-utm_source......
  • [React Typescript] JSX.IntrinsicElements
    interfaceIntrinsicElements{//HTMLa:React.DetailedHTMLProps<React.AnchorHTMLAttributes<HTMLAnchorElement>,HTMLAnchorElement>;abbr:React.DetailedHTMLProps<React.HTMLAttributes<HTMLElemen......