Настройка сервера управления модемным соединением LineSrv и его
клиентов.
Счастливым обладателям выделенных линий и/или серверов с соединением по
требованию эта статья может показаться не нужной. Для других же вполне
полезной.
Итак, у меня есть локальная сеть с Windows- и Linux-рабочими станциями.
Также в сети есть Linux-сервер, на котором крутится squid, postfix,
samba, ldap, courier-imap, http. К нему подключен модем и настроен
маскарадинг, т. е. при установленом соедниении с Интернет, пользователи
могут общаться с внешним миром. Но есть одно "но" - "при установленном
соединении". Т. е. если пользователю надо полазить по WWW или
инициировать отправку почту с локального сервера, то ему нужно сначала
"поднять" модемное соединение. Можно, конечно, организовать поднятие
соединения по требованию, но по некоторым причинам это мне не подходит.
Раньше я уже описывал скрипты и настройку сервера для того, чтобы
пользователь мог соединяться и разъединяться с Интернетом. Но это
требует наличия telnet/ssh (в моем случае ssh) соединения между машиной
пользователя и сервером, пользователю необходимо запомнить две команды -
дозвониться (ppp-dial) и отключиться (ppp-off). Согласитесь, это слишком
сложно для какой-нибудь рядовой девочки-секретарши или тетки-бухгалтера
(ничего личного). Поэтому я задался мыслью найти готовое решение для
упрощенного управления модемным соединением. В идеале я искал
web-приблуду, с которой я бы общался через броузер, но никто ничего
полезного мне на этом поприще не посоветовал, разве что организовать это
с помощью webmin, но, ИМХО, это изврат. Тогда в дискуссионной рассылке
asplinux-support мне посоветовали программу masqdialer. Я зашел на
домашнюю страницу этой программы (http://w3.cpwright.com/mserver/), по
описанию это было то, что мне нужно, но она мне немного не понравилась.
Зато на той странице я нашел ссылки на другие подобные проекты, среди
которых и оказался понравившейся мне сервер управления соединения
LineSrv (http://linecontrol.sourceforge.net/).
Программа состоит из двух частей - серверной и клиентской части. Сервер,
понятно, запускается на Linux-машине, к которой подключен модем.
Клиентская же часть написана под Linux (консольная, QT и GTK версии),
Windows (9x/Me/2000/XP) и даже под Java. Управление может производится
не только над обычными, но и над ISDN-модемами. Ведется лог соединений -
пользователь, инициировавший соединение, время соединения, объем
полученной и отправленной информации. В комплекте идет парсер логов,
который можно использовать как CGI, для получения статистики через web.
Также есть возможность вести логи в MySQL (мне это ни к чему). База
пользователей, которым разрешена инициация подключения берется из
/etc/passwd, возможно ограничение по IP (простой acl). Вот в принципе и
все возможности, - другие будет видно в ходе настройки сервера.
На сайте проекта на текущий момент (15 июня 2004 г.) можно получить
следующие программы (разумеется, и их исходные коды):
linesrv - собственно, сам сервер, с парсером логов
lcc - консольный клиент под Linux
klcc - клиент для KDE (самый функциональный, но у меня GNOME :( )
xlc - GTK клиент для Linux
wlc - Windows клиент
jlc - Java-клиент, может работать как отдельной приложение и как
апплет, требует наличия Java Runtime Enviromen (JRE) на
клиентской машине, а для компиляции и саму Java SDK.
После того как исходники скопированы, их нужно скомпилировать:
$ cp linesrv-2.1.18.src.tar.bz2 /usr/src/
$ cd /usr/src
$ tar xvjf linesrv-2.1.18.src.tar.bz2
$ cd linesrv-2.1
Подробно о компиляции написано обычно в файлике INSTALL. В данной
программе он отсылает нас к ./server/INSTALL ;). Таким образом можно
выполнять все шаги описанные там.
$ cat ./server/INSTALL | less
Следующей командой можно узнать какие опции доступны для управления
компиляцией:
$ ./configure --help
Итак, чтобы отключить поддержку MySQL в конечной программе произведем
запуск конфигурационного скрипта c нужным параметром:
$ ./configure --disable-mysql
Затем, как написано в ./server/INSTALL выполняем только "make" без "make
install"
$ make
Обычно при сборке с помощью "make install" файлы программы автоматически
копируются в нужные каталоги системы, но в данном случае этого не
происходит (ни запуска "make install", ни автоматического копирования),
поэтому все будем делать ручками. Копируем основной исполняемый файл
программы:
$ cd server
$ cp lineserv /usr/sbin
После чего скопируем конфигурационный файл сервера и отредактируем его:
$ cp ./config/complete_syntax/linesrv.conf /etc/
$ mcedit /etc/linesrv.conf
begin /etc/linesrv.conf # config-file for LineControl Server 2.1.x
# Какой IP "слушает" сервер, для нескольких IP нужно задать 0.0.0.0
bind_to 192.168.2.254
# На каком порту
port 16007
# Если установить 'user_accounting' в 'yes', то иметь доступ будут
# клиенты поддерживающие только LCP3 (LineControl Protocol 3.x)
# Если linesrv скомпилирован без поддержки PAM или без шифрования, то
# необходимо указать 'no'
user_accounting yes
# Файл журналирования подключений
logfile /var/log/linesrv/dialsrv.log
# PID-файл
pidfile /var/run/linesrv.pid
# NAMED PIPE, с которой linesrv может работать для отображения
# статистики. Прочитать данные из PIPE можно с помощью CGI-программы
# htmlstatus, которая идет вместе с дистрибутивом. Внимание:
# htmlstatus должен быть запущен от того же пользователя, что и
# linesrv, чтоб иметь возможность послать SIGUSR1 linesrv'у
html_status /var/lib/linesrv/htmlstatus
# IP фильтрация - установка ip-адресов, с которых возможен доступ к серверу
# filter_type (allow|deny)
# Определяет разрешен или запрещен доступ по перечисленным адресам
# filter_mask <ip> <bit-mask>
# Задает подсеть (может быть несколько)
# filter_ip <from> <to>
# Задет диапазон адресов (может быть несколько)
filter_type allow
filter_mask 192.168.2.0 255.255.255.0
filter_mask 127.0.0.0 255.255.255.0
# Опции выключения. Позволяют произвести удаленное выключение (shutdown)
# всего сервера. Определяется скрипт, производящий shutdown.
#script_shutdown /var/lib/linesrv/halt-wrapper
# Списки доступа, с которых разрешено удаленное выключение, аналогично
# filter_*, только с учетом отсутствия filter_type, т.е. всегда "allow"
#limit_shutdown_mask 127.0.0.0 255.255.255.0
#limit_shutdown_ip 192.168.2.100 192.168.2.101
# Отключить оповещение по lpt (есть возможность при помощи простенькой
# схемы, подключенной к lpt, мониторить соединение)
lptstatus off
# Должен быть установлен в "yes" - реликт из предыдущих версий
send_throughput yes
# Скрипт для завершения соединения с провайдером
script_dn /usr/local/bin/ppp-off
# Скрипты для контроля за подключенными клиентами (для мониторинга и
# организации "продвинутого" маскарадинга
client_online /var/lib/linesrv/client_on
client_offline /var/lib/linesrv/client_off
# Конфигурация первого подключения
# Наименование подключения
line InTerNet
# Интерфейс, за которым следить
interface ppp0
# Тип подключения (netdev, isdn, file)
con_type netdev
# Сообщить серверу о возможности вашей линии
line_baud_up 57600
line_baud_down 57600
# Скрипт инициализации соединения с данным провайдером
script_up /usr/local/bin/ppp-dial
# Время ожидания между запуском скрипта инициализации соединения и
# появлением интерфейса
con_timeout 60
# Не блокировать линию. Т.е. завершение соединения произойдет когда
# все клиенты сделают offline
line_locking no
end /etc/linesrv.conf Теперь скопируем файлы необходимы для авторизации клиентов сервера и
выставим на них соответствующие права:
$ cp ./config/pam.d/lcshutdown /etc/pam.d/
$ cp ./config/pam.d/linecontrol /etc/pam.d/
$ chown root:root /etc/pam.d/lcshutdown /etc/pam.d/linecontrol
Сейчас, скопируем парсеры логов, позволяющих получать статистику. На
файл htmlstatus, автор программы рекомендует поставить suid-флаг, чтобы
он мог без трудностей получать данные из PIPE-файла.
$ cd ../lclog
$ cp lclog /usr/bin/
$ cd ../htmlstatus
$ cp htmlstatus /usr/bin/
$ chown root:root /usr/bin/htmlstatus
$ chmod 755 /usr/bin/htmlstatus
$ chmod u+s /usr/bin/htmlstatus
Создадим каталоги, необходимые для работы программы:
$ mkdir /var/log/linesrv
$ mkdir /var/lib/linesrv
Создадим PIPE-файл, в который linesrv будет складывать статус текущего
соединения, извлечь который можно будет с помощью htmlstatus
$ mknod /var/lib/linesrv/htmlstatus p
Также скопируем скрипты. Первый делает возможным удаленное отключение
компьютера (если это разрешено в конфигурационном файле). Второй ведет
учет, какие пользователи сейчас в online. На второй скрипт нужно создать
три символьные ссылки.
$ cp ../server/config/complete_syntax/halt-wrapper /var/lib/linesrv
$ cp ../server/config/complete_syntax/client_onoff /var/lib/linesrv
$ ln -s ./client_onoff /var/lib/linesrv/client_on
$ ln -s ./client_onoff /var/lib/linesrv/client_off
$ ln -s ./client_onoff /var/lib/linesrv/client_clear
Сейчас создаем скрипт, управляющий сервисом linesrv -
/etc/rc.d/init.d/linesrv
$ touch /etc/rc.d/init.d/linesrv
$ chown root:root /etc/rc.d/init.d/linesrv
$ chmod 755 /etc/rc.d/init.d/linesrv
$ mcedit /etc/rc.d/init.d/linesrv
begin /etc/rc.d/init.d/linesrv #!/bin/sh
#
# linesrv Script to start/stop linesrv.
#
# chkconfig: 2345 91 20
# description: linesrv is LineControl Server. It is designed
# to run on a Linux masquerading server which has for example
# a dial-up line to your ISP to control.
#
# processname: linesrv
# config: /etc/linesrv.conf
# pidfile: /var/run/linesrv.pid
PATH=/bin:/usr/bin:/sbin:/usr/sbin
PIDFILE=`grep "pidfile " /etc/linesrv.conf|awk '{ print $2; }'`
# Source function library.
if [ -f /etc/init.d/functions ] ; then
. /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ] ; then
. /etc/rc.d/init.d/functions
else
exit 0
fi
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
test -f /usr/sbin/linesrv || exit 0
function start() {
echo -n $"Starting LineControl Server"
daemon /usr/sbin/linesrv
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/linesrv
return $RETVAL
}
function stop() {
echo -n $"Stopping LineControl Server"
killproc linesrv
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f $PIDFILE /var/lock/subsys/linesrv
return $RETVAL
}
restart() {
stop
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart|reload)
restart
;;
status)
status linesrv
;;
*)
echo "Usage: /etc/init.d/linesrv {start|stop|status|restart|reload}"
exit 1
;;
esac
exit 0
end /etc/rc.d/init.d/linesrv Сконфигурируем систему так, чтобы сервис запускался на 2, 3, 4, 5
уровнях (5-ая строчка скрипта управления сервисом)
$ /sbin/chkconfig --add linesrv
Все, можно запустить сервис:
$ /sbin/service linesrv start
Если при запуске произошел сбой, то причину его можно увидеть и на
экране, и в файлике /var/log/messages. В нем же можно увидеть информацию
о внутренних переменных удачно запустившегося сервера.
$ tail -n 40 /var/log/messages | less
***********************************************************************
Подсказка. Сервер может не стартовать и выдавать сообщение об ошибке:
Could not bind tcp socket: bind(): 98
Init() failed. Unable to start.
Это значит, что порт 16007 занят либо еще не завершившимся процессом
linesrv, либо другим каким процессом. Какой процесс занимает порт можно
посмотреть с помощью команды
$ socklist | grep 16007
В последнем столбике будет имя процесса, занимающего порт. В пятом PID
этого процесса, который можно использовать в команде kill
***********************************************************************
Чтобы собирать статистику, создадим cgi-скрипты на web-сервере (показан
пример как можно прямо в командной строке создавать начинку для файлов).
$ cat > /var/www/cgi-bin/stat.sh
!/bin/sh
/usr/bin/lclog
Нажать Ctrl+D
$ cat > /var/www/cgi-bin/stat1.sh
!/bin/sh
/usr/bin/htmlstatus
Нажать Ctrl+D
Сменим права доступа на созданные файлы, так чтобы запускать и изменять
их мог пользователь apache, от имени которого работает http-сервер.
$ cd /var/www/cgi-bin
$ chown apache:apache *.sh
$ chmod 750 apache:apache *.sh
Добавим пользователя, которому необходимо предоставить возможность
дозвона. Зададим ему пароль.
$ /usr/sbin/adduser nikolay -c "Kropachev Nikolay" -d /tmp -s /sbin/nologin
$ passwd nikolay
Ну вот и все. Все, что касается сервера, мы сделали. Сейчас нужно
заняться клиентами.
На линуксовых машинах нужно выполнить следующую последовательность
действий (рассматривается пример для GTK-го клиента):
$ tar xvjf xlc-1.0.5.tar.bz2
$ cd xlc
$ ./configure --disable-mysql
$ cp ./src/xlс /usr/bin/
Запустить клиента, теперь можно с помощью команды.
$ xlc
На виндовых клиентах нужно распаковать архив wlc-2.0.6-static.zip в
каталог "C:\Program Files\wlc" (или куда вам удобно), затем добавить
ярлык от файла wlc2.exe в автозагрузку. И произвести минимальную
настройку на стороне клиента, запустив файл программы wlc2.exe: в пункте
"Client" -> "Configure" -> "Window" я оставил галочки "Save main window
position" и "Minimize main window on startup". В пункте "Client" ->
"Configure" -> "Lines" я убрал все галочки. В разделах касающихся
конфигурации сервера ("Server" -> "Configure") я указал ip адрес ("IP
address") сервера, порт ("Port"), на которм он сидит, имя пользователя
("Username") от имени, которого происходит соединение. Поле пароля
("Password") я оставил пустым. Отказался от сохранения пароля в
нешифрованом виде ("save plaintext"). И сказал, чтобы клиент
автоматически конектился к серверу при запуске ("Connect on startup").
Теперь если мне необходимо, чтобы сервер установил связь с Интернет, то
я нажимаю в окне программы клиента "Online". Сервер дозванивается. На
клиентской машине появляется маленькое окошко, в котором показывается
скорость текущего upload/download, количество полученной и отправленной
информации и пр. Если в этот момент, какой-нибудь пользователь тоже
нажмет "Online", то сервер будет знать, что в Интернете два
пользователя, и будет держать соединение до тех пор пока последний
пользователь не нажмет "Offline", т.е. сервер завершит соединение только
тогда, когда в online остался один пользователь и он нажал "Offline".
Дерзайте.
--
C уважением, Kolotov Alexandr aka mr. Эбола
отвечать: akmypo***@m*****.ru
ICQ: 100349254
| Registered Linux user # 236664 |
-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.linux.kirovlug-list@subscribe.ru
Отписать : mailto:comp.soft.linux.kirovlug--unsub@subscribe.ru
http://subscribe.ru/ mailto:ask@subscribe.ru