使用Python实现动态公网IP和域名动态解析(DDNS)

使用Python实现动态公网IP和域名动态解析(DDNS)

在当今互联网时代,经常有需求需要将一台本地的计算机或者服务器通过一个固定的域名进行访问。然而,由于家庭网络或小型办公室的公网IP地址常常是动态的,这给我们造成了很大的困扰。为了能够确保每次访问都能正确地指向当前的公网IP,我们可以使用动态域名系统(Dynamic Domain Name System,简称DDNS)。

什么是动态DNS(DDNS)?

动态DNS是一种允许用户自动更新域名记录的服务。通过使用DDNS,即使公网IP发生改变,域名也能指向新的IP地址,确保了域名的可用性和访问的稳定性。

实现动态DNS的基本思路

实现动态DNS的基本步骤有:

  1. 定期获取当前的公网IP地址。
  2. 检查获取到的IP地址与之前记录的IP地址是否相同。
  3. 如果不同,调用DNS服务提供商的API来更新域名的A记录。

所需库和工具

在开始之前,我们需要一些Python库:

  • requests:用于发送HTTP请求。
  • json:用于处理JSON数据。

可以通过以下命令安装所需库:

pip install requests

获取公网IP的代码示例

我们可以使用一个第三方服务来获取公网IP。这里以ipify为例,以下是获取公网IP的示例代码:

import requests

def get_public_ip():
    response = requests.get('https://api.ipify.org?format=json')
    if response.status_code == 200:
        return response.json().get('ip')
    else:
        print("无法获取公网IP")
        return None

更新域名的DNS记录

我们所使用的域名服务商通常会提供API接口来更新DNS记录。这里以Cloudflare为例,更新DNS记录的代码如下:

def update_dns_record(api_token, zone_id, record_id, ip_address):
    url = f"https://api.cloudflare.com/client/v4/zones/{zone_id}/dns_records/{record_id}"
    headers = {
        "Authorization": f"Bearer {api_token}",
        "Content-Type": "application/json",
    }
    data = {
        "type": "A",
        "name": "yourdomain.com",
        "content": ip_address,
        "ttl": 120,
    }
    response = requests.put(url, headers=headers, json=data)
    if response.status_code == 200:
        print("DNS记录更新成功")
    else:
        print("更新DNS记录失败:", response.json())

将所有部分结合在一起

我们可以将获取公网IP和更新DNS记录的代码结合到一个脚本中,定期检查并更新DNS记录。完整的代码示例如下:

import time

API_TOKEN = 'your_api_token'
ZONE_ID = 'your_zone_id'
RECORD_ID = 'your_record_id'

def main():
    last_ip = None
    while True:
        current_ip = get_public_ip()
        if current_ip and current_ip != last_ip:
            update_dns_record(API_TOKEN, ZONE_ID, RECORD_ID, current_ip)
            last_ip = current_ip
        time.sleep(300)  # 每5分钟检查一次

结束语

通过以上步骤,我们实现了一个简单的动态DNS更新脚本。只需在合适的位置填入你的API密钥、域名和记录ID,就可以成功使用。该脚本将定期检查公网IP地址,并在发生变化时更新DNS记录,从而确保域名可以正确指向当前的IP地址。

需要注意的是,不同的域名服务商的API可能有所不同,因此在使用时请查阅相应的文档以获取具体接口信息。希望这篇文章能帮助您快速实现动态DNS功能,使得网络访问变得更加稳定和方便。

THE END