LAN Информационный сервер — LISa

Автор: Alexander Neundorf, перевод: Лашманов А, 2003 г.
Источник: http://lisa-home.sourceforge.net.

1. Общее
2. Как LISa работает
3. Установка LISa и resLISa
4. Конфигурация
5. Опции командной строки и сигналы


LAN Информационный сервер — LISa

LISa -- маленький "демон" (daemon), предназначеный для работы на пользовательских системах. Он обеспечивает нечто вроде "сетевого окружения", полагаясь при этом лишь на стек протокола TCP/IP, не используя smb (SAMBA) или чего-то подобного. Информация о хостах в вашем "сетевом окружении" обеспечивается через TCP порт 7741.

LISa поддерживает два различных метода поиска хостов, первый метод состоит в том, чтобы посылать пакеты эхо-запроса ICMP другим хостам, второй метод -- в посылке NetBIOS-широковещательных (broadcast) запросов, используя команду "nmblookup". Чтобы при этом не слишком загружать сеть, применяются специальные стратегии. Также имеется базовый механизм безопасности. Для локальных сетей с очень строгими правилами безопасности есть ограниченная версия демона, resLISa. LISa должен собираться и работать под обычными unix (linux, *bsd, solaris...), на 64-битовых машинах могут быть проблемы, с IPV6 -- не работает. LISa обеспечивает некоторую специальную поддержку для KDE, но полностью независимо, не требуя ни Qt библиотек, ни любых других услуг от KDE. LISa и resLISa предоставляются согласно GNU General Public License.

Будьте довольны, Александр Нойндорф (Alexander Neundorf)
([email protected])


Как LISa работает

В файле конфигурации LISa вы указываете диапазон IP-адресов, которые LISa должен проверить -- работают ли они. В наиболее простом случае это может быть адрес/маска_подсети (address/subnetmask), тогда LISa проверит каждый возможный хост вашей сети, если он функционирует. Хосты проверяются, используя ICMP эхо-запросы. Чтобы иметь возможность посылать и получать эхо-запросы ICMP и ответы на них, программа должна открыть так называемый "raw socket". Для этого нужны привилегии root. Этот socket открывается сразу после того, как запущена
программа, и после успешного открытия socket-а уровень привилегий немедленно понижается. (см. main.cpp и strictmain.cpp). Если вы сконфигурировали LISa таким образом, то задействуется команда nmblookup, в виде ("nmblookup " * ""); и результаты затем анализируются.

Чтобы ICMP и широковещательные (broadcast) запросы не слишком нагружали сеть, если есть больше чем один такой сервер, работающие в одной сети, серверы кооперируются (сотрудничают) друг с другом. Прежде, чем они начинают pinging (или nmblookup), они посылают широковещательный (broadcast) запрос на чужие порты 7741. Если кто - то отвечает на этот широковещательный (broadcast) запрос, серверы сформируют полный список работающих хостов через TCP порт 7741 от этого хоста и не будут начинать ping (или nmblookup). Если никто не отвечает, то хост, посылавший широковещательный (broadcast) запрос, начнет pinging хостов (или nmblookup) и одновременно откроет socket для прослушивания упомянутых широковещательных (broadcast) запросов. Если же хост получил ответ на его широковещательный (broadcast) запрос, то он не будет открывать socket для прослушивания широковещательных (broadcast) запросов. Так образом, лишь один из серверов будет иметь этот socket открытым, и только он будет фактически пинговать (ping) или зондировать посредством "nmblookup" все хосты. Другими словами, серверы "ленивы", они работают по принципу "я буду что-то делать, только если кто-то другой не сделает это для меня ".

