Gethostbynamel — получает список IP-адресов, соответствующих имени данного Internet-хоста.
79907 просмотра
8 ответа
4364 Репутация автора
Как я могу легко получить список IP-адресов или имен хостов из локальной сети в Python?
Было бы лучше, если бы он был мультиплатформенным, но сначала он должен работать на Mac OS X, а затем другие.
Изменить: под локальным я подразумеваю все активные адреса в локальной сети, такие как 192.168.xxx.xxx .
Таким образом, если IP — адрес моего компьютера (в локальной сети) есть 192.168.1.1 , и у меня есть три других подключенных компьютеров, я хочу, чтобы вернуть IP — адрес 192.168.1.2 , 192.168.1.3 , 192.168.1.4 , и , возможно , их имена хостов.
Ответы (8)
плюса
1439 Репутация автора
Один из ответов на этот вопрос может помочь вам. Кажется, есть версия, независимая от платформы для python, но я еще не пробовал.
18 плюса
5112 Репутация автора
Если под «локальным» вы подразумеваете один и тот же сегмент сети, то вам необходимо выполнить следующие шаги:
- Определите свой собственный IP-адрес
- Определите свою собственную маску сети
- Определить диапазон сети
- Сканируйте все адреса (кроме самого низкого, который является вашим сетевым адресом, и самого высокого, который является вашим широковещательным адресом).
- Используйте обратный поиск в DNS, чтобы определить имя хоста для IP-адресов, которые отвечают на ваше сканирование.
Или вы можете просто позволить Python внешне выполнить nmap и передать результаты обратно в вашу программу.
10 плюса
5675 Репутация автора
Если вы знаете имена своих компьютеров, вы можете использовать:
В противном случае вам придется сканировать все IP-адреса, которые соответствуют той же маске, что и ваш локальный компьютер (IP1), как указано в другом ответе.
Автор: Mapad Размещён: 16.10.2008 08:27
20 плюса
8286 Репутация автора
Обновление : скрипт теперь находится на github .
Я написал небольшой скрипт питона , которая использует scapy «s arping() .
3 плюса
Репутация автора
плюса
497 Репутация автора
Вот небольшой инструмент сканирования , который поможет вам получить все ip-адреса и их соответствующие mac-адреса в сети (работает на Linux). Это ссылка на сканер (сканер Ip и Mac), написанный на python. https://pypi.python.org/pypi/scanip/1.0
Вы также можете скачать его с помощью pip install scanip на linux и использовать его, создать тестовый файл на python и использовать его следующим образом:
и запустить эту программу. Все IP-адреса и соответствующие им MAC-адреса в локальной сети будут отображаться в терминале.
Автор: vivkv Размещён: 24.04.2020 09:03
3 плюса
1055 Репутация автора
Я собрал следующую функциональность из некоторых других потоков, и она работает для меня в Ubuntu.
плюса
16 Репутация автора
Я нашел этот сетевой сканер в статье на Python и написал этот короткий код. Он делает то, что вы хотите! Однако вам необходимо знать доступные порты для ваших устройств. Порт 22 является стандартом SSH и что я использую. Я полагаю, вы можете перебрать все порты. Некоторые значения по умолчанию:
Задание адреса gethostbyname
Изначально адрес задавался строкой addres.sin_addr.s_addr = htonl(INADDR_LOOPBACK);. Закаментированные строки это строки относящиеся к gethostbyname. Подскажите как им пользоваться пожалуйста.
gethostbyname() возвращает 11004
struct sockaddr_in addr; struct hostent* hp; int retval; retval = WSAStartup(MAKEWORD(1, 1).
Проблема с функцией gethostbyname
Здравствуйте. Написал простенькую программу: #include #include int main().
Ручное освобождение памяти. gethostbyname, inet_ntoa
Hello World! gethostbyname Возвращает указатель на hostent, а inet_ntoa возвращает указатель на.
gethostbyname не всегда ‘разрешает IP из адреса хоста’
При написании простенького Proxy столкнулся с проблемой — gethostbyname работает некорректно. А.
Задание MAC-адреса
Добрый день! Как известно, специальным битом в MAC-адресе можно указывать, что он задан вручную.
Специально для тебя.
The gethostbyname function returns a pointer to a hostent structure—a structure allocated by Windows Sockets. The hostent structure contains the results of a successful search for the host specified in the name parameter.
If the host specified in the name parameter has both IPv4 and IPv6 addresses, only the IPv4 addresses will be returned. The gethostbyname function can only return IPv4 addresses for the name parameter.
Прежде, чем морочить голову людям — учи мат часть!
Python — получить IP-адрес компьютера и имя хоста в сети с использованием того же приложения
Просто чтобы быть ясным: я только начал Python 2 недели назад, но я разработчик С#, ASP, PHP, JavaScript.
Я только что начал новый проект с Python и PyQt, и я хочу, чтобы мой проект был сервером, который сможет общаться с другим экземпляром этого сервера на других компьютерах.
Итак, мне нужно получить IP-адрес компьютеров и имя хоста.
Во-первых, я подумал об использовании команды «net view» MSDOS, но это было прежде, чем попробовать эту команду на моей работе и увидеть, что это может занять около 15 секунд (что, я думаю, слишком медленное).
Кроме того, команда «net view» может возвращать компьютеры, которые больше не находятся в сети, и вызывают исключение при попытке получить свои IP-адреса по имени хоста (что также замедляет процесс каждый раз, когда к компьютеру не удается получить доступ).
Мой вопрос: есть ли способ получить все компьютеры IP и имя хоста в локальной сети, не проходя через net view в Windows, потому что net view может быть медленной операцией?
Кроме того, есть способ получить только компьютеры, на которых запущено мое приложение? (так что это будет быстрее)
Если вы хотите получить IP-адрес хоста, на котором запущен python script, ответ, предоставленный user2096338, — это путь.
Чтобы обнаружить все компьютеры в сети в локальной сети, вы можете использовать scapy. https://github.com/bwaldvogel/neighbourhood/blob/master/neighbourhood.py — это ссылка, которую я нашел при просмотре аналогичного вопроса SO; который обнаруживает все компьютеры в сети (LAN).
Если вы хотите убедиться, что приведенный выше script возвращает только те компьютеры, на которых запущен ваш сервер, — тогда есть несколько способов сделать это, перечисленные ниже в порядке portablility
- Всякий раз, когда вы устанавливаете свой сервер на хосте, регистрируйтесь в центральной базе данных, которая затем может быть запрошена новым экземпляром вашей службы для идентификации всех компьютеров, на которых работают одноранговые серверы.
- Используйте WMI (так как вы находитесь в Windows), чтобы запросить все процессы, выполняемые на равноправной системе anc, проверить, является ли ваш сервер одним из них.
- Ваш сервер будет держать порт проверки открытым, а установка нового сервера будет пинговать на сервере в этом пробном порту для каждого из узлов в сети. Если он получает ответ, то на этом компьютере выполняется серверный процесс.
На мой взгляд, метод 1 является самым безопасным и переносимым, поскольку он предотвращает открытие ненужных портов (например, метод 3), которые являются дырами в безопасности (в зависимости от того, в чьем контексте работает ваш python script). Это также не зависит от доступности службы WMI на удаленных хостах (некоторые системы могут отключить WMI).
Gethostbynamel — получает список IP-адресов, соответствующих имени данного Internet-хоста.
int fsockopen (string hostname, int port, int [ errno ], string [ errstr ]);
Открывает сокетное соединение с доменом Internet по адресу hostname на порт port и возвращает файловый указатель, который может использоваться функциями fgets() , fgetss() , fputs() , и fclose() . Если вызов завершается неудачей, он возвращает FALSE и если указаны дополнительные аргументы errno и errstr , то они будут использованы, чтобы указать фактическую системную ошибку, которая случилась на системном уровне при вызове connect(). Если возвращенное errno — 0, но функция вернула FALSE, это — признак того, что ошибка произошла перед вызовом connect(). Это наиболее вероятно, из-за проблемы инициализации сокета. Имейте в виду, что аргументы errno и errstr необязательно должны упоминаться.
Если port — 0 и ОС поддерживает доменные сокеты Unix (domain sockets), hostname будет использован для подключения в качестве filename доменного сокета Unix.
По умолчанию сокет откроется в режиме blocking mode. Вы можете переключить его в non-blocking mode используя set_socket_blocking() .
|
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
Работа с DNS серверами в PHP
Здесь мы рассмотрим функции, которые предоставляет PHP для работы с DNS серверами. Наиболее часто возникает задача получения имени хоста по его IP-адресу, другие задачи встречаются значительно реже.
Функция gethostbyname
string gethostbyname(string hostname)
Пример использования фунции gethostbyname
= «localhost» ;
$ip_address = gethostbyname ( $hostname );
echo ( «IP-адрес $hostname: $ip_address» );
?>
Функция gethostbynamel
string gethostbynamel(string hostname)
Многие компьютеры имеют несколько IP-адресов, особенно типична такая ситуация для различных серверов. Получить полный список IP-адресов, соответствующих данному имени компьютера, можно с помощью функции gethostbynamel, действующей аналогично функции gethostbyname. Другая ситуация, в которой полезно применение этой функции, возникает, когда одно имя DNS соответствует нескольким компьютерам. Это бывает при работе с DNS серверами, поддерживающими механизм кругового распределения нагрузки, при котором одно имя DNS сервера отображается на несколько компьютеров в локальной сети этого сервера.
Возвращаемый список IP-адресов функция gethostbynamel помещает в массив:
= «localhost» ;
$ip_addresses = gethostbyname ( $hostname );
echo( «The IP adresses of ‘$hostName’ are:
» );
foreach( $ip_adresses as $index => $val )
<
echo( «$val» );
>
?>
Функция gethostbyaddr
Эта функция принимает в качестве аргумента IP-адрес и возвращает соответствующее ему имя хоста:
= «127.0.0.1» ;
$hostname = gethostbyaddr ( $ip_address );
echo ( «Имя хоста с IP-адресом $ip_address: $hostname» );
?>
Функция checkdnsrr
string checkdnsrr(string hostname [, string type])
DNS сервер сохраняет немало полезной информации о хосте, для чего используются так называемые записи ресурсов, которые имеют следующие типы:
- A (Запись содержит IP-адрес хоста);
- CNAME (Запись содержит псевдоним хоста);
- NS (Запись содержит имя DNS-сервера, являющегося авторитетным для поддо-мена. Авторитетным является такой DNS-сервер, который замыкает цепочку DNS-запросов);
- МХ (Запись содержит Имя хоста почтового ретранслятора в домене, которому принадлежит данный хост. В этой записи также хранится значение коэффициента предпочтения для почтового ретранслятора);
- PTR (Запись хранит отображения IP-адресов в имена).
Функция checkdnsrr находит на DNS-сервере записи ресурсов вида type для хоста hostname.
Примечание
Эта функция не поддерживается на Windows-платформах.
Руководство по управлению системой: Сети и средства связи
Несмотря на то, что 32-разрядные IP-адреса позволяют однозначно идентифицировать все хосты в сети Internet, пользователям гораздо удобнее работать с осмысленными, легко запоминающимися именами хостов. В Протоколе управления передачей/Протоколе Internet (TCP/IP) предусмотрена система имен, поддерживающая как одноуровневую, так и иерархическую структуру сети.
Система присовения имен в однородной сети проста. Имена хостов состоят из простого набора символов, а удаленное управление хостами в этом случае, как правило, не используются. В однородных сетях TCP/IP в каждой системе сети есть файл ( /etc/hosts ), содержащий таблицу преобразования имен всех имеющихся хостов в IP-адреса. При расширении сети TCP/IP административные затраты по поддержанию в каждой системе файла с таблицей преобразования имен существенно возрастают. Если сеть TCP/IP становится очень большой (например, Internet), то необходимо переходить к иерархической структуре присвоения имен. Обычно иерархия имен соответствует структуре сети. В TCP/IP иерархическая система присвоение имен называется системой имен доменов (DNS) и использует протокол DOMAIN. Протокол DOMAIN реализован в TCP/IP демоном named .
Как и в случае с одноуровневыми сетями, иерархия имен доменов позволяет присваивать сетям и хостам осмысленные и легко запоминающиеся символьные имена. Однако, вместо того, чтобы хранить файл с таблицей преобразования имен в IP-адреса на каждом хосте, выбирается один или несколько хостов, которые применяются в качестве серверов имен . Серверы имен преобразуют символьные имена сетей и хостов в IP-адреса. На сервере имен хранится полная информация об определенной части домена, называемой областью . Кроме того, сервер несет ответственность за свою область.
В одноуровневой сети администрирование всех входящих в нее хостов осуществляется централизованно. Такая структура сети требует присвоения всем хостам сети уникальных имен. Если сеть большая, то это требование создает большие трудности для администратора сети.
В доменной сети администрирование выполняется отдельно для каждой группы хостов в соответствии с иерархией доменов и субдоменов. В этом случае имена хостов должны быть уникальными только в пределах локального домена, а централизованное администрирование осуществляется только для корневого домена . Такая структура допускает локальное администрирование субдоменов и сокращает нагрузку на организацию, осуществляющую централизованное управление. Например, корневой домен сети Internet состоит из доменов, com (коммерческие организации), edu (образовательные учреждения), gov (правительственные организации) и mil (военные учреждения). Новые домены верхнего уровня могут добавляться только централизованно. Присваивать имена на втором уровне разрешено уполномоченным представителям внутри соответствующих доменов. Например, уполномоченная организация на уровне домена com может присваивать имена всем входящим в него субдоменам коммерческих организаций. Аналогично, присвоение имен на третьем и последующих уровнях разрешено соответствующим организациям. Например, на рисунке «Структура домена Internet» домен Century уполномочен распределять имена в субдоменах Austin, Hopkins и Charlotte.
Рис. 3-21. Структура имен доменов в Internet . На рисунке показана иерархическая структура сети Internet. Он начинается с корневого узла и разделяется на следующем уровне на домены mil, com и edu. На следующем уровне ветви com находятся домены Charlotte, Austin и Hopkins. В домене Austin находятся домены Dev и Graphics.
Субдомен Austin домена Century может быть, в свою очередь, разделен на две области, например, Dev и Graphics. В этом случае область austin.century.com должна включать все данные, относящиеся к домену austin.century.com , за исключением тех, которые относятся к областям Dev и Graphics. Область dev.century.com должна содержать только данные, относящиеся к Dev; она никак не связана, например, с областью Graphics. Область austin.century.com (в отличие от домена с тем же именем) должна содержать только те данные, которые не относятся к другим областям.
В иерархической системе имен доменов каждое имя представляет собой последовательность имен (без учета регистра символов), разделенных точками без промежуточных пробелов. В протоколе DOMAIN длина имени локального домена ограничена 64 символами, а длина имени хоста — 32 символами. Имя хоста указывается первым, после него ставится точка (.), затем идет последовательность имен локальных доменов, разделенных точками, и в конце указывается имя корневого домена. Полное имя хоста, включая точки, должно содержать не более 255 символов и иметь следующий вид:
Так как в пределах домена хосты имеют уникальные имена, то при отправке сообщений на хост, находящийся внутри того же домена, можно использовать сокращенное имя. Например, при отправке сообщения с хоста, находящегося в домене eng , вместо имени smith.eng.lsu.edu можно указать имя smith . Кроме того, у каждого хоста может быть несколько псевдонимов, и другие хосты могут использовать их при отправке сообщений.
Основная цель присвоения имен хостам — это обеспечение возможности быстро, легко и безошибочно обращаться к компьютерам в вашей сети. Системные администраторы Internet обнаружили, что есть как хорошие, так и плохие способы выбора имен хостов. Эти рекомендации помогут вам избежать ловушек при выборе имен хостов.
Вот несколько рекомендаций по выбору простых и легких для запоминания имен:
- Выбирайте редко используемые слова, например, sphinx или eclipse .
- Используйте тематические наборы имен, например названия химических элементов (такие как helium , argon или zinc ), цветов, рыб и т.п.
- Используйте реально существующие слова, а не случайные наборы символов.
Ниже приведено несколько примеров неудачного выбора. В общем случае они или трудны для запоминания, или сбивают с толку (и человека, и компьютер):
- Широко используемые термины, например, up , down или crash .
- Имена, состоящие только из чисел.
- Имена, содержащие знаки препинания.
- Имена, различающиеся регистром символов, например, Orange и orange .
- Имя или инициалы основного пользователя системы.
- Имена длиной более 8 символов.
- Имена с необычным или намеренно неправильным написанием. Например czek легко можно перепутать с «check» или «czech.»
- Имена, совпадающие с именем домена, например yale.edu .
В одноуровневой сети без сервера имен имена всех хостов хранятся в файле /etc/hosts каждого хоста сети. В больших сетях хранение и обновление таких файлов требует слишком большого объема ресурсов.
В иерархической сети задача преобразования имен всех хостов в IP-адреса возложена на определенные хосты, называемые серверами имен . Такая структура имеет ряд преимуществ. Для преобразования имен не используются ресурсы каждого хоста, а администратор системы освобождается от обязанности создавать и обновлять в каждой системе сети файлы с таблицами преобразования имен. Набор имен, которым управляет какой-либо сервер, называется его областью ответственности .
Примечание: Хост, выполняющий преобразование имен в области ответственности, обычно называют сервером имен , но на самом деле преобразование осуществляется процессом сервера с именем named .
Для снижения нагрузки на сеть все серверы имен в течение определенного времени хранят адреса, полученные с других серверов, в кэше . Когда клиент обращается к серверу с запросом на преобразование имени, сервер сначала просматривает свою кэш-память и определяет, не преобразовывал ли он уже это имя. Так как имена доменов и хостов могут изменяться, то каждый элемент остается в кэш-памяти в течение ограниченного времени, которое определяется параметром времени хранения в кэше (TTL). Таким образом, в пределах области ответственности можно задать период времени, на протяжении которого выполняется точное преобразование имен.
В автономных системах может применяться несколько серверов имен. Обычно серверы имен имеют иерархию, соответствующую структуре сети. На рисунке «Структура доменов Internet» в каждом домене может быть сервер имен, ответственный за все его субдомены. Сервер имен каждого субдомена связан с сервером имен домена более высокого уровня (с родительским сервером имен), а также с серверами имен других субдоменов.
Рис. 3-22. Структура имен доменов в Internet . На рисунке показана иерархическая структура сети Internet. Он начинается с корневого узла и разделяется на следующем уровне на домены mil, com и edu. На следующем уровне ветви com находятся домены Charlotte, Austin и Hopkins. В домене Austin находятся домены Dev и Graphics.
Например, на рисунке «Структура доменов Internet» субдомены Austin, Hopkins и Charlotte входят в состав домена Century. Если следовать иерархии организации сети, то сервер имен Austin должен взаимодействовать с серверами имен Charlotte и Hopkins, а также с родительским сервером имен Century. Кроме того, сервер имен Austin будет взаимодействовать с серверами имен других субдоменов.
Существует несколько типов серверов имен:
Главный сервер имен | Загружает свои данные из файла или с диска и может передавать полномочия другим серверам в своем домене. |
Подчиненный сервер имен | Во время загрузки системы получает с главного сервера информацию о выделенной ему области ответственности, а затем периодически обращается к главному серверу для обновления этой информации. По истечении периода обновления, указанного в записи ресурса начала области ответственности (SOA) на подчиненном сервере имен, а также при получении уведомляющего сообщения от главного сервера, подчиненный сервер заново загружает базу данных с главного сервера, если порядковый номер базы данных на главном сервере больше, чем ее порядковый номер на подчиненном сервере. Если необходимо принудительно передать с главного сервера новую информацию об области ответственности, достаточно просто удалить существующие базы данных с подчиненного сервера и обновить на нем программу-демон named . |
Сервер имен Stub | Способ копирования базы данных этим сервером аналогичен применяемому подчиненным сервером имен, однако этот сервер копирует только отдельные записи сервера базы данных главного сервера, а не всю базу данных. |
Сервер подсказок | Это сервер имен, который отвечает на запросы только на основании данных, полученных им в результате предыдущих обращений к другим сервером имен. Если в кэш-памяти сервера нет записей преобразования имен в адреса, то для ответа на запросы он обращается к другим серверам. |
Клиент или сервер пересылки | Этот сервер пересылает перечисленным серверам те запросы, которые он не может обработать самостоятельно. Серверы, предназначенные только для пересылки, только получают информацию и передают ее другим. Они не взаимодействуют с главными серверами имен корневого и других доменов. Для обращения к серверам пересылки используются рекурсивные запросы. Может быть определено несколько серверов пересылки, обращение к которым происходит по очереди, до тех пор, пока не исчерпается список. Серверы пересылки обычно применяются в том случае, когда вы не хотите, чтобы все серверы данной сети взаимодействовали с остальными серверами Internet, или когда необходимо создать на серверах имен кэш-память большого объема. |
Удаленный сервер | Выполняет все сетевые программы, использующие сервер имен; при этом процесс сервера имен на локальном хосте не запускается. Все запросы обслуживаются сервером имен, работающим в другой системе. |
Один и тот же хост может выполнять функции нескольких серверов имен с различными областями ответственности. Например, он может быть главным сервером имен для одной области и подчиненным сервером имен — для другой.
Процесс определения IP-адреса по имени хоста называется преобразованием имен и выполняется процедурой gethostbyname . Процесс получения имен хостов на основании известных IP-адресов называется обратным преобразованием имен и выполняется процедурой gethostbyaddr . Эти процедуры входят в состав библиотеки, содержащей все необходимые функции преобразования .
Для определения IP-адресов хостов в сети используются следующие источники:
- Сервер BIND/DNS (named)
- Служба информации о сети (NIS)
- Локальный файл /etc/hosts
Если установлена NIS+, параметры поиска настраиваются с помощью файла irs.conf . Более подробная информация приведена в книге AIX 5L Version 5.1 Network Information Services (NIS and NIS+) Guide .
Для преобразования имен в сети с иерархической структурой доменов процедуры преобразования сначала обращаются к базе данных сервера имен доменов, которая может быть локальной, если хост сам является сервером имен доменов, или может находиться на удаленном хосте. Серверы имен преобразуют имена доменов в IP-адреса. Группа имен, за которые отвечает сервер имен, называется его областью ответственности. Если в процедуре обработки появилось имя удаленного сервера имен, то она отправляет запрос процедуры преобразования по протоколу имен доменов (DOMAIN). Для преобразования имени в простой сети процедура преобразования выбирает запись из локального файла /etc/hosts . При использовании NIS или NIS+ выполняется проверка файла /etc/hosts на главном сервере.
По умолчанию процедуры преобразования используют средства, перечисленные выше. Сначала применяется BIND/DNS. Если файл /etc/resolv.conf отсутствует или если BIND/DNS не может выполнить преобразование, процедура обращается к NIS (если эта служба доступна). Так как служба NIS имеет более высокий приоритет, чем локальный файл /etc/hosts , то на этом поиск может завершиться. Если служба NIS недоступна, то процедура преобразования выполняет поиск в локальном файле /etc/hosts . Если ни одно из этих средств не позволило определить имя, то процедура преобразования выдаст сообщение ХОСТ_НЕ_НАЙДЕН. Если ни одна из служб не доступна, процедура выдаст сообщение СЛУЖБА_НЕДОСТУПНА.
Описанный выше порядок действий по умолчанию можно изменить, создав файл /etc/irs.conf и задав в нем требуемую последовательность выполнения процедур. Кроме того, порядок действий по умолчанию и порядок, определенный в файле /etc/irs.conf , можно изменить с помощью переменной среды NSORDER . Если задан файл /etc/irs.conf и переменная среды NSORDER , то необходимо задать хотя бы одно значение параметра.
Задание порядка поиска хостов с помощью файла /etc/irs.conf :
Порядок поиска задается путем перечисления возможных способов, по одному способу на строке. Значение — это один из способов, приведенных в списке, а ключевое слово continue указывает, что другой способ преобразования задан в следующей строке.
Задание порядка поиска хостов с помощью переменной среды NSORDER :
Порядок задается в одной строке, значения разделяются запятыми. Между запятыми и знаком равенства можно ставить пробел.
Например, в одноуровневой локальной сети необходим только файл /etc/hosts . В этом примере файл /etc/irs.conf будет содержать следующую строку:
В качестве альтернативы можно задать переменную среды NSORDER :
Если локальная сеть состоит из доменов и при этом в ней используется сервер имен, а в файле /etc/hosts хранится резервная таблица хостов, то необходимо задать использование обеих служб. В этом примере файл /etc/irs.conf будет содержать следующие строки:
Переменная среды NSORDER должна быть задана так:
Примечание: В параметрах следует указывать символы в нижнем регистре.
При любой последовательности преобразования переход к следующему методу выполняется при следующих условиях:
- Текущая служба не запущена, и поэтому недоступна.
- Текущая служба не смогла найти имя и не помечена как «ответственная».
Если файл /etc/resolv.conf не существует, службы BIND/DNS считаются недоступными. Если процедуры getdomainname и yp_bind не выполнены, то считается, что служба NIS не настроена или не работает и потому недоступна. Если файл /etc/hosts невозможно открыть, то локальный поиск невозможен, а следовательно, этот файл и эта служба недоступны.
Если служба в списке помечена как ответственная (authoritative) , значит достоверность передаваемой ею информации выше, чем у служб, находящихся в иерархии ниже ее, и она должна содержать все имена и адреса. Процедуры преобразования не будут обращаться к последующим службам, так как они содержат только часть информации, предоставляемой данной службой. Процедура преобразования завершает работу на уровне службы, помеченной как «ответственная», даже если она не нашла запрошенное имя (в этом случае процедура преобразования выдаст сообщение ХОСТ_НЕ_НАЙДЕН). Если ответственная служба недоступна, то процедура обращается к следующей службе.
Ответственный источник отмечен строкой =auth после значения. Может быть полностью указано слово authoritative , однако используется только часть auth . Например, если переменной среды NSORDER присвоено значение:
При получении ответа от NIS поиск будет завершен, даже если имя не будет найдено. Если служба NIS не работает, то процедура преобразования обратится к DNS.
Для более эффективного поиска имен хостов и сетей серверы имен TCP/IP используют кэш-память. Вместо того, чтобы выполнять поиск имени хоста при получении каждого запроса, сервер имен сначала просматривает свою кэш-память и определяет, не преобразовывал ли он уже это имя хоста. Так как имена доменов и хостов могут изменяться, то каждый элемент остается в кэш-памяти в течение ограниченного времени, которое определяется параметром времени хранения в кэше (TTL). Таким образом, для сервера имен можно задать период времени, на протяжении которого его ответы могут считаться достоверными.
В среде DNS имя хоста, которое задается с помощью команды hostname в командной строке или в файле rc.net , должно быть официальным именем хоста, известным серверу имен. В общем случае это полное имя хоста в следующем формате:
Примечание: Для работы процедур преобразования необходимо задать имя домена по умолчанию. Если имя домена по умолчанию в команде hostname не указано, то оно должно быть задано в файле /etc/resolv.conf .
Если имя хоста задано в краткой форме, а также если система настроена на использование сервера имен доменов совместно с программой sendmail , то в файле конфигурации программы sendmail (файл /etc/sendmail.cf ) необходимо указать официальное имя хоста. Кроме того, для правильной работы программы sendmail в этом файле конфигурации нужно задать макроопределение имени домена.
Примечание: Для всех функций программы sendmail домен, описанный в файле /etc/sendmail.cf , имеет более высокий приоритет, чем домен, заданный командой hostname .
Для хоста, не являющего сервером имен, имена локального домена и сервера имен задаются в файле /etc/resolv.conf . Для сервера имен домена локальный домен и другие серверы имен задаются в файлах, которые демон named считывает при запуске.
Протокол обратного преобразования адресов (RARP) преобразует уникальные аппаратные адреса адаптеров сети Ethernet в IP-адреса. Стандартный протокол Ethernet поддерживается со следующими ограничениями:
- Сервер отвечает на запросы RARP.
- Сервер использует только записи постоянной таблицы ARP.
- Сервер не использует записи постоянной таблицы ARP.
- Сервер не отвечает на запросы автоматически.
Системный администратор должен вручную создать и обновлять таблицу постоянных записей с помощью команды arp . На сервере необходимо добавить в таблицу ARP запись для каждого хоста, который требует ответов RARP от ответственного источника.
В небольшой одноуровневой сети достаточно настроить файл /etc/hosts . В случае организации иерархической (доменной) схемы присвоения имен и применения серверов имен файл /etc/hosts может потребоваться для идентификации тех хостов, которые неизвестны серверам имен.
Настроить систему для локального преобразования имен хостов можно с помощью Web-администратора системы, Инструмента управления системой (SMIT), а также с помощью специальных команд. При настройке с помощью команд постарайтесь сохранить формат файла /etc/hosts , описанный в разделе Hosts File Format for TCP/IP в книге AIX 5L Version 5.1 Files Reference .
Задачи по локальному преобразованию имен | |||
---|---|---|---|
Процедура | Команда быстрого доступа из SMIT | Команда или имя файла | Среда Web-администратора системы |
Показать список всех хостов | smit lshostent | view /etc/hosts | Программное обеспечение Сеть TCPIP (IPv4 и IPv6) Настройка протокола TCPIP TCP/IP Настроить TCP/IP Вручную Файл hosts Содержимое файла /etc/hosts . |
Добавить хост | smit mkhostent | edit /etc/hosts | Программное обеспечение Сеть TCPIP (IPv4 и IPv6) Настройка протокола TCPIP TCP/IP Настроить TCP/IP Вручную Файл hosts . В окне Добавить/изменить запись для хоста заполните следующие поля: IP-адреса , Имя хоста , Псевдонимы и Комментарий . Щелкните на Добавить/изменить запись OK . |
Изменить/показать параметры хоста | smit chhostent | edit /etc/hosts | Программное обеспечение Сеть TCPIP (IPv4 и IPv6) Настройка протокола TCPIP TCP/IP Настроить TCP/IP Вручную Файл hosts . Выберите хост в списке Содержимое файла /etc/hosts и измените данные в поле Добавить/изменить запись о хосте . Щелкните на Добавить/изменить запись OK . |
Удалить хост | smit rmhostent | edit /etc/hosts | Программное обеспечение Сеть TCPIP (IPv4 и IPv6) Настройка протокола TCPIP TCP/IP Настроить TCP/IP Вручную Файл hosts . Выберите хост в списке Содержимое файла /etc/hosts и щелкните на Удалить запись OK . |
Если ваша сеть представляет собой часть большой сети, то настройку серверов имен и доменов нужно будет согласовывать с организацией, обслуживающей зону ответственности, в которую входит ваша сеть.
Ниже приведены рекомендации по планированию системы DOMAIN:
- Для полноценного использования всех возможностей системы рекомендуется хорошо изучить TCP/IP, DNS и BIND. Если вы планируете применять службы информации о сети, то ознакомьтесь также с NFS и NIS. Существует огромное количество книг, посвященных этим вопросам. Более подробная информация о NIS и NIS+ приведена в книге AIX 5L Version 5.1 Network Information Services (NIS and NIS+) Guide .
- Учитывайте будущие потребности.
Изменить имя существенно сложнее, чем сразу выбрать его правильно. Перед изменением файлов конфигурации обязательно согласуйте выбранные имена сетей, шлюзов, серверов имен и хостов с руководством вашей организации.
Создайте резервные серверы имен.
Если это невозможно, обязательно создайте подчиненные серверы имен или серверы подсказок, что обеспечит хотя бы минимальную защиту от сбоев.
- Выбирайте компьютеры, которые физически находятся ближе других к внешним системам.
- Серверы имен должны быть как можно более автономными. Постарайтесь подключить их к отдельным источникам питания и независимым кабельным системам.
- Храните резервные копии данных вашей службы преобразования имен в другой сети и не отказывайте в аналогичной услуге администраторам других сетей.
- Проверяйте как прямое, так и обратное преобразование имен.
- Проверяйте передачу информации об областях ответственности от главного к подчиненным серверам имен.
- Проверяйте каждый сервер имен после сбоя или перезагрузки системы.
В иерархической сети некоторые хосты выполняют функции серверов имен . Эти хосты преобразуют имена других хостов в IP-адреса. Работой сервера имен управляет программа-демон named , которая должна быть запущена на хосте — сервере имен.
Перед настройкой определите, какие типы серверов имен лучше всего подходят для обслуживания вашей сети. Существует несколько типов серверов имен.
Главный сервер имен хранит базу данных с таблицами преобразования имен в адреса. Он загружает свои данные из файла или с диска и может передавать полномочия другим серверам своего домена. Подчиненный сервер имен или сервер имен Stub получает информацию об области ответственности от главного сервера имен во время запуска системы, а затем периодически обращается к главному серверу для обновления этой информации. Сервер подсказок отвечает на запросы о преобразовании имени с помощью информации, полученной им от других серверов.
Примечание: В предыдущих версиях сервера имен named главный сервер имен определялся как основной, подчиненный сервер имен — как дополнительный, а сервер подсказок — как сервер кэш-памяти. Все ссылки на файл named.conf в данном руководстве соответствуют AIX версии 4.3.2 и выше.
Помните, что один и тот же сервер имен может выполнять разные функции в различных областях ответственности. Например, он может быть главным сервером имен для одной области и подчиненным — для другой. Если в вашей системе установлена NIS или NIS+, то эти службы также выполняют преобразование имен. Более подробная информация приведена в книге AIX 5L Version 5.1 Network Information Services (NIS and NIS+) Guide .
Параметры серверов имен задаются в нескольких файлах.
conf | Этот файл считывается при запуске демона named . Записи файла conf сообщают программе named тип сервера, задают список доменов, входящих в область его ответственности, и указывают, откуда следует брать данные для первоначального заполнения базы данных сервера. По умолчанию этот файл называется /etc/named.conf . Вы можете изменить это имя, задав новое имя и путь в командной строке при запуске программы named . Если вы укажете несуществующий файл конфигурации с именем /etc/named.conf , то в протокол syslog заносится сообщение, а работа демона named завершается. Однако если указан несуществующий альтернативный файл конфигурации, то сообщение не создается, и программа named продолжает работу. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
cache | Содержит информацию о локальной кэш-памяти. Файл локальной кэш-памяти содержит имена и адреса серверов с наибольшей областью ответственности. Файл кэш-памяти имеет стандартный формат записи ресурса. Имя файла кэш-памяти задается в файле conf . | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
данные о домене | Существует три типа файлов данных о домене, называемых также файлами данных named . Локальный файл named содержит информацию о преобразовании локальных циклических адресов. Файл данных named содержит данные о преобразовании имен для всех систем, находящихся в области ответственности сервера имен. Файл данных для обратного преобразования named содержит данные об обратном преобразовании адресов для систем, находящихся в области ответственности сервера. Файлы данных о домене используют стандартный формат записи ресурса. Имена этих файлов задаются пользователем и указываются в файле conf . Общепринято, чтобы в имена этих файлов включалось имя демона named , а в расширение — тип файла и имя домена. Например, сервер имен для домена abc должен иметь следующие файлы:
При внесении изменений в файлы данных named порядковый номер записи ресурса SOA для подчиненных серверов имен должен быть увеличен, чтобы правильно отражать новую область ответственности. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
resolv.conf | Наличие этого файла сообщает хосту, что для преобразования имен он сначала должен обращаться к серверу имен. Если файл resolv.conf отсутствует, то для преобразования имен хост просматривает файл /etc/hosts . На сервере имен должен существовать файл resolv.conf , который может содержать адрес локального хоста, циклический адрес (127.0.0.1), или может быть пустым.
Время хранения в кэш-памяти (TTL) задается в записях ресурсов. Если в записи ресурса параметр TTL не указан, то по умолчанию он устанавливается равным минимальному значению, заданному для данной области в записи начала области ответственности (SOA). Параметр TTL используется в том случае, когда данные хранятся вне области ответственности (в кэш-памяти), при этом вы можете быть уверены, что время хранения данных будет ограничено. Для настройки главного сервера имен вызовите Web-администратор системы ( wsm ), запустите демон named из командной строки, либо воспользуйтесь следующей процедурой, в ходе которой изменяется ряд файлов и используется программа SMIT. Внесите необходимые изменения в файл /etc/named.conf . Если в каталоге /etc нет файла named.conf , скопируйте файл /usr/samples/tcpip/named.conf в каталог /etc и отредактируйте его. Более подробная информация и примеры файла конфигурации приведены в разделе named.conf File Format for TCP/IP книги AIX 5L Version 5.1 Files Reference . Этот файл считывается при каждом запуске демона named . В нем указывается тип сервера, область (или области) его ответственности и источник для загрузки начальной информации. Если это необходимо, задайте с помощью оператора options каталог, в котором расположены файлы данных named . Например: Если вы хотите, чтобы данные сервера имен заносились в кэш вне определенных зон, то укажите имя файла дополнительной информации. Например: Задайте число областей. Для настройки сервера в качестве главного сервера области, опишите каждую область и задайте для нее файл данных о домене. Например, главный сервер для областей прямого и обратного преобразования может быть описан так: Задайте имя локального файла named . Например:
Отредактируйте файл /etc/named.ca . В разделе DOMAIN Cache File Format for TCP/IP книги AIX 5L Version 5.1 Files Reference приведена более подробная информация и примеры файла кэша. В этом файле указаны адреса ответственных (или корневых ) серверов локального домена. Например: Задайте запись сервера имен (NS). Например: Задайте запись указателя (PTR). Включите информацию о преобразовании имен в адреса для всех хостов, находящихся в области ответственности сервера имен. Например: Внесите записи серверов имен для всех главных серверов имен в области. Например: Внесите другие необходимые типы записей, например, записи канонических имен или записи систем обмена почтой. Внесите информацию о преобразовании адресов в имена для всех хостов, находящихся в области ответственности сервера имен. Внесите другие необходимые типы записей, например, записи имен хостов и записи серверов имен. Наличие этого файла указывает хосту, что при преобразовании имен он должен использовать сервер имен, а не файл /etc/hosts . Этот файл должен существовать на сервере имен и может содержать адрес локального хоста, циклический адрес (127.0.0.1) или быть пустым. В другом варианте файл /etc/resolv.conf может содержать запись: 127.0.0.1 — это циклический адрес, по которому хост обращается к самому себе, как к серверу имен. Файл /etc/resolv.conf может также содержать примерно следующую запись: В предыдущем примере значение имени_домена равно aus.century.com .
Эта команда указывает, что демон должен инициализироваться при каждом запуске системы. Если вы не хотите инициализировать программу named с помощью SMIT, запустите ее для данного сеанса с помощью команды Для настройки подчиненного сервера имен можно воспользоваться Web-администратором системы ( wsm ) или следующей процедурой, в рамках которой сначала нужно отредактировать несколько файлов, а затем запустить демон named с помощью Инструмента управления системой (SMIT) или из командной строки. Внесите необходимые изменения в файл /etc/named.conf . Если в каталоге /etc нет файла named.conf , скопируйте файл /usr/samples/tcpip/named.conf в каталог /etc и отредактируйте его. Более подробная информация и примеры файла conf приведены в разделе named.conf File Format for TCP/IP книги AIX 5L Version 5.1 Files Reference . Файл conf считывается при каждом запуске демона named . В нем указывается тип сервера, область его ответственности и источник для загрузки начальной информации. Если это необходимо, задайте с помощью оператора options каталог, в котором расположены файлы данных named . Например: Если вы хотите, чтобы данные сервера имен заносились в кэш вне определенных зон, то укажите имя файла дополнительной информации. Например: Задайте области ответственности подчиненного сервера. Каждый раздел включает тип области, необязательное имя файла, в котором сервер имен хранит резервную копию своих данных, и список IP-адресов главных серверов. В этом списке адресов указаны хосты, с которых будет получаться информация об области. Например: Введите операторы области ответственности подчиненного сервера, задающие информацию об обратном преобразовании. Например: Для поддержки преобразования циклического сетевого адреса определите область с типом master с источником /etc/named.local , а также домен, за который отвечает сервер имен.
Отредактируйте файл /etc/named.ca . В разделе DOMAIN Cache File Format for TCP/IP книги AIX 5L Version 5.1 Files Reference приведена более подробная информация и примеры файла кэша. В этом файле содержатся адреса ответственных серверов (NS) для корневого домена сети. Например: Задайте запись сервера имен (NS). Например: Задайте запись указателя (PTR). Наличие этого файла указывает хосту, что при преобразовании имен он должен использовать сервер имен, а не файл /etc/hosts . Вы также можете задать записи, определяющие имя, домен и адрес сервера имен.
Эта команда указывает, что демон должен инициализироваться при каждом запуске системы. Для настройки сервера подсказок (или кэш-сервера) можно воспользоваться Web-администратором системы ( wsm ) или следующей процедурой, в рамках которой нужно сначала отредактировать некоторые файлы, а затем запустить демон named с помощью программы SMIT или из командной строки. Для настройки сервера подсказок выполните следующие действия: Внесите необходимые изменения в файл /etc/named.conf . Если в каталоге /etc нет файла named.conf , скопируйте файл /usr/samples/tcpip/named.conf в каталог /etc и отредактируйте его. Более подробная информация и примеры файла conf приведены в разделе named.conf File Format for TCP/IP книги AIX 5L Version 5.1 Files Reference . Для поддержки преобразования циклического сетевого адреса определите область с типом master с источником /etc/named.local , а также домен, за который отвечает сервер имен. Например: Укажите файл кэша для области подсказок. Например:
Отредактируйте файл /etc/named.ca . В разделе DOMAIN Cache File Format for TCP/IP книги AIX 5L Version 5.1 Files Reference приведена более подробная информация и примеры файла кэша. В этом файле содержатся адреса ответственных серверов корневого домена сети. Например: Задайте запись сервера имен (NS). Например: Задайте запись указателя (PTR). Наличие этого файла указывает хосту, что при преобразовании имен он должен использовать сервер имен, а не файл /etc/hosts . При желании вы можете задать записи, определяющие имя, домен и адрес сервера имен.
Эта команда указывает, что демон должен инициализироваться при каждом запуске системы. Если вы не хотите инициализировать программу named с помощью SMIT, запустите ее для данного сеанса с помощью команды Почтовый сервер упрощает передачу сообщений пользователям вашей организации из внешней сети. Если такого сервера нет, то в почтовом адресе должен указываться конкретный хост в сети организации. Например, sam@orange.widget.com , где widget.com — имя домена вашей организации, а orange — хост, который использует sam . При наличии почтового сервера внешним пользователям достаточно указать только имя адресата (без имени хоста, который он использует) и имя домена вашей организации, например, sam@widget.com . Для настройки почтового сервера воспользуйтесь Web-администратором системы ( wsm ) или одной из следующих процедур.
Добавьте в файл sendmail.cf на почтовом сервере ( black.widget.com ) псевдоним домена (класс w ): Укажите почтовым клиентам, куда они должны направлять сообщения, адресованные во внешние сети. Для этого в файле sendmail.cf каждого клиента задайте ссылку на почтовый сервер (макрокоманда S ):
Есть и другие способы настройки почтового сервера доменов. В приведенных ниже процедурах используются записи MB (почтовый ящик), MR (переименование почты) и MG (почтовая группы).
в файл /etc/named.data на хосте brown.widget.com . Такие записи сообщают почтовому серверу black.widget.com , куда следует направлять почту для каждого пользователя в домене.
Задание такой записи приведет к тому, что все почтовые отправления, адресованные sammy , будут доставляться пользователю sam . Каждая запись MR должна задаваться в отдельной строке.
В этом случае все почтовые сообщения, направляемые по адресу users@widget.com , будут доставляться пользователям sam , david и judy . Каждая запись MG должна задаваться в отдельной строке.
В записях MX нужно задавать как имя хоста, так и имя компьютера. Каждая запись MG должна задаваться в отдельной строке. Можно использовать символы подстановки, например: В этом примере почта, поступающая на неизвестный хост (хост без заданной явно записи MX) домена widget.com , будет пересылаться по адресу post.office.widget .
Для настройки сервера пересылки можно воспользоваться Web-администратором системы ( wsm ) или следующей процедурой, в рамках которой нужно сначала отредактировать некоторые файлы, а затем запустить демон named с помощью программы SMIT или из командной строки. Внесите необходимые изменения в файл /etc/named.conf . Если в каталоге /etc нет файла named.conf , скопируйте файл /usr/samples/tcpip/named.conf в каталог /etc и отредактируйте его. Более подробная информация и примеры файла конфигурации приведены в разделе «named.conf File Format for TCP/IP» книги AIX 5L Version 5.1 Files Reference . Задайте серверы пересылки в строке forwarders файла /etc/named.conf . В этой строке нужно указать IP-адреса серверов имен, на которые нужно пересылать запросы. Например: Задайте область подсказок. Например:
Отредактируйте файл /etc/named.ca . В разделе «DOMAIN Cache File Format for TCP/IP» книги AIX 5L Version 5.1 Files Reference приведена более подробная информация и примеры файла кэша. В этом файле содержатся адреса ответственных серверов корневого домена сети. Например:
Задайте запись сервера имен (NS). Например: Задайте запись указателя (PTR). Наличие этого файла указывает хосту, что при преобразовании имен он должен использовать сервер имен, а не файл /etc/hosts . В другом варианте файл /etc/resolv.conf может содержать запись: 127.0.0.1 — это циклический адрес, по которому хост обращается к самому себе, как к серверу имен. Файл /etc/resolv.conf может содержать и такие записи: В предыдущем примере в качестве параметра имя_домена было указано значение austin.century.com .
Эта команда указывает, что демон должен инициализироваться при каждом запуске системы. Если вы не хотите инициализировать демон named с помощью SMIT, запустите его для данного сеанса с помощью команды Для настройки сервера пересылки можно воспользоваться Web-администратором системы ( wsm ) или следующей процедурой, в рамках которой нужно сначала отредактировать некоторые файлы, а затем запустить демон named с помощью программы SMIT или из командной строки.
Отредактируйте файл /etc/named.ca . В разделе DOMAIN Cache File Format for TCP/IP книги AIX 5L Version 5.1 Files Reference приведена более подробная информация и примеры файла кэша. В этом файле содержатся адреса ответственных серверов корневого домена сети. Например:
Задайте запись сервера имен (NS). Например: Задайте запись указателя (PTR). Наличие этого файла указывает хосту, что при преобразовании имен он должен использовать сервер имен, а не файл /etc/hosts . В другом варианте файл /etc/resolv.conf может содержать запись: 127.0.0.1 — это циклический адрес, по которому хост обращается к самому себе, как к серверу имен. Файл /etc/resolv.conf может содержать и такие записи: В предыдущем примере в качестве параметра имя_домена было указано значение austin.century.com .
Эта команда указывает, что демон должен инициализироваться при каждом запуске системы. Если вы не хотите инициализировать программу named с помощью SMIT, запустите ее для данного сеанса с помощью команды Для настройки хоста для работы с сервером имен воспользуйтесь Web-администратором системы ( wsm ) или выполните следующую процедуру.
Чтобы определить, выполняет ли сервер преобразование имен, укажите какое-либо имя хоста. В результате операции вы должны получить примерно следующее сообщение: В таблице приведены другие задачи настройки.
В любой пустой строке ниже строки domain задайте слово nameserver , а затем через один или несколько пробелов укажите IP-адрес сервера имен, который будет использоваться данным хостом (сервер имен будет обслуживать домен, указанный в строке domain ). Можно перечислить до 16 серверов имен. Например, ваш файл /etc/resolv.conf может содержать следующие записи: Система будет обращаться к серверам имен в порядке их следования в списке. Команда named поддерживает динамическое обновление информации. Необходимо настроить файлы конфигурации и базы данных named таким образом, чтобы клиенты могли выполнять обновление. Область может быть задана как динамическая или как статическая. По умолчанию применяются статические области. Для создания динамической области нужно добавить ключевое слово allow-update в раздел области (zone) в файле /etc/named.conf . Ключевое слово allow-update определяет список IP-адресов хостов, которым разрешено обновление. Более подробная информация и примеры файла conf приведены в разделе named.conf File Format for TCP/IP книги AIX 5L Version 5.1 Files Reference . В приведенном ниже примере обновлять динамическую область разрешено всем хостам: После того, как динамическая область описана, можно установить один из следующих трех режимов защиты области:
По умолчанию для динамических областей применяется незащищенный режим (unsecured). Для использования другого режима добавьте слово controlled или presecured после ключевого слова update-security в разделе области файла /etc/named.conf . Это слово сообщает серверу named , какой уровень защиты он должен использовать при работе с этой областью. Например: После выбора режима в соответствии с уровнем защиты необходимо изменить существующие файлы данных. В незащищенном режиме файлы данных используются «как есть». В управляемом или предварительно защищенном режиме необходимо создать набор пар ключей главного сервера/имени хоста для каждого имени в данной области. Это можно сделать с помощью команды nsupdate с параметром -g . Эта команда создает пару ключей (личный ключ и общий ключ). Эти ключи используются для создания идентификационных меток обновления. После создания всех ключей для списка имен областей, добавьте их в файл данных. Запись KEY имеет следующий формат: где:
Для того чтобы убедиться, что для имени хоста в динамической области установлена защита, необходимо добавить следующую строку в определение области, в которую входит данный хост: В этом примере для хоста bears определена запись KEY. Каждый, кто захочет обновить bears , должен будет пометить свое обновление личным ключом, совпадающим с общим ключом в базе данных. Для того чтобы команда nsupdate была успешно выполнена, необходимо разместить общий ключ в файле ключей клиента (по умолчанию, /etc/keyfile ). Он должен иметь следующий формат: Аналогичную запись KEY необходимо указать в разделе описания области. Ключ области должен быть указан и для режима presecured и для режима controlled. Если этого не сделать, то будет применяться незащищенный режим. Это можно сделать так же, как в примере с bears , но личный ключ должен быть оставлен администратору для использования его с командой nsupdate в административном режиме. Для создания пары ключей с помощью команды nsupdate введите: При этом создается ключ для области. Укажите последний ключ из пары в начале раздела описания области следующим образом: Теперь область готова к загрузке. Администратор должен использовать ключ области при выполнении операций по обновлению и обслуживанию области. Протокол Lightweight Directory Access Protocol (LDAP) — это открытый стандартный протокол, регламентирующий способ получения и изменения информации в каталоге. Схема LDAP определяет правила заказа данных. Класс объектов ibm-HostTable , входящий в схему IBM SecureWay Directory, можно применять для хранения таблиц преобразования имен хостов в адреса. Класс объектов ibm-HostTable определен следующим образом: Определения атрибутов приведены ниже: Для настройки сервера LDAP в качестве хранилища таблицы хостов выполните следующие действия:
gethostbyname(), gethostbyaddr()Получают IP адрес хоста по имени или наоборот. Прототип struct hostent *gethostbyname(const char *name); // УСТАРЕЛО! struct hostent *gethostbyaddr(const char *addr, int len, int type); Описание Эти функции заменены на getaddrinfo()и getnameinfo()! В частности, gethostbyname()не очень хорошо работает с IPv6. Эти функции выполняют преобразование имён хостов в IP адреса и обратно. Например, если есть“ www. example. com”, можно использовать gethostbyname()чтобы получить IP адрес и сохранить его в struct in_addr. И наооборот, если у вас есть struct in_addr или struct in6_addr, можете воспользоваться gethostbyaddr()чтобы получить назад имя хоста. gethostbyaddr()совместима с IPv6, но пользоваться нужно getnameinfo()поновее и поярче. (Если у вас есть строка с IP адресом в формате цифр-и-точек для которой вы хотите узнать имя хоста, то вам лучше воспользоваться getaddrinfo()с флагом AI_CANONNAME.) gethostbyname()принимает строку вроде “www.guap.ru” и возвращает struct hostent, которая содержит тонны информации, включая IP адрес. (Другая информация это официальное имя хоста, список псевдонимов, тип адреса и список адресов. Это структура общего назначения и вы увидели как очень просто использовать её в наших особых целях.) gethostbyaddr()принимает struct in_addr или struct in6_addr и выдаёт соответствующее имя хоста (если оно есть), так что это функция, обратная gethostbyname(). Насчёт параметров, даже хотя addr меет тип char*, в действительности вам надо передавать указатель на struct in_addr. len должна быть sizeof(struct in_addr), и type должен быть AF_INET. Что это за struct hostent, которую нам возвращают? Она содержит множество полей, содержащих информацию о запрошенном хосте. char *h_name Настоящее каноническое имя хоста char **h_aliases Список псевдонимов, к нему можно обращаться, как к массиву, последний элемент содержит NULL int h_addrtype Тип адреса результата, в нашем случае должен быть AF_INET int length Длина адресов в байтах (4 для IPv4) char **h_addr_list Список IP адресов этого хоста. Хоть он и char**, в действительности это массив переодетых struct in_addr*. Последний элемент массива равен NULL. h_addr Псевдоним h_addr_list[0]. Если вам нужен любой старый IP адрес этого хоста (да, у них может быть несколько) используйте это поле. Возвращаемое значение Возвращает указатель на получившуюся struct hostent или NULL при ошибке. Вместо нормальной perror()и всего прилагающегося для выдачи сообщений об ошибке, эти функции пишут результат в переменную h_errno, которую можно распечатать функциями herror()или hstrerror(). Это подобно классической errno, perror(), и strerror(). int main(int argc, char *argv[]) struct hostent *he; struct in_addr **addr_list; fprintf(stderr,»usage: ghbn hostname\n»); // распечатать информацию об этом хосте: printf(«Official name is: %s\n», he->h_name); printf(» IP addresses: «); addr_list = (struct in_addr **)he->h_addr_list; for(i = 0; addr_list[i] != NULL; i++) < // взамен используйте getnameinfo()! struct hostent *he; struct in_addr ipv4addr; struct in6_addr ipv6addr; printf(«Host name: %s\n», he->h_name); Errno Содержит код ошибки последнего системного вызова. Прототип Описание Эта переменная содержит информацию об ошибках для множества системных вызовов. Если при вызове, например, socket()или listen()происходит ошибка, то возвращается -1 и в errno устанавливается код, позволяющий точно определить, что случилось. В заголовочном файле errno.h перечислены все символические имена ошибок, как EADDRINUSE, EPIPE, ECONNREFUSED и т.д. В большинстве систем errno определена потокобезопасным способом. (То есть, в действительности она не глобальная переменная, но ведёт себя так, как должна вести себя глобальная переменная в однопотоковой среде.) Возвращаемое значение Значение переменной это код последней произошедшей ошибки, но может означать “успех” если последнее действие завершилось удачно. Пример s = socket(PF_INET, SOCK_STREAM, 0); if (s == -1) < perror(«socket»); // или используйте strerror() if (select(n, &readfds, NULL, NULL) == -1) < // если мы просто прерваны, просто перезапуск вызовом select(): if (errno == EINTR) goto tryagain; // AAAA! goto. // иначе это ошибка посерьёзней: Listen() Предписывает сокету слушать входящие подключения. Прототип int listen(int s, int backlog); Описание Параметр backlog означает резерв — сколько ожидающих соединений можете иметь до того, как ядро начнёт отбрасывать новые. Так что, как только придёт новое соединение, необходимо быстро принять (accept()) его, чтобы не переполнять резерв. Можно установить 10 или около того, и если при высокой нагрузке, ваши клиенты начнут получать “Connection refused” (“Соединение отвергнуто”), следует установить побольше. Перед вызовом listen()сервер должен вызвать bind()чтобы подключиться к определённому номеру порта. Клиенты будут подключаться к этому порту на IP адресе сервера. Возвращаемое значение Возвращает 0 при успехе или -1 в случае ошибки (errno устанавливается соответственно). Пример struct addrinfo hints, *res; int sockfd; // сначала заполняем адресные структуры с помощью getaddrinfo(): memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; // использовать либо IPv4 либо IPv6 hints.ai_flags = AI_PASSIVE; // заполнить мой IP для меня getaddrinfo(NULL, «3490», &hints, &res); sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); // связать с портом, переданным getaddrinfo(): bind(sockfd, res->ai_addr, res->ai_addrlen); listen(sockfd, 10); // где-то дальше есть цикл accept() Perror(), strerror() Распечатывают ошибку как читаемую строку Прототип #include // для strerror() Void perror(const char *s); char *strerror(int errnum); Описание Очень много функций при ошибке возвращают -1 и записывают в errno некоторое число, и было бы удобно, если бы можно было распечатать в понятной форме. И perror()это делает. Если необходимо добавить описание перед сообщением об ошибке, следует передать указатель на него в параметре s (можно оставить s как NULL и ничего дополнительно не напечатается.) Эта функция берёт значение errno, вроде ECONNRESET, и печатает его как “Connection reset by peer.” Функция strerror()подобна perror(), за исключением того, что она возвращает указатель на строку с сообщением об ошибке для заданного параметром errnum значения (обычно переменная передаётся в errno.) Возвращаемое значение strerror()возвращает указатель на строку с сообщением об ошибке. Пример s = socket(PF_INET, SOCK_STREAM, 0); if (s == -1) < // ошибка вышла // печатает «socket error: » + сообщение об ошибке: if (listen(s, 10) == -1) < // это печатает «an error: » + сообщение об ошибке из errno: printf(«an error: %s\n», strerror(errno)); Recv(), recvfrom() Принимают данные из сокета. Прототип ssize_t recv(int s, void *buf, size_t len, int flags); ssize_t recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen); Описание Как только сокет создан и подключен, можно принимать из него данные вызовами recv()(для TCP SOCK_STREAM сокетов) и recvfrom()(для UDP SOCK_DGRAM сокетов). Обе функции принимают дескриптор сокета s, указатель на буфер buf, длину буфера в байтах len, и набор флагов flags, определяющих работу функций. Дополнительно, recvfrom()принимает struct sockaddr* from, указывающую откуда принимать данные и запишет в fromlen размер struct sockaddr. (Можно тоже инициализировать fromlen размером from или struct sockaddr.) Возвращаемое значение Возвращает число действительно принятых данных (что может быть меньше затребованного в параметре len), или -1 при ошибке (errno будет установлен соответственно.) Если удалённая сторона закрыла соединение, то recv()вернёт 0. Это нормальный способ определения того, что удаленная сторона закрыла соединение. Пример / потоковые сокеты и recv() struct addrinfo hints, *res; int sockfd; char buf[512]; int byte_count; // получить информацию хоста, создать сокет и подключиться memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; // использовать либо IPv4 либо IPv6 hints.ai_socktype = SOCK_STREAM; getaddrinfo(«www.example.com», «3490», &hints, &res); sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); connect(sockfd, res->ai_addr, res->ai_addrlen); // Прекрасно! Мы подключены и можем принимать данные! byte_count = recv(sockfd, buf, sizeof buf, 0); printf(«recv()’d %d bytes of data in buf\n», byte_count); //дейтаграммные сокеты и recvfrom() struct addrinfo hints, *res; int sockfd; int byte_count; socklen_t fromlen; struct sockaddr_storage addr; char buf[512]; // получить информацию хоста, создать сокет и подключиться к порту 4950 memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; // использовать либо IPv4 либо IPv6 hints.ai_socktype = SOCK_DGRAM; hints.ai_flags = AI_PASSIVE; getaddrinfo(NULL, «4950», &hints, &res); sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); bind(sockfd, res->ai_addr, res->ai_addrlen); // accept() не нужен, только recvfrom(): fromlen = sizeof addr; byte_count = recvfrom(sockfd, buf, sizeof buf, 0, &addr, &fromlen); printf(«recv()’d %d bytes of data in buf\n», byte_count); printf(«from IP address %s\n», ((struct sockadd_in *)&addr)->sin_addr: ((struct sockadd_in6 *)&addr)->sin6_addr, ipstr, sizeof ipstr); Select() Проверяет готовы ли дескрипторы сокетов к чтению — записи. Прототип int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); FD_SET(int fd, fd_set *set); FD_CLR(int fd, fd_set *set); FD_ISSET(int fd,fd_set*set); FD_ZERO(fd_set *set); Описание Функция select()предоставляет способ одновременной проверки множества сокетов на предмет ожидания recv(), готовности к передаче данных через send()без блокирования или возникновения исключения. После того как макросы вроде FD_SET()использованымассива структур можно передать его функции как один из следующих параметров: readfds если хотите знать, готов ли какой-нибудь сокет из массива к recv(), writefds если какой-либо сокет готов к send(), и/или exceptfds если если нужно узнать произошло ли на каком-нибудь исключение в сокете. Любой их этих параметров может быть NULL если этот тип событий неинтересен. После возврата из select()значения в массиве будут изменены, чтобы показать, какие сокеты готовы к чтению — записи и какие имеют исключения. Первый параметр, n это наивысший номер дескриптора сокета (они просто int) плюс один. Напоследок, struct timeval *timeout в конце позволяет указать select()как долго проверять эти массивы. Она вернёт управление при истечении таймаута или при возникновении события, смотря что раньше. В struct timeval есть два поля: tv_sec это количество секунд, к которому добавляется tv_usec, количество микросекунд (1 000 000 микросекунд в секунде.) Вспомогательные макросы делают следующее:
Возвращаемое значение Возвращает количество дескрипторов с событиями в массиве, 0 если таймаут истёк и -1 при ошибке (errno устанавливается соответственно.) Кроме того, массивы изменяются чтобы показать готовые сокеты. Пример t s1, s2, n; fd_set readfds; struct timeval tv; char buf1[256], buf2[256]; // полагаем, что здесь оба подключены к серверу // заранее очищаем массив FD_ZERO(&readfds); // добавляем наши дескрипторы в массив FD_SET(s1, &readfds); // поскольку s2 создан вторым, он “больше” и его используем // в параметре n в select() n = s2 + 1; // ждём появления данных на каком-либо сокете (таймаут 10.5 секунд) tv.tv_sec = 10; perror(«select»); // в select() произошла ошибка printf(«Timeout occurred! No data after 10.5 seconds.\n»); // на одном или обоих дескрипторах есть данные if (FD_ISSET(s1, &readfds)) < recv(s1, buf1, sizeof buf1, 0); if (FD_ISSET(s2, &readfds)) < recv(s1, buf2, sizeof buf2, 0); Socket() Создаёт дескриптор сокета Прототип int socket(int domain, int type, int protocol); Описание Возвращает дескриптор сокета, который можно использовать. Обычно это первый шаг в процессе написания программ с сокетами и результат можно использовать в последующих вызовах listen(), bind(), accept()или множества других функций. Обычно значения параметров получается из вызова getaddrinfo(), как в примере ниже, но можно их заполнять и вручную. domain определяет тип нужного вам сокета. Их может быть множество, но поскольку это руководство по сокетам tcp/ip, он будет PF_INET для IPv4 и PF_INET6 для IPv6. type Хотя параметр type может принимать множество значений, его следует установить в SOCK_STREAM для надёжных TCP сокетов (send(), recv()) либо SOCK_DGRAM для ненадёжных быстрых UDP сокетов (sendto(), recvfrom().) protocol Параметр protocol указывает какой протокол использовать для этого типа сокетов, например, SOCK_STREAM использует TCP. Если будет использоваться SOCK_STREAM или SOCK_DGRAM, можно просто установить protocol в 0, и он автоматически использует правильный протокол. Иначе можно использовать getprotobyname()для выбора номера нужного протокола. Возвращаемое значение Дескриптор нового сокета для последующих вызовов или -1 при ошибке (и errno будет установлен соответственно.) Пример sruct addrinfo hints, *res; int sockfd; // сначала заполняем адресные структуры с помощью getaddrinfo(): memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; // AF_INET, AF_INET6, или AF_UNSPEC hints.ai_socktype = SOCK_STREAM; // SOCK_STREAM или SOCK_DGRAM getaddrinfo(«www.example.com», «3490», &hints, &res); // создаём сокет с помощью информации, которую наскребла getaddrinfo(): sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); 13. setsockopt(), getsockopt() Устанавливает для сокета различные опции. Прототип int getsockopt(int s, int level, int optname, void *optval, int setsockopt(int s, int level, int optname, const void *optval, Описание Эти функции получают и устанавливают определённые опции сокета. Параметры это s это сокет, level должен быть установлен в SOL_SOCKET. Затем, в optname установается имя которое связывает сокет с символическим именем устройства вроде eth0 вместо использования bind()для привязки к IP адресу. Позволяет другим сокетам связываться (bind()) с этим портом, несмотря на то, что уже существует активный сокет, слушающий этот порт. Это позволяет обойти сообщения “Address already in use”, когда вы пытаетесь перезапустить ваш сервер после обрушения. Позволяет UDP дейтаграммным (SOCK_DGRAM) сокетам посылать пакеты по широковещательным адресам и принимать и с них. Насчёт параметра optval, обычно это указатель на int, показывающую значение запроса. Последний параметр, optlen, заполняется getsockopt()если необходимо указать его для setsockopt(), возможно он будет sizeof(int). Возвращаемое значение Возвращает 0 при успехе или -1 в случае ошибки (errno устанавливается соответственно). Пример int optval; int optlen; // установить SO_REUSEADDR на сокете в ИСТИННО (1): optval = 1; setsockopt(s1, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof optval); // связать сокет с именем устройства (может не работать на некоторых системах): optval2 = «eth1»; // 4 байта длины, итого 4,ниже: setsockopt(s2, SOL_SOCKET, SO_BINDTODEVICE, optval2, 4); // посмотреть установлен ли флаг SO_BROADCAST: getsockopt(s3, SOL_SOCKET, SO_BROADCAST, &optval, &optlen); if (optval != 0) < print(«SO_BROADCAST enabled on s3!\n»); Send(), sendto() Посылают данные через сокет. Прототип ssize_t send(int s, const void *buf, size_t len, int flags); ssize_t sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen); Описание Эти функции посылают данные в сокет. В общем случае send()используется для TCP SOCK_STREAM п о д к л ю ч ё н н ы х с о к е т о в , а sendto()д л я U D P SOCK_DGRAM неподключённых дейтаграммных сокетов. Каждый раз посылая пакет по неподключённому сокету вы должны указывать место назначения, поэтому последние параметры sendto()задают куда пакет направляется. В обоих, send()и sendto(), параметр s это сокет, buf указатель на данные, которые необходимо послать, len число посылаемых байт и flags позволяет определить дополнительную информацию как посылать данные. Установите flags в ноль, если хотите иметь “нормальные” данные. Ниже приведены несколько наиболее часто используемых флагов: MSG_OOB Посылает “out of band” данные. TCP поддерживает этот способ Сообщить принимающей стороне, что у этих данных приоритет выше, чем у нормальных. Приёмник получит сигнал SIGURG и примет эти данные без предварительной выборки нормальных данных из очереди. MSG_DONTROUTE Не посылать эти данные через маршрутизатор, они местные. MSG_DONTWAIT Если send()должна блокироваться из-за загруженности внешнего трафика, она вернёт EAGAIN. Это вроде “Разрешить не блокирование для этой посылки” MSG_NOSIGNAL send()на удалённый хост, который больше не принимает (recv()) данные, обычно возбуждает сигнал SIGPIPE. Этот флаг предотвращает возбуждение такого сигнала. Возвращаемое значение Возвращает число действительно посланных байт или -1 при ошибке (errno устанавливается соответственно.) Заметьте, что это число может быть меньше затребованного. Вспомогательная функция в разделе по send()поможет обойти это. Также, если сокет был закрыт на противной стороне, процесс, вызвавший send(), получит сигнал SIGPIPE. (Если только send()не был вызван с флагом MSG_NOSIGNAL.) Пример int spatula_count = 3490; char *secret_message = «The Cheese is in The Toaster”; int stream_socket, dgram_socket; struct sockaddr_in dest; // сначала с потоковым сокетом TCP: // полагаем, что сокеты созданы и подключены // преобразовать в порядок байтов сети temp = htonl(spatula_count); // послать данные нормально: send(stream_socket, &temp, sizeof temp, 0); // послать секретное out of band сообщение: send(stream_socket, secret_message, strlen(secret_message)+1, MSG_OOB); // теперь с дейтаграммным сокетом UDP: //dest = . // полагаем, что «dest» содержит адрес назначения // послать секретное послание нормально: sendto(dgram_socket, secret_message, strlen(secret_message)+1, 0, Останавливает обмен по сокету. Прототип int shutdown(int s, int how); Описание close()) закрывает обе стороны, для чтения и для записи, а дескриптор освобождается. Если необходимо закрыть только одну или другую сторону, следует использовать shutdown(). Параметр s это сокет с которым вы работаете, а что с ним делать определяет параметр how. Это может быть SHUT_RD для предотвращения дальнейших recv(), SHUT_WR для запрещения дальнейших send(), или SHUT_RDWR для обоих. shutdown()не освобождает дескриптор сокета и в итоге прийдется вызвать close()чтобы закрыть его полностью. Этот системный вызов используется редко. Возвращаемое значение Возвращает 0 при успехе или -1 в случае ошибки (errno устанавливается соответственно). Пример nt s = socket(PF_INET, SOCK_STREAM, 0); // …посылаем и обрабатываем здесь… // и когда всё сделано запрещаем дальнейшие посылки: shutdown(s, 15. struct sockaddr Структуры для обработки интернет адресов. Прототип // Все указатели на адресные структуры сокетов часто приводятся // к этому типу перед их использованием в различных функциях и вызовах: unsigned short sa_family; // семейство адресов, AF_xxx char sa_data[14]; // 14 байт адреса протокола // IPv4 AF_INET сокеты: struct sockaddr_in < short sin_family; // например, AF_INET, AF_INET6 unsigned short sin_port; // например, htons(3490) struct in_addr sin_addr; // смотри struct in_addr, ниже char sin_zero[8] // обнулите, если хочется unsigned long s_addr; // заполнить с помощью inet_pton() // IPv6 AF_INET6 сокеты: struct sockaddr_in6 < u_int16_t sin6_family; // семейство адресов, AF_INET6 u_int16_t sin6_port; // номер порта, Порядок Байтов Сети u_int32_t sin6_flowinfo; // IPv6 flow information struct in6_addr sin6_addr; // IPv6 адрес u_int32_t sin6_scope_id; // Scope ID unsigned char s6_addr[16]; // заполнить с помощью inet_pton() // Общая структура хранения адреса сокета достаточно велика для хранения // данных struct sockaddr_in или struct sockaddr_in6: sa_family_t ss_family; // семейство адресов // всё это расширение зависит от реализации, проигнорируйте: Описание Это базовые структуры для всех системных вызовов и функций, работающих с интернет адресами. Для заполнения этих структур часто используется getaddinfo()а затем, по мере надобности читать их. В памяти struct sockaddr_in и struct sockaddr_in6 начинаются с одинаковой struct sockaddr, и можно приводить один тип к другому без какого- либо ущерба. Структура struct sockaddr_in используется с IPv4 адресами (вроде “192.0.2.10”). Она содержит семейство адресов (AF_INET), порт в sin_port и IPv4 адрес в sin_addr. Кроме того в struct sockaddr_in есть поле sin_zero , которое должно содержать нули. Это можно сделать с помощью функцией memset(). В struct in_addr чаще всего используется только поле s_addr, поскольку многие системы реализуют только его. struct sockadd_in6 очень похожа на struct in6_addr , но используется для IPv6. struct sockaddr_storage передаётся в accept()или recvfrom()когда необходимо написать код, не зависящий от версии IP, и неизвестно каким будет новый адрес — IPv4 или IPv6. Структура struct sockaddr_storage достаточно велика, чтобы содержать оба типа, в отличие от оригинальной маленькой struct sockaddr. |