如何通过Python或Perl查询DNS地址的网关

时间:2015-12-28 13:35:54

标签: python perl dns dhcp

Linux / Windows可以从路由器获取DNS地址

我需要编写一个本地dns代理,如何获取操作系统的DNS服务器地址,是否有任何Perl或Python模块可以执行此操作?

更新

问题应该是清楚的,我需要一些东西来模拟接口启动和协议与本地路由器通信,我不能在接口启动之前接受tcpdump。不确定互联网上是否有样本跟踪文件。可能它不是我不熟悉的IP协议。

UPDATE2

dns

当我使用本地DNS代理服务器时,TCP配置就像显示在图片中

如果我查询Net :: DNS :: Resolver,我得到结果:127.0.0.1这不是我需要的

3 个答案:

答案 0 :(得分:3)

非常长,格式化的评论支持Steffen的回答。

TLDR :Steffen正确(+1 BTW)。 Net :: DNS :: Resolver可以为您提供所需的信息。

实施例

#!perl
use strict;
use warnings;

use Net::DNS::Resolver;

#configure a resolver object using your OS's current config.
my $resolver = Net::DNS::Resolver->new;

print join "\n", $resolver->nameservers;

在Windows和Windows上测试过OS X。

如果您对自己的绳索感到沮丧,那么您所要求的协议就是DHCP(动态主机配置协议)。

像操作系统一样使用DHCP,不仅仅是"查询"对于DNS服务器,但请求IP地址的(新的/续订的)租约。像Gateway,Time Servers&包含DNS服务器也很重要,但次要。如果操作不正确,您可能会搞砸操作系统与DHCP服务器之间的关系,或者说服您的DHCP服务器您的程序是网络上应该维护租用信息的另一台(假)机器。

答案 1 :(得分:2)

gethostbyname使用底层OS库的解析程序功能。如果您希望更直接地访问DNS数据包,请使用Net::DNS::Resolver

答案 2 :(得分:0)

受到Steffen Ullrich的启发 我通过管理DHCP跟踪并通过Net :: DHCP :: Packet模拟解决了问题,幸运的是它是简单的UDP协议

DHCP

在使用脚本

之前,您需要找到IP / Mac / GW地址
#!/usr/bin/perl

use strict;
use warnings;
use IO::Socket::INET;
use Net::DHCP::Packet;
use Net::DHCP::Constants;
srand();

# creat DHCP Packet
my $discover = Net::DHCP::Packet->new(
    Xid                     => int(rand(0xFFFFFFFF)),    # random xid
    Flags                   => 0x0000,                   
    DHO_DHCP_MESSAGE_TYPE() => DHCPREQUEST(),
);
$discover->ciaddr('192.168.1.5');
$discover->chaddr('5cc5d43ca078');

my $handle = IO::Socket::INET->new(
    Proto     => 'udp',
    ReuseAddr => 1,
    PeerPort  => '67',
    LocalPort => '68',
    PeerAddr  => '192.168.1.1'
) or die "socket: $@";

$handle->send($discover->serialize());
my $newmsg;
if ($handle->recv($newmsg, 1024)) {
    my $packet = Net::DHCP::Packet->new($newmsg);
    print STDERR $packet->toString();
}

执行结果:

op = BOOTREPLY
htype = HTYPE_ETHER
hlen = 6
hops = 0
xid = eaba416c
secs = 0
flags = 0
ciaddr = 192.168.1.5
yiaddr = 192.168.1.5
siaddr = 0.0.0.0
giaddr = 0.0.0.0
chaddr = 5cc5d43ca078
sname =
file =
Options :
 DHO_DHCP_MESSAGE_TYPE(53) = DHCPACK
 DHO_SUBNET_MASK(1) = 255.255.255.0
 DHO_ROUTERS(3) = 192.168.1.1
 DHO_DOMAIN_NAME_SERVERS(6) = 192.168.1.1
 DHO_DHCP_SERVER_IDENTIFIER(54) = 192.168.1.1
 DHO_DHCP_LEASE_TIME(51) = 86400
 DHO_VI_VENDOR_SPECIFIC_INFOMATION(125) = \x00\x00\x00\x00\x14\x02\x06HGW-CT\x0A\x02\x00\x00\x0B\x02\x00U\x0D\x02\x00.
padding [247] = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

我们可以看到

DHO_DOMAIN_NAME_SERVERS(6) = 192.168.1.1

是DNS服务器地址