Есть другая особенность, которая уменьшает загрузку сети. Скажем, вы сконфигурировали LISa так, чтобы периодически обновлять все через 10 минут. Затем, предположим, вы не обращаетесь к вашему серверу некоторое время. Если никто не обратился к серверу в течение последнего "периода обновления", то сервер обновляет данные (либо самостоятельно, либо от того сервера, который фактически зондирует сеть), и затем удваивает свой "период обновления", то есть следующее обновление произойдет уже через 20 минут. Это случится 4 раза, и если
никто не обратится к серверу с заданным "периодом обновления" (10 минут в нашем примере) в течение долгого времени, то его период обновления возрастет до 160 минут, почти до трех часов. Если затем кто-то запросит данные от сервера, то получит старый список (160-минутной давности). Но это обращение к серверу снова
установит его "период обновления" в первоначальное значение, то есть 10 минут, и немедленно инициирует обновление, если последнее было раньше чем эти 10 минут назад. Это означает, что получив очень старый список, вы можете повторить запрос несколькими секундами позже, и вы должны получить свежие данные. Это дает немедленный эффект для сервера, который не делает ping (или nmblookup) сам, обычно используемого одним пользователем, и это дает меньший эффект для сервера, который фактически выполняет pinging (или nmblookup), так как к этому серверу обычно постоянно обращаются все другие серверы в сети. Такой метод дает возможность многим хостам в сети запускать этот сервис, оставляя при этом загрузку сети достаточно низкой. Для пользователя необязательно знать, есть ли серверы (сервер имен или файл-сервер или прочие) в сети, на которых также работает LISa. Пользователь может всегда управлять LISa в местном масштабе, и LISa самостоятельно обнаружит другие серверы незаметно для пользователя. Вы можете принудить ваш сервер LISa вести самостоятельное зондирование сети, посредством broadcast-вещания и ping, используя нестандартный номер порта, задаваемый в командной строке опцией -port или -p. Это не рекомендуется!

Если вы посылаете SIGHUP процессу lisa, это вызывает перечитывание его файла конфигурации (configfile). Если вы пошлете SIGUSR1, то на "стандартный вывод" (stdout) будет выдана некоторая информация о статусе lisa. Доступ к информации -- клиенты.

Клиент для LISa, в первую очередь -- ioslave для KDE2 , пользователь может ввести lan://localhost/ или lan:/, что и вызовет контакт с LISa на местной (локальной) системе. Если есть машина, которая работает непрерывно, и пользователь знает, что на той машине также работает LISa, он может использовать своего клиента LISa непосредственно с тем сервером (подобно вышеупомянутому ioslave lan://имя сервера/). Данные, предоставляемые через socket, имеют простой формат (синтаксис языка "C"):

" Десятичный_побайтовый_IP-адрес_в_сети ", и последняя (завершающая) строка:
"0 succeeded<' '> ".

Например:

"
17302538 some_host.whatever.de
18285834 linux.whatever.de
17827082 nameserver.whatever.de
0 succeeded
" 

Этим легко можно пользоваться.

Если в вашей сети очень строгие порядки в отношении безопасности, то некоторые люди могут воспринять pinging как потенциальную атаку. (К автору перевода однажды обратились обеспокоенные пользователи, на дисплеях которых регулярно всплывала надпись: "Внимание! Попытка несанкционированного доступа!" :-) Если вы будете испытывать неудобство из-за этого, попробуйте усеченную версию, resLISa.

ResLISa

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

С resLISa вы не сможете "пинговать" (ping) всю сеть и адресовать диапазоны, вы сможете только задавать resLISa до 64 (в настоящее время) хостов, прописывая их имена в config-файле. Они и будут "пинговаться" (ping). Вы также можете использовать nmblookup. resLISa обеспечит информацию только по unix-домен-socket, то есть не по всей сети. Название "сокета" (socket) -- "/tmp/resLisa-YourLoginname", и таким образом resLISa может безопасно работать с большим количеством пользователей на одной машине. Неопасно установить reslisa идентификатор setuid = root. Привилегии root будут понижены сразу после запуска (см. strictmain.cpp), они только необходимы, чтобы создать raw socket для посылки зхо-запросов ICMP.

Широковещательные (broadcast) запросы не будет посылаться и приниматься. Первоочередной клиент resLISa -- также ioslave для KDE2 (набрать адрес: rlan:/имя, например: rlan:/konqy).


Установка LISa и resLISa

Оба, reslisa и lisa, открывают так называемый raw socket, чтобы посылать и получать эхо-запросы ICMP (ping). Чтобы иметь возможность сделать это, требуются привилегиии root.

LISa предлагает сервис на TCP порту 7741 и должна быть установлена root и стартовать при запуске системы. Как именно это делается -- зависит от вашего дистрибутива.

На Slackware linux просто добавьте следующие строки в/etc/rc.d/rc.local:

if [ -x /usr/local/bin/lisa ]; then
echo "Starting LISa daemon..."
/usr/local/bin/lisa
fi

