Заголовки DNS отправляются как сырые данные со scapy - PullRequest
2 голосов
/ 01 октября 2019

Я пытаюсь настроить сокет-сервер на компьютере с Linux, используя Python, как побочный проект для моей сетевой команды. машина будет прослушивать порт 53 и отвечать на запросы DNS, используя scapy.

Теперь запрашивающая часть работает отлично, по крайней мере, я думаю, что я действительно не получил ту часть, когда я установил сервер какмой DNS-сервер и пытается использовать Интернет еще, но когда я пытаюсь tcpdump, он выглядит как обычный пакет.

В любом случае, когда я отвечаю с сервера на клиент, пакет отправляется со всеми заголовкамичто мне нужно, DNS, DNSQR и DNSRR, как я видел в tcpdump. Но когда клиент получает пакет, он имеет только заголовки IP и UDP, так как остальная часть отправляется в виде необработанных данных.

Как я уже упоминал ранее, я попытался посмотреть на wireshark и tcpdump и увидел разницукоторый отправляется между сервером и клиентом, и я увидел, что со стороны сервера ответный пакет помечается как malformed packet

Я не совсем уверен, так ли это, как я видел наИнтернет, который только потому, что я не подделал его полностью.

код:

Клиентский пакет:

pkt = IP(dst='<Server IP>')/UDP(dport=53,sport=RandShort())/DNS(rd=1,qd=DNSQR(qname='dns.google'))

Серверный пакет:

def build_dns_response(src_addr,og_sport,dns_qtype,dns_qname,response_type=True,response_name=None):
    '''
    a function that will build a DNS response packet back to the sender, according to the parameters that are recieved.
    dns_qname = url/ip that the sender asked for.
    og_sport = original source port, will be used as the dport of this packet
    src_addr = source address of the original packet, will be used as the destination of this packet.
    dns_qtype = the question type of the original request, 1 stands for type A, and 12 for PTR
    response_type = will indicate if the server responds with an answer of 'ok' or 'name-error' on the 'rcode' field,True for ok,False for name-error
    response_name = the response that the server will send as a result of the dns request, in case that a request matches to a database query.
    '''
    if response_type is True:
        pkt = IP(src='<Server IP>',dst=src_addr)/\
                                UDP(sport=53,dport=og_sport)/\
                                DNS(opcode=0,rd=1,rcode='ok',nscount=1,ancount=1,qd=DNSQR(qname=dns_qname,qtype=dns_qtype),an=DNSRR(rrname=dns_qname,type=dns_qtype,rdata=response_name))

пакет, отправляемый сервером:

###[ IP ]### 
  version   = 4
  ihl       = None
  tos       = 0x0
  len       = None
  id        = 1
  flags     = 
  frag      = 0
  ttl       = 64
  proto     = udp
  chksum    = None
  src       = <Server IP>
  dst       = <client IP >
  \options   \
###[ UDP ]### 
     sport     = domain
     dport     = 25151
     len       = None
     chksum    = None
###[ DNS ]### 
        id        = 0
        qr        = 0
        opcode    = QUERY
        aa        = 0
        tc        = 0
        rd        = 1
        ra        = 0
        z         = 0
        ad        = 0
        cd        = 0
        rcode     = ok
        qdcount   = 1
        ancount   = 1
        nscount   = 1
        arcount   = 0
        \qd        \
         |###[ DNS Question Record ]### 
         |  qname     = 'dns.google.'
         |  qtype     = A
         |  qclass    = IN
        \an        \
         |###[ DNS Resource Record ]### 
         |  rrname    = 'dns.google.'
         |  type      = A
         |  rclass    = IN
         |  ttl       = 0
         |  rdlen     = None
         |  rdata     = 8.8.8.8
        ns        = None
        ar        = None

пакет, полученный клиентом:

###[ IP ]###
  version   = 4
  ihl       = 5
  tos       = 0x0
  len       = 82
  id        = 1
  flags     =
  frag      = 0
  ttl       = 64
  proto     = udp
  chksum    = 0x6686
  src       = <Server IP>
  dst       = <Client IP>
  \options   \
###[ UDP ]###
     sport     = domain
     dport     = 25151
     len       = 62
     chksum    = 0xf99
###[ Raw ]###
        load      = '\x00\x00\x01\x00\x00\x01\x00\x01\x00\x01\x00\x00\x03dns\x06google\x00\x00\x01\x00\x01\x03dns\x06google\x00\x00\x01\x00\x01\x00\x00\x00\x00\x00\x04\x08\x08\x08\x08'

Полагаю, стоит упомянуть, что весь разговор идет от хост-компьютера к виртуальной машине, на которой находится хостэто.

Заранее спасибо за любую помощь!

...