Tkabber Wiki

Ткаббер и DNS
Login

Материал из Tkabber Wiki

Содержание

Место и роль DNS в процессе соединения с сервером

Согласно RFC #3920, Ткаббер начинает долгую дорогу в дюнах своего соединения, пытаясь выполнить SRV-запрос к DNS. Запрос этот служит, чтобы выяснить, какой именно компьютер обслуживает XMPP-домен, в котором вы владеете учётной записью. Другими словами, jabber.ru в JID'е vasya@jabber.ru означает не сервер, а домен. Сервер может иметь совершенно другое имя в DNS, и самих серверов у домена может быть несколько (у jabber.ru, например, их два).

Далее Ткабберу может понадобиться выполнить ещё минимум один запрос, чтобы разрешить полученное на первом этапе имя сервера в его IP-адрес.

Здесь могут возникнуть две проблемы:

Первая проблема: "TCP vs UDP"

DNS-запросы чаще всего выполняются при помощи протокола UDP, который не поддерживается интерпретатором Tcl непосредственно. Поддержка UDP реализована несколькими расширениями Tcl (о которых — ниже), и Ткаббер пытается найти и загрузить их при старте; если это ему удалось, запросы к DNS производятся при помощи UDP, в противном случае — при помощи TCP.

Проблема состоит в том, что хотя запросы к DNS с использованием TCP не противоречат стандарту на DNS, весьма многие провайдеры интернета запрещают такие запросы на своих серверах. Более того — обычно сетевой порт для таких запросов закрывается файрволом, и делается это таким образом, что при попытке TCP-соединения на этот порт сервер вместо посылки ответного пакета со специальным уведомлением "соединение невозможно" молча "душит" пакет с запросом на соединение. В результате Ткаббер выжидает прибытия ответного пакета в течение полного таймаута, определённого протоколом TCP/IP (который весьма высок), что и выглядит как "подвисание".

У такой проблемы два решения:

  1. Поставьте одно из расширений Tcl, добавляющее поддержку UDP. Ими являются ceptcl и tcludp.

  2. Заставьте Ткаббер обходиться вообще без запросов к DNS. Этого можно достичь, явно указав IP-адрес сервера. Это делается, например, настройкой Явно указать адрес и порт для подключения, доступной на вкладке Соединение диалога логина. Однако, чтобы узнать этот адрес (и порт) потребуется проявить некоторую смекалку и поработать руками. Рычаги к действию описаны ниже.

Пример решения проблемы с помощью пакета tcludp на дистрибутиве Arch Linux: качаем исходники, распаковываем и устанавливаем пакет (подробная инструкция по установке находится в файле readme архива с исходниками). После этого запускаем tkabber и пробуем соединиться с сервером.

Вторая проблема: UDP блокируется файрволом

Данная проблема, насколько нам известно, существует только в Windows, возникает при установленном расширении tcludp и состоит в следующем:

  1. tcludp пользуется услугами стандартной службы Windows "DNS-клиент". Служба эта, как и большинство других, реализована в виде динамически загружаемой библиотеки (DLL). Эта библиотека работает внутри специального системного процесса svchost.exe;
  2. Когда Ткаббер осуществляет запрос к DNS, используя протокол UDP, реальный пакет посылает та самая DLL, что выглядит с точки зрения системы как активность процесса svchost.exe.
  3. Добавьте сюда параноидальную настройку локального файрвола (которая, к примеру, обычно имеет место быть у пользователей Agnitum Outpost Firewall), запрещающую упомянутому процессу svchost.exe работу с сетью, — и вы получаете проблему "подвисающий Ткаббер" другим способом!

Решение этой проблемы состоит, очевидно, как в более взвешенном отношении к настройкам файрвола, так и к запросам, которые он выдаёт, обнаружив сетевую активность неизвестной ему доселе программы.

Ручное разрешение записей DNS

В Windows средством для ручного общения с DNS-серверами, доступным "из коробки", является утилита командной строки nslookup, в Unix это dig и host. Синтаксис передачи параметров этих утилит отличается, ниже мы приведём конкретные примеры их использования.

A-записи

Записи типа A связывают имена конкретных компьютеров в сети с их IP-адресами. Это — "самый главный" тип записей в DNS, поэтому обычно он подразумевается утилитами работы с DNS. Для примера узнаем IP-адрес машины, на которой работает web-сервер, обслуживающий сайт www.jabber.ru:

C:\>nslookup www.jabber.ru
Server:  alpha.dom.lan
Address:  10.1.1.223

Non-authoritative answer:
Name:    yo.jabber.ru
Address:  213.248.55.180
Aliases:  www.jabber.ru

Из вывода nslookup следует, что www.jabber.ru — это "альяс" (альтернативное имя) компьютера yo.jabber.ru, и он имеет IP-адрес 213.248.55.180. Заодно nslookup показала, какой именно DNS-сервер обслужил наш запрос.

SRV-записи

TXT-записи для HTTP-poll