Как настроить локальный DNS-сервер в Python

Я использую Windows 7 и Python 2.7 Я хочу сопоставить 172.16.45.84 IP-адрес с myapp.nobies.in без сопоставления в файле hosts.

У меня есть необходимый сертификат для этого имени хоста. Я не хочу отображать в файле hosts, поскольку это требует административных привилегий.

Итак, как создать DNS-сервер Python для него, который может быть поставлен с моим приложением.

1 ответ

См. этот пост Как я могу выполнить поиск DNS в Python, включая ссылку на /etc/hosts? для того, чтобы сделать поиск DNS в Python.

Вы могли бы сделать что-то вроде:

import socket
name = raw_input("hostname:")
if name == "mpapp.nobies.in":
    print "172.16.45.84"
else:
    print socket.gethostbyname(name)

Это выполнит нормальный поиск DNS, если вы не ищете "myapp.nobies.in", который вернет 172.16.45.84

Примечание: это не работающее приложение DNS-сервера. Это, однако, (очень базовая) альтернатива nslookup-подобной команде. Чтобы сделать его реальным сервером, вам нужно прослушивать DNS-пакеты на порту 53 (что потребует прав администратора, поскольку это привилегированный порт. Я полагаю, вы могли бы использовать более высокий порт, но вам придется настроить его и на вашем DNS-клиенте), Изучите программирование сокет-сервера на python. Хорошо читать здесь из документации по Python:

https://docs.python.org/2/howto/sockets.html

и здесь:

https://docs.python.org/2/library/socket.html

Я бы также предложил поискать dnslib и / или dnspython для разбора DNS-пакетов.

РЕДАКТИРОВАТЬ:

попробуйте этот код, чтобы начать работу: (запустите в командной строке и сверните)

#!/usr/bin/python

import socket

def resolve(name):
    if name == "mpapp.nobies.in":
        return "172.16.45.84"
    else :
        # you ought to add some basic checking of name here
        return socket.gethostbyname(name)

host = ''
port = 50000
backlog = 5
size = 1024
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host,port))
s.listen(backlog)
while 1:
    client, address = s.accept()
    data = client.recv(size)
    if data:
        bits = data.split(":")
        if bits[0] == 'h':
            client.send(resolve(bits[1]))
    client.close()

и использовать это как клиент: (настроить переменные и запустить после того, как вы запустили сервер)

#!/usr/bin/python

import socket

### configure me ###

dns_server_ip = '127.0.0.1'
dns_server_port = 50000
query = 'mpapp.nobies.in' # change this to the hostname you want to lookup

### configure me ###

size = 1024

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((dns_server_ip,dns_server_port))
s.send('h:' + query)
data = s.recv(size)
s.close()
print data

Примечание: на самом деле это не сервер DNS, он не понимает пакеты DNS, он просто берет строку имени хоста с префиксом "h:" на порту 50000 и возвращает IP-адрес. Я надеюсь, что это отвечает вашим потребностям.

Использование:

$ START "" .\dns-server.py
$ .\dns-client.py
172.16.45.84
Другие вопросы по тегам