I have tried to create an MDNS server to answer for MDNS query
I can handle the MDNS query packet but I got an error on reply = dnslib.DNSRecord(b, q)
with object of type 'DNSQuestion' has no len()
Here is the Python code:
<code>import socket
import struct
import dnslib
import sys
# Multicast address and port for mDNS
MDNS_MULTICAST_ADDR = "224.0.0.251"
MDNS_PORT = 5353
INTERFACE_IP = sys.argv[2]
# IP address to respond with
RESPONSE_IP = sys.argv[2]
# Create a socket to listen for mDNS queries
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((INTERFACE_IP, MDNS_PORT))
# Join the multicast group
mreq = struct.pack("=4sl", socket.inet_aton(MDNS_MULTICAST_ADDR), socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
def respond_to_query(query):
# Craft a DNS response for the mDNS query
try:
q = query.questions[0]
b =dnslib.DNSHeader(qr=1, aa=1, id=query.header.id)
reply = dnslib.DNSRecord(b, q)
# Add answer to the response with the desired IP
reply.add_answer(dnslib.RR(
rname=q.qname,
rtype=dnslib.QTYPE.A,
rclass=1,
ttl=60, # Time to live for the response
rdata=dnslib.A(RESPONSE_IP)
))
sock.sendto(reply.pack(), (MDNS_MULTICAST_ADDR, MDNS_PORT))
# Send the response to the multicast address
except Exception as e:
print(e)
print(f"Listening for mDNS queries on {MDNS_MULTICAST_ADDR}:{MDNS_PORT}...")
while True:
# Receive incoming mDNS queries
data, addr = sock.recvfrom(1024)
try:
query = dnslib.DNSRecord.parse(data)
for question in query.questions:
if question.qname.matchGlob(sys.argv[1]):
print(f"Received query for {question.qname} from {addr}")
respond_to_query(query)
except Exception as e:
print(f"Error parsing query: {e}")
</code>
<code>import socket
import struct
import dnslib
import sys
# Multicast address and port for mDNS
MDNS_MULTICAST_ADDR = "224.0.0.251"
MDNS_PORT = 5353
INTERFACE_IP = sys.argv[2]
# IP address to respond with
RESPONSE_IP = sys.argv[2]
# Create a socket to listen for mDNS queries
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((INTERFACE_IP, MDNS_PORT))
# Join the multicast group
mreq = struct.pack("=4sl", socket.inet_aton(MDNS_MULTICAST_ADDR), socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
def respond_to_query(query):
# Craft a DNS response for the mDNS query
try:
q = query.questions[0]
b =dnslib.DNSHeader(qr=1, aa=1, id=query.header.id)
reply = dnslib.DNSRecord(b, q)
# Add answer to the response with the desired IP
reply.add_answer(dnslib.RR(
rname=q.qname,
rtype=dnslib.QTYPE.A,
rclass=1,
ttl=60, # Time to live for the response
rdata=dnslib.A(RESPONSE_IP)
))
sock.sendto(reply.pack(), (MDNS_MULTICAST_ADDR, MDNS_PORT))
# Send the response to the multicast address
except Exception as e:
print(e)
print(f"Listening for mDNS queries on {MDNS_MULTICAST_ADDR}:{MDNS_PORT}...")
while True:
# Receive incoming mDNS queries
data, addr = sock.recvfrom(1024)
try:
query = dnslib.DNSRecord.parse(data)
for question in query.questions:
if question.qname.matchGlob(sys.argv[1]):
print(f"Received query for {question.qname} from {addr}")
respond_to_query(query)
except Exception as e:
print(f"Error parsing query: {e}")
</code>
import socket
import struct
import dnslib
import sys
# Multicast address and port for mDNS
MDNS_MULTICAST_ADDR = "224.0.0.251"
MDNS_PORT = 5353
INTERFACE_IP = sys.argv[2]
# IP address to respond with
RESPONSE_IP = sys.argv[2]
# Create a socket to listen for mDNS queries
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((INTERFACE_IP, MDNS_PORT))
# Join the multicast group
mreq = struct.pack("=4sl", socket.inet_aton(MDNS_MULTICAST_ADDR), socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
def respond_to_query(query):
# Craft a DNS response for the mDNS query
try:
q = query.questions[0]
b =dnslib.DNSHeader(qr=1, aa=1, id=query.header.id)
reply = dnslib.DNSRecord(b, q)
# Add answer to the response with the desired IP
reply.add_answer(dnslib.RR(
rname=q.qname,
rtype=dnslib.QTYPE.A,
rclass=1,
ttl=60, # Time to live for the response
rdata=dnslib.A(RESPONSE_IP)
))
sock.sendto(reply.pack(), (MDNS_MULTICAST_ADDR, MDNS_PORT))
# Send the response to the multicast address
except Exception as e:
print(e)
print(f"Listening for mDNS queries on {MDNS_MULTICAST_ADDR}:{MDNS_PORT}...")
while True:
# Receive incoming mDNS queries
data, addr = sock.recvfrom(1024)
try:
query = dnslib.DNSRecord.parse(data)
for question in query.questions:
if question.qname.matchGlob(sys.argv[1]):
print(f"Received query for {question.qname} from {addr}")
respond_to_query(query)
except Exception as e:
print(f"Error parsing query: {e}")
3