Я пытаюсь настроить сокет-сервер на компьютере с 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'
Полагаю, стоит упомянуть, что весь разговор идет от хост-компьютера к виртуальной машине, на которой находится хостэто.
Заранее спасибо за любую помощь!