Разумеется, вы должны прописать правильный путь к LISa - демону на вашей конкретной системе, например /opt/kde2/bin/lisa .

Если вы имеете Suse Linux 7.3, установите пакет kdenetwork-lisa. Затем редактируйте файл шаблона (template) и файл конфигурации /etc/lisarc, вписав туда сответствующие значения. Тогда LISa будет стартовать автоматически при каждом запуске всей системы.
Если у вас работает Suse Linux 7.1, то вам нужен rclisa.tar.gz.
Если вы имеете другую версию Suse Linux, поместите стоки примера, данного выше, в /etc/init.d/boot.local.

Reslisa предназначен, чтобы запускаться пользователем, но этого недостаточно для работы в сети. Должен быть установлен setuid = root. Если вы используете rlan-ioslave в KDE2, reslisa может стартовать автоматически как reslisa ioslave (rlan:/). Lisa читает файл lisarc (/etc/lisarc), reslisa читает файл reslisarc (/etc/reslisarc или ~/.reslisarc). Если вы хотите конфигурировать lisa и reslisa из Центра Управления KDE (KDE Control Center), вы должны запускать их, используя опцию командной строки -K или -kde2. Дополнительную информацию о том, где они ищут файлы конфигурации, смотри ниже.


Конфигурация

Пример config-файла со всеми возможными опциями:

PingAddresses = 192.168.100.0/255.255.255.0;192.168.100.10-192.168.199.19;192.168.200.1;192-192.168-168.100-199.0-9;
PingNames = bb_mail;
AllowedAddresses = 192.168.0.0/255.255.0.0
BroadcastNetwork = 192.168.100.0/255.255.255.0
SearchUsingNmblookup = 1                #использовать nmblookup
FirstWait = 30                          #30 сотых долей секунды
SecondWait = -1                         #лишь единожды
#SecondWait = 60                         #зондировать дважды, со вторичной задержкой 0.6 секунды
UpdatePeriod = 300                      #обновлять через 300 секунд
DeliverUnnamedHosts = 0                 #не показывать безымянные хосты
MaxPingsAtOnce = 256                    #посылать 256 ICMP эхо-запросов за раз

(Другие более простые примеры файла найдете ниже.)

PingAddresses

Это -- вероятно, наиболее важная строка. Здесь вы указываете адреса, которые будут "пинговаться" (pinged). Вы можете определить несколько диапазонов, разделяя их точками с запятой (;).

Есть четыре возможных способа определить адреса:

- сетевой адрес/маска_подсети: 192.168.100.0/255.255.255.0

IP адрес и назначенная маска подсети. Это не обязательно должно включать в себя реальный сетевой адрес и сетевую маску (netmask) вашей машины. Например, если вы имеете 10.0.0.0/255.0.0.0, вы могли бы указать 10.1.2.0/255.255.255.0, если вы заинтересованы только этими адресами. Комбинация IP-адрес/маска_подсети должна быть разделена слэшем "/", и адрес не обязан существовать в сети, это может также быть адрес хоста желательной сети, то есть 10.12.34.67/255.0.0.0 то же самое, что и 10.0.0.0/255.0.0.0 .

- диапазон последовательных IP-адресов: 192.168.100.10-192.168.199.19

IP-адрес, где "пингование" (pinging) начнется и IP-адрес, где "пингование" (pinging) закончится. Оба адреса должны быть разделены "-". В данном примере это произвело бы 199-100+1=100, 100*256=25.600, 25.600 + (19-10+1) =25.590 адресов.

- IP-адрес вообще нередко представляется четырьмя десятичными числами, вы можете определить диапазоны для всех четырех чисел:

192-192.169-171.100-199.0-9

В этом примере все адреса IP с первым числом 192, вторым от 168 до 171, третье число от 100 до 199 и последнее число от 0 до 9 будут "пинговаться" (pinged). Это дало бы 1*3*100*10=3000 адресов. Это полезно, вероятно, лишь в очень редких случаях. Вы должны указать диапазоны для КАЖДОГО из четырех чисел, всегда разделяемые "-".

- одиночные IP-адреса: 192.168.200.1
единственный IP-адрес или имя хоста.

Можно оставить этот вход пустым.

PingNames

