Создайте DNS-прокси в C - PullRequest
       6

Создайте DNS-прокси в C

1 голос
/ 18 ноября 2010

Я хочу создать простой прокси-сервер DNS на C, который принимает запросы DNS от UDP-порта 53, перенаправляет запрос на TCP-порт 53 DNS-сервера Google для выполнения поиска, а затем возвращает ответ, предложенный Google.

Да, это школьный проект, и я так растерялся, что не знаю, с чего начать.

Спасибо за помощь !!

Ответы [ 2 ]

3 голосов
/ 19 ноября 2010

Вам повезло с требованиями - поскольку вы переходите от UDP -> TCP, на самом деле это намного проще, чем выполнять UDP -> UDP.

В частности, я имею в виду, что, посколькувнешняя сторона использует сокет , ориентированный на соединение , вы сразу понимаете, что полученный вами ответ должен относиться к только что отправленному запросу, если вы используете новый сокет TCP для каждого запроса.

Если внешняя сторона была UDP, становится намного сложнее выяснить, к какому запросу относится каждый ответ - в протоколе нет гарантии, что ответы приходят в том же порядке, что и запросы.

Еслитогда многопоточность не обязательна (в псевдокоде)

"open" a UDP socket
"bind" that socket to port 53
while (true) {
    "recvfrom" a packet from the UDP socket
     ... and remember the address it was received from
    "open" a TCP socket
    "connect" it to Google's DNS
    "write" the length of the original query (two bytes, network order - RFC 1035)
    "write" the contents of the original query
    "read" a two byte length header
    "read" that many bytes from the TCP socket
    "close" the TCP socket
    "sendto" those bytes back over the UDP socket to the original client address
}
2 голосов
/ 18 ноября 2010

Прежде всего вам нужно выбрать API для записи сообщений в сеть. Для Windows у вас есть Winsock API . Для Unix-подобных систем у вас есть BSD Sockets API .
Хотя большинство курсов используют BSD API.

Теперь ваши шаги могут быть:

  • посмотрите на rfc для реализации DNS. Вы можете сосредоточиться только на формате сообщений с запросами и ответами, поскольку вам может потребоваться изменить некоторые поля.
  • Теперь напишите код клиент-сервер, который состоит из двух модулей:
    • Код на стороне сервера для получения запроса DNS, возможно, потребуется изменить некоторые поля.
    • Передайте его модулю, который взаимодействует с DNS-сервером Google.
    • Захватите ответ и отправьте его обратно запрашивающему клиенту. (опять же может потребоваться изменить некоторые поля)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...