Как настроить локальный 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