pip install retry
2. 客户端环境:python3、beautifulsoup4模块、retry模块
这里演示一下windows怎么安装python3和模块。
windows版python3下载地址:https://www.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 retrypip install beautifulsoup4
二、程序运行
1.服务端
服务端运行在云服务器地址上,使用以下命令即可下载运行。
wget https://www.xiaoweigod.com/shell/ddns_server.py python3 ddns_server.py
如图,程序运行后输入上一篇文章你绑定的域名和反代理的端口号,程序会实时监听。
2. 客户端
客户端以windows为例:
程序下载地址:https://www.xiaoweigod.com/shell/ddns_client.py
将下载好的程序放到D盘根目录,然后打开cmd执行以下命令:
d:python ddns_client.py
如图,程序运行后输入服务端的地址,即可开始工作:
这样我们就实现了ddns了。当运行在内网主机上的客户端检测到自己的公网IP变更,则会主动把变更后的IP发送给云服务器上的服务端,服务端检测无误后,将地址写入nginx的配置文件。无论家庭的公网IP怎么变化,都可以正确指向。
运行截图(中间重启了光猫):
我们通过socket随便发个不是IP地址的文本给服务端:
服务端只会接受正确的IP地址格式,并写入配置文件,防止出错。
三、源码
1. server端
#coding=utf-8#author:xiaowei#blog:https://www.xiaoweigod.com/import timeimport socketfrom retry import retryimport os#os.system('clear')server_name=str(input('输入你的网址:'))port=int(input('输入反代理端口号(1-65535):'))if port > 65535: print('端口不合法!') exit()elif port <1: print('端口不合法!') 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('地址不合法!')# elif len(new_ip)<8;# print('玩蛇皮')# else:# print("客户机公网地址变更:",new_ip)def write_to(): proxy='server{\nlisten 80;\nserver_name aaa.xiaoweigod.com;\nlocation / {\n proxy_pass http://'+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('非法地址!') continue else: write_to()
2. client端
#coding=utf-8#author:xiaowei#blog:https://www.xiaoweigod.com/import urllib.requestfrom bs4 import BeautifulSoupimport socketimport timefrom urllib.error import URLErrorfrom retry import retryip_addr=str(input('输入服务端IP:'))ip_port=8888#ip_port=int(input('输入服务端端口(1-65535):'))#if ip_port > 65535:# print('端口不合法!')# exit()#elif ip_port <1:# print('端口不合法!')# exit()@retry()def get_ip(): url = 'http://www.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########继续检查########")