axfr-get:致命的:无法解析AXFR结果:协议错误和解决方案

时间:2020-01-09 10:37:17  来源:igfitidea点击:

我试图使用tcpclient从主tinydns服务器到辅助DNS服务器获取数据(AXFR查询),如下所示:tcpclient -v a.ns.example.com 53 axfr-get example.com example.com example.com.tmp

但是我得到一个错误,内容如下:

axfr-get: fatal: unable to parse AXFR results: protocol error
axfr-get:致命:无法解析AXFR结果:协议错误

我该如何解决这个问题?

确保axfrdns已配置并正在运行

axfrdns是djbdns提供的DNS区域传输服务器。
它从其标准输入读取DNS-over-TCP格式的区域传输请求,并以本地配置的信息作为响应。
使用netstat命令或sockstat命令查看当前端口状态:

# netstat -tulpn | grep :53

或者

# sockstat -4 -p 53

确保TCP端口53对外开放

确保防火墙没有阻止tcp端口53。
使用iptables命令列出当前的防火墙规则:

# iptables -L -n
# iptables -L -n | less
# iptables -L -n | grep 53

可以使用以下命令列出PF防火墙规则:

# pfctl -sr
# pfctl -sr | grep "port = domain"

如何在Linux Iptables防火墙下打开TCP端口53?

如下更新脚本(假设202.54.1.1是tinydns/axfrdns服务器地址):

$IPT -A INPUT -i eth0 -s 0/0 -d 202.54.1.1 -p udp --dport 53 -j ACCEPT
$IPT -A INPUT -i eth0 -s 0/0 -d 202.54.1.1 -p tcp --dport 53 -j ACCEPT

如何在* BSD PF防火墙下打开TCP端口53?

如下更新您的/etc/pf.conf(假定202.54.1.1是tinydns/axfrdns服务器地址):

pass in on $ext_if inet proto udp from any to 202.54.1.1 port domain
pass in on $ext_if inet proto tcp from any to 202.54.1.1  port domain flags S/SA synproxy state

确保为axfrdns正确设置了TCP规则

tcp文件定义AXFR的规则。
以下内容将仅允许AXFR进入ns2.example.com,但不允许进入其他地方(tcp文件位于/etc/axfardns或/var/axfardns目录中):

ns2.example.com:allow,AXFR="example.com"
:allow,AXFR=""

保存并关闭文件。
运行make更新更改:

# make

仅ns2.example.com允许传输区域,其他人只能连接到TCP端口53。

故障排除技巧:Dig和tcpclient命令

尝试tcpclient命令,如下所示:

$ tcpclient -v ns1.example.com 53 axfr-get example.com fn fn.tmp

尝试将客户端IP传递到ns1.example.com(如果您有多个IP地址,则需要这样做):

$ tcpclient -i ns2.example.com -v ns1.example.com 53 axfr-get oxdba.net fn fn.tmp

尝试使用dig命令,如下所示:

$ dig @ns1.example.com example.com A +tcp
$ dig @ns1.example.com example.com AXFR +tcp