dnspython2如何创建或修改DNS A类型记录 现有实现代码不生效求助
DNS A记录增改失败修复方案
前置排查项
- 确认依赖为最新稳定版
dnspython,可执行pip install --upgrade dnspython完成安装更新 - 确认自有DNS服务器已开启当前客户端IP的动态更新权限:BIND服务需在对应zone配置中添加
allow-update { 客户端IP/32; };规则,其他DNS服务需开放对应动态更新权限,这是更新失败的高频原因 - 确认入参格式符合要求:
ZONE_NAME为DNS区域名,末尾必须加.代表绝对域名,例:example.com.- 目标记录为主机名
test.example.com时,name参数传test即可,无需拼接完整域名 rdtype固定传入字符串A,rdata为字符串格式的IPv4地址
- 原代码无返回结果校验,无法定位具体错误类型
修正后的创建A记录代码
import dns.update import dns.query import dns.rcode # 以下参数请替换为实际环境值 ZONE_NAME = "example.com." DNS_SERVER_ADDRESS = "你的DNS服务器IP" name = "目标主机名" ttl = 300 rdtype = "A" rdata = "目标记录IP" try: update = dns.update.Update(ZONE_NAME) update.add(name, ttl, rdtype, rdata) response = dns.query.tcp(update, DNS_SERVER_ADDRESS, timeout=10) rcode_val = dns.rcode.from_flags(response.flags, response.ednsflags) if rcode_val == dns.rcode.NOERROR: print("A记录创建成功") else: print(f"创建失败,错误码:{dns.rcode.to_text(rcode_val)}") except Exception as e: print(f"请求异常:{str(e)}")
修正后的修改A记录代码
使用replace方法的逻辑无误,若需要仅修改已存在的记录,可增加预查询校验逻辑,代码如下:
import dns.update import dns.query import dns.rcode import dns.resolver # 以下参数请替换为实际环境值 ZONE_NAME = "example.com." DNS_SERVER_ADDRESS = "你的DNS服务器IP" name = "目标主机名" ttl = 300 rdtype = "A" new_rdata = "修改后的IP地址" try: # 预查询校验记录是否存在,不需要可删除该部分 resolver = dns.resolver.Resolver() resolver.nameservers = [DNS_SERVER_ADDRESS] old_records = resolver.resolve(f"{name}.{ZONE_NAME}", rdtype) print(f"原记录值:{[r.address for r in old_records]}") update = dns.update.Update(ZONE_NAME) update.replace(name, ttl, rdtype, new_rdata) response = dns.query.tcp(update, DNS_SERVER_ADDRESS, timeout=10) rcode_val = dns.rcode.from_flags(response.flags, response.ednsflags) if rcode_val == dns.rcode.NOERROR: print("A记录修改成功") else: print(f"修改失败,错误码:{dns.rcode.to_text(rcode_val)}") except dns.resolver.NXDOMAIN: print("待修改记录不存在,请先创建") except Exception as e: print(f"操作异常:{str(e)}")
内容的提问来源于stack exchange,提问作者yAm
相关产品推荐
相关产品推荐