Здесь вы можете дополнительно перечислить хосты для "пинга" (ping), используя их названия (имена). Имена должны быть разделены точками с запятой. Можно оставить и этот вход пустым.

AllowedAddresses

Это также очень важно. LISa будет "пинговать" (ping) только адреса, обслуживать клиентов и принимать ответы на широковещательные (broadcast) запросы от адресов, лишь подходящих к указанным в этой строке. Вы можете составлять в целом до 32 (сетевой_адрес/маска_подсети) или отдельных адресов. Разделяйте их точкой с запятой (;) и не оставляйте пробелы между адресами!

Пример: 192.168.0.0/255.255.0.0;192.169.0.0

- И полная сеть и дополнительный адрес имеют силу.

Всегда делайте это настолько строго, насколько возможно. Обычно ваш "сетевой_адрес/маска_подсети" является наилучшим выбором.

BroadcastNetwork

Эта строка может содержать лишь "сетевой_адрес/маска_подсети", и только один. В эту сеть будет посылаться широковещательные (broadcast) запросы. Обычно это должны быть ваши собственные "сетевой адрес/маска сети".

Пример: 192.168.0.0/255.255.0.0

SearchUsingNmblookup

Здесь вы можете задавать 0 или 1, по умолчанию подразумевается 0.

"1" означает, что LISa выполнит nmblookup "*" и использует результат этой команды. Это меньше нагружает сеть, чем "пингование" (pinging), но вы получите информацию лишь о хостах, которые могут взаимодействовать с smb-службой (windows-машины или машины с работающей SAMBA). Nmblookup пошлет широковещательный (broadcast) запрос NetBIOS, и машины, взаимодействующие с smb, ответят. Другие сети будут недоступны. Если вы выбираете этот режим и вдобавок указываете IP-адрес для "пинга" (ping), тогда сначала будет выполнен nmblookup и затем уже начнется "пингование". При этом будут пинговаться лишь адреса, не обнаруженные nmblookup. Это должно слегка уменьшить нагрузку сети.

FirstWait

Если LISa "пингует", то есть посылает эхо-запросы ICMP, то отправляются заданного размера "пачки" запросов (по части адресов из общего, возможно, очень длинного списка), затем делается пауза в несколько сотых секунды, которую вы определяете здесь. Обычно значения от 5 до 50 должны быть хороши, максимум -- 99 (дает 0.99 секунд, очень долгое время). Делайте это значение как можно меньше для уверенного обнаружения всех работающих хостов. По умолчанию 5.

SecondWait

После того, как LISa послал эхо-запрос первый раз, может оказаться, что не все хосты успели откликнуться. Для уточнения результатов LISa может выдать ping второй раз. На сей раз "пингуются" только хосты, от которых не приходили ответы. Если вы имеете хорошие результаты уже при первом "пинге" (ping), вы можете отключить вторичный пинг, установив SecondWait -1. В противном случае хорошо бы делать это значение немного большим, чем значение для FirstWait, поскольку хосты, которые не были найдены при первой попытке, вероятно, медленны или слишком далеки, так что они могли бы нуждаться в некоторых дополнительных миллисекундах, чтобы успеть ответить. Обычно значения от 5 до 50 должны быть хороши, или -1, чтобы выключить вторичное зондирование. Максимум -- 99 (дает 0.99 секунд, очень долгое время). По умолчанию 15.

UpdatePeriod

Это -- интервал в секундах, после которого LISa обновит свой список работающих хостов (то есть ping или nmblookup или получит список хостов от сервера LISa, который фактически делает pinging). Имеющие силу значения -- между 30 секундами и 1800 секундами (тридцатью минутами). Если вы имеете большую сеть, не делайте интервал малым (чтобы не перегружать сеть). Значения от 300 до 900 секунд (от 5 до 15 минут) обычно приемлемы. Имейте в виду, что период обновления автоматически удваивается, если никто не обратился к серверу LISa, до 4 раз, пока интервал не достигнет 16-кратного размера от заданного здесь, и будет возвращаться к заданному значению, если кто-то наконец обратится к серверу. По умолчанию 300.

DeliverUnnamedHosts

Если ответ на эхо-запрос от IP-адреса был получен, но LISa не смог определить имя хоста, вы увидите этот хост, если только это значение установлено в "1". Автор не уверен, является ли это полезной особенностью, но, возможно, есть некоторые устройства в вашей сети без назначенных имен, и они не должны показываться. Установите "0", если вы хотите держать их в тайне ;-) Если сомневаетесь, лучше установите "0". Это -- также значение по умолчанию.

MaxPingsAtOnce

При посылке эхо-запросов (ping), LISa посылает сразу "пачку" их и затем ждет ответы. По умолчанию 256 "пингов" (ping) посылается сразу, обычно вы не должны изменять это значение. Если вы делаете его намного большим, внутренний буфер для приема ответов на эхо-запросы может переполняться, а если вы делаете его малым,
обновление замедлится.

Четыре различных примера config-файла:

1.) Вы -- член маленькой сети с 24-битовой маской подсети, то есть до 256 хостов:

PingAddresses = 192.168.100.0/255.255.255.0
AllowedAddresses = 192.168.100.0/255.255.255.0
BroadcastNetwork = 192.168.100.0/255.255.255.0
FirstWait = 20                                   #20 сотых долей секунды
SecondWait = 30                                  #30 сотых долей секунды
UpdatePeriod = 300                               #обновлять через 300 секунд

2.) Вы заинтересованы только хостами, работающими с smb-сервисами, и вы
не имеете маршрутизаторов (routers) в вашей сети:

AllowedAddresses = 192.168.100.0/255.255.255.0
BroadcastNetwork = 192.168.100.0/255.255.255.0
SearchUsingNmblookup = 1                #использовать nmblookup
UpdatePeriod = 300                      #обновлять через 300 секунд

3.) Та же самая сеть (2), но здесь оба -- nmblookup и pinging -- используются.
Дополнительно проверяется хост "bb_mail".

PingAddresses = 192.168.100.0/255.255.255.0
PingNames = bb_mail
AllowedAddresses = 192.168.0.0/255.255.0.0
BroadcastNetwork = 192.168.100.0/255.255.255.0
SearchUsingNmblookup = 1                #использовать nmblookup
FirstWait = 30                          #30 сотых долей секунды
SecondWait = -1                         #лишь единожды
UpdatePeriod = 300                      #обновлять через 300 секунд
MaxPingsAtOnce = 256                    #посылать 256 ICMP эхо-запросов за раз

4.) И вот файл конфигурации для resLISa, ни PingAddresses, ни BroadcastNetwork
не используется resLISa.

PingNames = bb_mail;some_host;some_other_host
AllowedAddresses = 192.168.0.0/255.255.0.0
SearchUsingNmblookup = 1                #использовать nmblookup
FirstWait = 30                          #30 сотых долей секунды
SecondWait = -1                         #лишь единожды
UpdatePeriod = 300                      #обновлять через 300 секунд
DeliverUnnamedHosts = 1                 #показывать и безымянные хосты
MaxPingsAtOnce = 256                    #посылать 256 ICMP эхо-запросов за раз 

Опции командной строки и сигналы:

(Command Line Options and Signals)

Опции командной строки:

-v, --version
Печатает краткую информацию о версии программы.

-h, --help
Дает краткий обзор опций.

-p, --port PORTNR
Стартовать сервис на порту с указываемым номером вместо стандартного 7741. Если вы используете это, LISa не сможет сотрудничать с другим сервером LISa в сети. Эта опция для LISa, но не для resLISa. Некоторые опции уточняют поиск файлов конфигурации. (Для resLISa файл называется reslisarc, для LISa -- lisarc).

-u, --unix
Поиск сначала $HOME/.lisarc, затем /etc/lisarc, это же -- по умолчанию.

-k, --kde1
Искать сначала $HOME/.kde/share/config/lisarc, затем $KDEDIR/share/config/lisarc .

-K, --kde2
Ищет файл lisarc по каждому пути, выданному по команде "kde-config --path config" .

-c, --config=/SOME/PATH/FILE
Читать лишь этот и никакой другой файл конфигурации.

Сигналы
Если вы пошлете Hangup-сигнал lisa или reslisa, они заново перечитают свой файлы конфигурации (killall -HUP lisa или -- на "Solaris" -- pkill -HUP lisa ). Если вы посылаете User1-сигнал lisa или reslisa, то будет выведена некоторая
информация о статусе на "стандартный вывод". (killall -USR1 lisa). Вы не будете ничего видеть, если терминал, c которого lisa/reslisa были запущены, закрыт.