Использование Cisco VPN Client на Linux

Стоит у меня несколько Cisco и прокинуты по ним туннели GRE между организациями, объединенные в свою сегментную сеть. Когда работал на форточках, проблем с подключением к сети не было. VPN клиент для Cisco под форточки работает прекрасно, но в связи с полным отказом от Windows возник вопрос запуска сие чуда на Debian. Как оказалось, стандартные средства организации vpn, входящие в состав репозитария системы, не обеспечивают решения данной задачи. Вот такую задачу мы и будем сегодня решать.

Поиски решения данной задачи в Гугле не привели к конкретному решению, поэтому все пришлось ставить путем проб и ошибок. Загруженные клиенты не хотели собираться в Debian. Спросите, почему нельзя получить клиента у поставщика, ответ: клиент может быть загружен только после регистрации и получения определенного статуса, вот так. Не у каждого есть возможность получить соответствующие права для загрузки. Поэтому принято решение получить все необходимое ПО из свободных источников. Предыстория понятна, пора начать все реализовывать. Все действия будем производить в консоли.

user$ su
root# cd /usr/src
root# wget http://projects.tuxx-home.at/ciscovpn/clients/linux/4.8.02/vpnclient-linux-x86_64-4.8.02.0030-k9.tar.gz
--2009-06-09 04:06:33--  http://projects.tuxx-home.at/ciscovpn/clients/linux/4.8.02/vpnclient-linux-x86_64-4.8.02.0030-k9.tar.gz
Распознаётся projects.tuxx-home.at... 88.198.57.56
Устанавливается соединение с projects.tuxx-home.at|88.198.57.56|:80... соединение установлено.
Запрос HTTP послан, ожидается ответ... 200 OK
Длина: 2050813 (2,0M) [application/x-gzip]
Сохраняется в каталог: `vpnclient-linux-x86_64-4.8.02.0030-k9.tar.gz'.
36% [=============>                         ] 746 577     21,9K/s  ОВП 56s

Клиент загружен (эта копия того, который предлагает Cisco у себя на сайте), теперь распакуем и запустим установку. Стоит заметить, что перед запуском установки стоит проверить, есть у вас исходные коды ядра системы. Если нет, то их необходимо установить. Проверить это можно следующим способом.

root# ls /usr/src
vpnclient-linux-x86_64-4.8.02.0030-k9.tar.gz

Как видите, здесь лежит только загруженный нами ранее vpn клиент Cisco. Необходимо установить исходники ядра, но перед установкой рекомендую обновить пакеты, дабы не наставить дырявого и устаревшего ПО.

root# aptitude update
root# aptitude upgrade

Систему обновили, теперь посмотрим, что у нас есть по ядрам в пакетах.

root#aptitude search linux-image
v   linux-image                                        -                                                             
v   linux-image-2.6                                    -                                                             
p   linux-image-2.6-486                                - Linux 2.6 image on x86                                      
i   linux-image-2.6-686                                - Linux 2.6 image on PPro/Celeron/PII/PIII/P4                 
p   linux-image-2.6-amd64                              - Linux 2.6 image on AMD64                                    
p   linux-image-2.6-k7                                 - Linux 2.6 image on AMD K7 - transition package              
p   linux-image-2.6.26-1-486                           - Linux 2.6.26 image on x86                                   
i A linux-image-2.6.26-1-686                           - Linux 2.6.26 image on PPro/Celeron/PII/PIII/P4              
p   linux-image-2.6.26-1-686-bigmem                    - Linux 2.6.26 image on PPro/Celeron/PII/PIII/P4              
p   linux-image-2.6.26-1-amd64                         - Linux 2.6.26 image on AMD64                                 
p   linux-image-2.6.26-1-openvz-686                    - Linux 2.6.26 image on PPro/Celeron/PII/PIII/P4, OpenVZ suppor
p   linux-image-2.6.26-1-vserver-686                   - Linux 2.6.26 image on PPro/Celeron/PII/PIII/P4, Linux-VServer
p   linux-image-2.6.26-1-vserver-686-bigmem            - Linux 2.6.26 image on PPro/Celeron/PII/PIII/P4, Linux-VServer
p   linux-image-2.6.26-1-xen-686                       - Linux 2.6.26 image on i686, oldstyle Xen support            
p   linux-image-2.6.26-2-486                           - Linux 2.6.26 image on x86                                   
p   linux-image-2.6.26-2-686                           - Linux 2.6.26 image on PPro/Celeron/PII/PIII/P4
p   linux-image-2.6.26-2-686-bigmem                    - Linux 2.6.26 image on PPro/Celeron/PII/PIII/P4              
p   linux-image-2.6.26-2-amd64                         - Linux 2.6.26 image on AMD64                                 
p   linux-image-2.6.26-2-openvz-686                    - Linux 2.6.26 image on PPro/Celeron/PII/PIII/P4, OpenVZ suppor
p   linux-image-2.6.26-2-vserver-686                   - Linux 2.6.26 image on PPro/Celeron/PII/PIII/P4, Linux-VServer
p   linux-image-2.6.26-2-vserver-686-bigmem            - Linux 2.6.26 image on PPro/Celeron/PII/PIII/P4, Linux-VServer
p   linux-image-2.6.26-2-xen-686                       - Linux 2.6.26 image on i686, oldstyle Xen support            
p   linux-image-686                                    - Linux image on PPro/Celeron/PII/PIII/P4

Имеется новое ядро. Вот его и поставим. Напомню, что мы работаем со стабильной веткой Debian, если вы ставите эксперименты на боевой машине (сервере), подумайте хорошо —  сделайте копию. Ставим новое ядро и исходники к нему. Необходимые дополнительные библиотеки aptitude подхватит и установит сам. На всякий случай проверьте установлена ли утилита сборки проектов make. У меня ее почему-то не оказалось.

root# aptitude install linux-image-2.6.26-2-686 linux-headers-2.6.26-2-686 make

Проверяем содержимое …

root# ls -l /usr/src
итого 2020
drwxr-xr-x  4 root root    4096 Июн  9 06:30 linux-headers-2.6.26-2-686
drwxr-xr-x 18 root root    4096 Июн  9 06:30 linux-headers-2.6.26-2-common
drwxr-xr-x  3 root root    4096 Июн  9 06:30 linux-kbuild-2.6.26
-rw-r--r--  1 root src  2050813 Май 20 19:16 vpnclient-linux-x86_64-4.8.02.0030-k9.tar.gz

Новое ядро установлено, исходные коды ядра тоже на месте, осталось только сделать рестарт системы и можно приступать к настройке и установке vpn клиента для Cisco.

root# reboot

Рестарт системы сделан. У нас имеется архив с клиентом, надо его распаковать и запустить сборку. Приступаем.

user$ su
root# cd usr/src
root# tar xzvf vpnclient-linux-x86_64-4.8.02.0030-k9.tar.gz
root# cd vpnclient

Далее идут вопросы установщика и сборщика, отвечаем утвердительно.

root# ./vpn_install
Cisco Systems VPN Client Version 4.8.02 (0030) Linux Installer
Copyright (C) 1998-2006 Cisco Systems, Inc. All Rights Reserved.
By installing this product you agree that you have read the
license.txt file (The VPN Client license) and will comply with
its terms.
Directory where binaries will be installed [/usr/local/bin]
Automatically start the VPN service at boot time [yes]
In order to build the VPN kernel module, you must have the
kernel headers for the version of the kernel you are running.
Directory containing linux kernel source code [/lib/modules/2.6.26-2-686/build]
* Binaries will be installed in "/usr/local/bin".
* Modules will be installed in "/lib/modules/2.6.26-2-686/CiscoVPN".
* The VPN service will be started AUTOMATICALLY at boot time.
* Kernel source from "/lib/modules/2.6.26-2-686/build" will be used to build the module.
Is the above correct [y]
Making module
make -C /lib/modules/2.6.26-2-686/build SUBDIRS=/usr/src/vpnclient modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.26-2-686'
  CC [M]  /usr/src/vpnclient/linuxcniapi.o
  CC [M]  /usr/src/vpnclient/frag.o
  CC [M]  /usr/src/vpnclient/IPSecDrvOS_linux.o
  CC [M]  /usr/src/vpnclient/interceptor.o
  CC [M]  /usr/src/vpnclient/linuxkernelapi.o
  LD [M]  /usr/src/vpnclient/cisco_ipsec.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /usr/src/vpnclient/cisco_ipsec.mod.o
  LD [M]  /usr/src/vpnclient/cisco_ipsec.ko
make[1]: Leaving directory `/usr/src/linux-headers-2.6.26-2-686'
Create module directory "/lib/modules/2.6.26-2-686/CiscoVPN".
Copying module to directory "/lib/modules/2.6.26-2-686/CiscoVPN".
Already have group 'bin'
Creating start/stop script "/etc/init.d/vpnclient_init".
    /etc/init.d/vpnclient_init
Enabling start/stop script for run level 3,4 and 5.
Creating global config /etc/opt/cisco-vpnclient
Installing license.txt (VPN Client license) in "/opt/cisco-vpnclient/":
    /opt/cisco-vpnclient/license.txt
Installing bundled user profiles in "/etc/opt/cisco-vpnclient/Profiles/":
* New Profiles     : sample
Copying binaries to directory "/opt/cisco-vpnclient/bin".
Adding symlinks to "/usr/local/bin".
    /opt/cisco-vpnclient/bin/vpnclient
    /opt/cisco-vpnclient/bin/cisco_cert_mgr
    /opt/cisco-vpnclient/bin/ipseclog
Copying setuid binaries to directory "/opt/cisco-vpnclient/bin".
    /opt/cisco-vpnclient/bin/cvpnd
Copying libraries to directory "/opt/cisco-vpnclient/lib".
    /opt/cisco-vpnclient/lib/libvpnapi.so
Copying header files to directory "/opt/cisco-vpnclient/include".
    /opt/cisco-vpnclient/include/vpnapi.h
Setting permissions.
    /opt/cisco-vpnclient/bin/cvpnd (setuid root)
    /opt/cisco-vpnclient (group bin readable)
    /etc/opt/cisco-vpnclient (group bin readable)
    /etc/opt/cisco-vpnclient/Profiles (group bin readable)
    /etc/opt/cisco-vpnclient/Certificates (group bin readable)
* You may wish to change these permissions to restrict access to root.
* You must run "/etc/init.d/vpnclient_init start" before using the client.
* This script will be run AUTOMATICALLY every time you reboot your computer.

Клиент собрался и установлена поддержка в ядро необходимых протоколов для работы VPN клиента Cisco. Далее необходимо создать конфигурацию и инициализировать клиента. Инициализация требуется один раз, если вы после этого перезапустите систему, то клиент инициализируется сам и при последующих запусках тоже. Если этого не происходит (как в моем случае), то можно произвести инициализацию вручную. Пока не стал разбираться, почему автомат не работает.

root# /etc/init.d/vpnclient_init start

Теперь готовим файл конфигурации:

root# cd /etc/CiscoSystemsVPNClient/Profiles
root# cp sample.pcf имя_нового_профиля.pcf

Если по каким-либо причинам профиль примера не создался, то вот его примерное содержимое:

root# cat sample.pcf
[main]
Description=sample user profile
Host=10.212.20.52
AuthType=1
GroupName=monkeys
EnableISPConnect=0
ISPConnectType=0
ISPConnect=
ISPCommand=
Username=chimchim
SaveUserPassword=0
EnableBackup=0
BackupServer=
EnableNat=1
CertStore=0
CertName=
CertPath=
CertSubjectName=
CertSerialHash=00000000000000000000000000000000
DHGroup=2
ForceKeepAlives=0

Собствено редактирование профиля сводится к некоторым изменениям (чтоб их не вводить вручном режиме постоянно). Ниже выдержка, что необходимо поправить:

root# pwd
/etc/CiscoSystemsVPNClient/Profiles
root# mcedit имя_нового_профиля.pcf

строки для правки:

Description=Краткое описание вашего профиля

Host=IP_адрес_вашей_Cisco

GroupName=Имя_вашей_группы_в_домене

Username=Ваше_имя_в_домене_NT

NTDomain=Имя_вашего_домена

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

root# # vpnclient connect имя_вашего_профиля
Cisco Systems VPN Client Version 4.8.01 (0640)
Copyright (C) 1998-2007 Cisco Systems, Inc. All Rights Reserved.
Client Type(s): Linux
Running on: Linux 2.6.26-2-686 #1 SMP Thu May 28 15:39:35 UTC 2009 i686
Config file directory: /etc/opt/cisco-vpnclient
Initializing the VPN connection.
Contacting the gateway at <span style="color: red; font-weight: bold;">IP_адрес_вашей_Cisco</span>
User Authentication for <span style="color: red; font-weight: bold;">имя_вашего_профиля</span>...
The server has requested the following information to complete the user authentication:
Username [<span style="color: red; font-weight: bold;">Ваше_имя_в_домене_NT</span>]:
Password []:
Authenticating user.
Negotiating security policies.
Securing communication channel.
Your VPN connection is secure.
VPN tunnel information.
Client address: <span style="color: red; font-weight: bold;">Ваш_локальный_адрес</span>
Server address: <span style="color: red; font-weight: bold;">IP_адрес_вашей_Cisco</span>
Encryption: 168-bit 3-DES
Authentication: HMAC-SHA
IP Compression: None
NAT passthrough is active on port UDP 4500
Local LAN Access is disabled

Подключение успешно выполнено. Как видим туннель на удаленную сеть открыт и готов к транспорту пакетов. Отключение можно выполнить банальным сочетанием Ctrl+C или в другой консоли вводом команды разрыва соединения.

root# vpnclient disconnect

В другой консоли можно проверить ping любого адреса в удаленной сети. Можете запускать RDP, VNC или другую систему управления серверами или компьютерами. Адреса указывайте такие, как будто вы находитесь в домашней сети. Все это можно оформить аккуратней, но как всегда лень. Зато у вас будет желание сделать все красивее и качественней. Удачи с экспериментами.

http://www.qdesnic.ru/page/cisco_vpnclient.html

Использование NFS

Файловая система NFS (Network File System) позволяет предоставлять файловые ресурсы одних компьютеров в сети для других. Файловая система NFS позволяет монтировать сетевые дисковые ресурсы с помощью обычной команды «mount», поэтому с точки зрения пользователя сетевые ресурсы NFS не отличаются от локальных дисковых ресурсов. Для настройки нам понадобится как серверная, так и клиентская часть файловой системы NFS.

Серверная часть

Серверная часть файловой системы не обязательно должна находиться на сервере. Если вы собираетесь предоставлять свои файловые ресурсы другим пользователям в сети, то вам необходимо установить серверную часть, а если вы собираетесь воспользоваться файловыми ресурсами других пользователей или серверов посредством NFS, то вам необходимо установить клиентскую часть. Начнем с серверной части.

user$ su
root# aptitude update
root# aptitude safe-upgrade
root# aptitude install nfs-kernel-server

Все зависимости подтянутся автоматически. После установки основного пакета, необходимо определить какие именно файловые ресурсы будут предоставлены пользователям. Настройки доступа определяются в файле «/etc/exports».

root# mcedit /etc/exports

Каждый разделяемый ресурс пишется с новой строки, ниже пример разделяемого ресурса

...
/home/user  192.168.1.0/24(ro, async, no_subtree_check)
...

Некоторое пояснения формата строки:

  • /home/user — предоставляемый ресурс другим пользователям в сети, директория не обязательно должна находиться в каталоге /home предложено как пример;
  • 192.168.1.0/24 — адрес сети с префиксом или 192.168.1.0/255.255.255.0 так же может быть указан конкретный IP адрес (например 10.0.0.145) или имя узла с применением шаблонов (например *.comp?.mynet.lan — разрешено использование ресурса всех узлов из поддоменовcomp1, comp2, compd и т.д. домена mynet.lan);
  • ro — указывает, что ресурс предоставляется только для чтения. Если необходимо предоставить режим чтение/запись необходимо указать — rw;
  • async — разрешает отвечать клиенту до того, как будут завершены предыдущие операции записи (в оригинальном протоколе NFS это запрещено), что повышает быстродействие;
  • no_subtree_check — не осуществлять проверку вложенных каталогов;
  • no_root_squash – по умолчанию пользователь root на клиентской машине не будет иметь доступа к разделяемой директории сервера. Этой опцией мы снимаем это ограничение. В целях безопасности этого лучше не делать.

Когда будут завершены определения всех ресурсов — сохраняем файл «/etc/exports» и перезапускаем службу NFS.

root# /etc/init.d/<span id="fullpost">nfs-kernel-server</span> restart

Серверная часть службы NFS готова к работе. Посмотреть какие ресурсы предоставлены можно командой:

root# showmount -e

Если вы только добавляли ресурсы в файл «/etc/exports», то их можно активировать без перезапуска службы NFS. Команда полезна при длительных операциях чтения/запись.

root# exportfs -a

На этом настройку серверной части файловой системы NFS можно завершить и приступить к настройке клиентской части.

Клиентская часть

Устанавливаем клиента файловой системы NFS

user$ su
root# aptitude install portmap nfs-common

Клиентская часть установлена, можно приступить к монтированию. Монтирование можно осуществлять двумя способами: автоматическое монтирование при загрузке системы или вручную по требованию. Рассмотрим оба варианта начиная с ручного, т.к. оба они могут быть востребованы.

Для ручного монтирования необходимо определить точку монтирования, либо использовать уже имеющуюся, для наглядности создадим в домашнем каталоге папку «testmount»

user$ mkdir ~testmount

Теперь можно приступать к непосредственному монтированию файловой системы NFS.

user$ su
root# mount 10.0.0.10:/home/user /home/user/testmount

Файловая система смонтирована, стоит прокомментировать последнюю команду:

  • mount — команда монтирования;
  • 10.0.0.10:/home/user — здесь 10.0.0.10 адрес удаленного узла (может быть имя см. выше),:/home/user — ресурс, который предоставляет сервер (вы должны его знать);
  • /home/user/testmount — точка монтирования, созданная нами;

Для автоматического монтирования файловых систем NFS можно их прописать в файл «/etc/fstab», тогда во время загрузки системы они будут смонтированы автоматически.

root# mcedit /etc/fstab

Добавляем запись с нашими настройками

..
10.0.0.10:/home/user /home/user/testmount nfs intr,soft
..

Напоминаю! Что после всех добавленных строк в файл «/etc/fstab» последняя строка должна быть пустой, иначе можно схватить очень неприятный глюк в виде не загружаемой системы (когда его поправят не ясно). Рассмотрим опции монтирования.

  • 10.0.0.10:/home/user — монтируемый ресурс, детально см. выше;
  • /home/user/testmount — точка монтирования;
  • nfs — тип монтируемой файловой системы, в нашем случае NFS;
  • intr — позволяет прерывать процесс, работающий с файловой системой;
  • soft — спасает от безнадежного зависания, если удаленный ресурс не доступен;

Теперь при следующем запуске системы файловые системы NFS смонтируются автоматически, а если они будут не доступны на момент монтирования, то загрузка продолжится с пропуском монтирования. По требованию их можно будет смонтировать вручную или вызвать команду монтирования файловых устройств описанных в «/etc/fstab»

root# mount - a

Консольный менеджер screen

Тема этой заметки будет полезна не только начинающим системным администраторам, работающим в консоли, но и будет познавательно рядовым пользователям, которые знают о существовании консоли и иногда, 🙂 ее даже запускают. Речь пойдет о замечательном и очень простом в использовании консольном менеджере окон GNU Screen. Возможности Screen впечатляют и позволяют эффективно работать в консоли. Основными возможностями Screen можно отметить следующее: создание и управление консольными окнами в пределах одной сессии, Screen позволяет быстро переключаться между окнами, сохранять состояние сессии и позднее подключаться к ней, также предоставлять доступ к этой сессии другим пользователям, обмениваться содержимым окон посредством copy/paste.

Одновременно в окне терминала может находится одно текстовое окно Screen, либо несколько (в этом случае окно терминала будет поделено на регионы). Однако, самая «вкусная» возможность Screen заключается в поддержке сессии. Сессия сохраняется на стороне сервера, поэтому не важно сессия была разорвана в результате сбоя или прервана сознательно, в любой момент времени и с любого устройства можно подключится к имеющейся рабочей сессии с сохранение состояния при отключении, т.е. все консольные окна восстановятся, а приложения запущенные в этих окнах продолжают работать не прерываясь. Очень удобно когда открытую сессию, например на работе, можно продолжить дома.

Перед запуском проверим установлен ли screen в системе

user$ which screen

Если в ответ получено примерно такое:

/usr/bin/screen

Значит screen установлен в системе и можно продолжать, иначе необходимо установить обычным для вас способом из репозитария системы. Можно и так …

user$ sudo apt-get install screen

Запускаем .. появится информация о лицензии и версии, нажимаем «Пробел». Этот вывод можно отключить в конфигурационном файле, далее мы это сделаем. Внешне ничего не изменилось. Секрет в том, что screen передает активному окну все команды оставляя для себя только комбинацию Ctrl+a (ее тоже можно переопределить). Все команды screen состоят из комбинации, по-умолчанию Ctrl+a и непосредственно клавиши. Почти у каждой команды имеется текстовый аналог. Для простоты буду использовать следующее сокращение:

  • [Определенная комбинация]+[клавиша] {текстовая команда} — Описание команды
  • [Ctrl+a]+[:] {colon} — Вывести приглашение для ввода текстовых команд в интерактивном режиме;

Управление окнами

У нас имеется уже одно активное окно, оно создается при запуске screen и ему автоматически присваивается номер 0, создадим еще одно:

  • [Ctrl+a]+[c] {screen} — Создать новое окно и присваивает ему следующий порядковый номер;

После создания нового окна оно становится автоматически активным, а предыдущее активное окно переходит в фоновый режим. Причем фоновый режим окна ничем не отличается от обычной сессии. Например, если вы запустили в окне 0 архивацию данных, создали новое окно 1 и в нем начали редактирование какого-то файла, то вы всегда можете переключится в окно 0 и посмотреть закончилась ли архивация. Вот список наиболее часто применяемых команд для управления окнами:

  • [Ctrl+a]+[w] {windows} — Выводит список номеров и заголовков всех окон в нижней строчке экрана;
  • [Ctrl+a]+[«] {windowlist} — Выводит интерактивное меню номеров и заголовков всех окон из которого можно выбрать окошко для переключения;
  • [Ctrl+a]+[Номер окна] {select} — Выбор окна по номеру. Например, команда Ctrl+a и 2 делает текущим окно с номером 2;
  • [Ctrl+a]+[N] {number} — Показать номер и заголовок текущего окна;
  • [Ctrl+a]+[A] {title} — Установить заголовок текущего окна;
  • [Ctrl+a]+[k] {kill} — Принудительное закрытие окна, например, в случае если приложение не удается закрыть обычным способом, равносильно разрыву сессии;

С настройками по-умолчанию screen отображает одно окно, но иногда необходимо видеть несколько консолей. Эта возможность работы с регионами экрана есть у screen, она позволяет разделить экран и отображать несколько окон одновременно и при этом переключаться между ними.

  • [Ctrl+a]+[S] {split} — Разделить текущее окно, или регион на два новых региона. При этом размеры всех регионов меняются для получения дополнительного пространства на экране и в новом регионе отображается пустое окно;
  • [Ctrl+a]+[Tab] {focus} — Переместить текущий фокус отображения на регион ниже, или на верхний регион если текущим является самый нижний регион;
  • [Ctrl+a]+[Q] {only} — Закрыть все регионы кроме текущего;
  • [Ctrl+a]+[X] {remove} — Закрыть текущий регион;

После разделения окна на регионы в одном регионе остается активное окно, а появившийся новый регион пустой. В новом регионе можно переключится на другое окно или выполнить иные действия. В случае, если вы закрываете какое-то окно, нумерация окон не меняется, новые создаваемые окна занимают пропущенные номера. Например, имелась последовательность открытых окон — [0,1,2,3,4,5], вы закрыли 1 и 4 — нумерация будет следующей [0,2,3,5]. При создании нового окна ему будет присвоен номер 1, а следующему 4. Если вы закрываете все окна screen завершает свою работы и выводит сообщение — [screen is terminating].

Работа с текстом

При работе в консоли часто возникает задача скопировать часть кода или длинную shell команду, в этом может помочь screen. У него в запасе много разных возможностей и такие как copy/paste между окнами не исключение.

 

  • [Ctrl+a]+[[] {copy} — Войти в режим копирования;
  • [Ctrl+a]+[]] {paste} — Вставить текст из регистра обмена;

В режиме copy/paste screen запускает встроенный редактор, который напоминает vi.

  • Клавиши управления курсором перемещают курсор по экранному буферу;
  • Клавиша «Пробел» отмечает начало и конец региона для копирования. При втором нажатии «Пробел», отмеченный текст копируется в регистр обмена, и screen выходит их режима копирования;

Консольные сессии

Поддержка сессий одна из самых популярных возможностей screen. Рассмотрим банальную ситуацию: вы, находясь в точке A, подключаетесь к удаленному серверу запускаете некоторое количество задач в разных окнах, закрываете соединение и спокойно занимаетесь своими делами. Через некоторое количество времени (возможно несколько дней), подключаетесь к этому же серверу но уже с точки Б (можно и с точки А, Д и т.д. откуда угодно) восстанавливаете все окна с результатами выполненных задач. Думаете такое не возможно? Как раз консольные сессии screen предназначены для таких возможностей. Они позволяют отключить от терминала текущую сессию со всеми созданными окнами и запущенными в этих окнах приложениями, а через некоторое время подключится к этой сессии с восстановлением состояния окон после отключении. При этом все запущенные в окнах приложения продолжают работать и используют для вывода свои окна. Плюс ко всему таких сессий может быть несколько.

  • [Ctrl+a]+[d] {detach} — Отсоединить консольную сессию и оставить ее запущенной в фоновом режиме;
  • [Ctrl+a]+[D D] {pow_detach} — Отсоединить консольную сессию, оставить ее запущенной в фоновом режиме и послать родительскому процессу screen сигнал HANGUP. При запуске screen из удаленного терминала это означает отсоединение screen и затем закрытие соединения;
  • [Ctrl+a]+[z] {suspend} — Отсоединить консольную сессию и оставить ее запущенной как фоновый процесс родительской командной оболочки. В этом случае для восстановления сессии кроме команд описанных ниже могут быть использованы стандартные команды управления фоновыми процессами командной оболочки;
  • [Ctrl+a]+[Ctrl +] {quit} — Закрыть все окна сессии и выйти из screen. Надо заметить, что многие дистрибутивы переопределяют клавишную комбинацию для этой команды, но текстовую команду можно использовать в любом случае;

Режимы отключения рассмотрели, теперь посмотрим как можно подключится к отсоединенной сессии. Рассматривать 🙂 лучше всего на примере. Для начала нам нужно узнать количество и имена имеющихся открытых сессий.

user$ screen -ls
There are screens on:
    13695.pts-1.user-desktop    (30.08.2010 09:41:30)    (Detached)
    13051.pts-1.user-desktop    (01.09.2010 12:40:51)    (Detached)
    18595.pts-1.user-desktop    (01.09.2010 11:15:49)    (Detached)
3 Sockets in /var/run/screen/S-user.

Здесь видно, что открыто 3 сессии, причем, у каждой есть информация об имени, дате, времени и состоянии. Как отмечалось ранее, к открытой сессии можно подключиться в любое время и даже через несколько дней. Для подключения к имеющейся сессии существует ключ -r. Подключимся к сессии с именем 13051.pts-1.user-desktop.

user$ screen -r 13051.pts-1.user-desktop

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

user$ screen -x 13051.pts-1.user-desktop

Всего делов то. Есть конечно еще много всяких параметров работы с screen, но в своей работа мне описанного выше хватает, для тех кто хочет узнать больше существует волшебная команда 🙂 man screen или почитать перевод тут.

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

Параметры заданные по-умолчанию к любой программе можно изменить под свои требования и предпочтения, утилита screen не исключение. Как и полагается для *nix приложения у нее имеется конфигурационный файл. Он находится в домашней директории пользователя — ~/.screenrc, если отсутствует это означает, что настройка не производилась, просто создайте его и опишите все необходимые настройки сами, руководствуясь документацией или 🙂 знаниями. Приведу пример простого конфигурационного файла, все подробности в #комментариях.

user$ cat ~/.screenrc
# Отключаем приветствие при запуске
startup_message off
# Перейти в домашний директорий и создать окно с именем Work
chdir
screen -t Work
# Перейти в директорий /etc и создать окно с именем Config
chdir /etc
screen -t Config
# Перейти в директорий /etc и создать окно с именем Logs
chdir /var/log
screen -t Logs
# Активировать окно с номером 0 после старта
select 0
# Включаем utf8 полезно на некоторых терминалах
defutf8 on
# Использовать визуальный сигнал (мигание экрана) вместо писка динамика
vbell on
# Активировать возможность прокрутки в xterm (и других эмуляторах терминала)
termcapinfo xterm* ti@:te@
# Размер буфера прокрутки
defscrollback 1000
# Производить отключение сессии при разрыве связи с терминалом
autodetach on
# Строка состояния
hardstatus alwayslastline "%{+b wk} %c $LOGNAME@%H %=[ %w ] "
# По клавише <Esc> создать окно с именем root и запустить в нем команду su
# по аналогии с этой командой можно создать команды для запуска приложений
# в разных окнах
bind \033 screen -ln -t root 9 su

Пожалуй для минимального конфигурационного файла этого достаточно. Теперь при запуске у вас будет создано три окна с именами Work, Config и Logs и появится строка статуса.

<span style="font-weight: bold;">15:27 user@hostname             [ 0* Work 1 Config 2 Logs ]</span>

Слева будут располагаться текущее время и имя_пользователя@имя_хоста, а справа — имена всех открытых окон в квадратных скобках. При этом текущее активное окно будет помечено звездочкой. Для задания строки статуса screen использует специальные символы, похожие на те, что применяются для формирования приглашения командного интерпретатора. Разукрасить можете по своему усмотрению прочитав руководство.

Быстрое сканирование MAC-адресов сети

Периодически возникает задачи связанные с использование MAC адресов в сети, это может быть и привязка IP адреса к MAC адресу, и пинг по MAC адресу. Для быстрого сканирования MAC адресов устройств в локальной сети достаточно воспользоваться небольшой утилитой arp-scan, предназначенной для таких целей.

# apt-get install arp-scan
# arp-scan -I eth0 -l
pcap_open_live: eth0: That device is not up
funka:/mnt# arp-scan -I eth1 -l
Interface: eth1, datalink type: EN10MB (Ethernet)
Starting arp-scan 1.6 with 256 hosts (http://www.nta-monitor.com/tools/arp-scan/)
192.168.20.1    50:67:xx:xx:xx:xx       (Unknown)
192.168.20.25   00:14:xx:xx:xx:xx       Giga-Byte
192.168.20.39   48:5b:xx:xx:xx:xx       (Unknown)
192.168.20.57   00:26:xx:xx:xx:xx       (Unknown)
192.168.20.70   00:21:xx:xx:xx:xx       (Unknown)
192.168.20.78   00:15:xx:xx:xx:xx       Samsung Electronics Co., LTD
192.168.20.85   00:90:xx:xx:xx:xx       AUDIO CODES LTD.
192.168.20.101  c0:3f:xx:xx:xx:xx       (Unknown)
192.168.20.104  00:24:xx:xx:xx:xx       (Unknown)
192.168.20.107  48:5b:xx:xx:xx:xx       (Unknown)
192.168.20.111  00:90:xx:xx:xx:xx       AUDIO CODES LTD.

12 packets received by filter, 0 packets dropped by kernel
Ending arp-scan 1.6: 256 hosts scanned in 1.223 seconds (209.32 hosts/sec).  12 responded

Использование Truecrypt

Загрузка

http://www.truecrypt.org/download/truecrypt-7.1-linux-console-x64.tar.gz

# tar xzvf truecrypt-7.1-linux-console-x64.tar.gz

Получаем исполняемый файл truecrypt-7.1-linux-console-x64.

Установка Truecrypt

Для работы truecrypt’а надо установить дополнительные пакеты:

# aptitude install libfuse2 fuse-utils dmsetup

После установки запускаем, ранее извлечённый из архива, файл truecrypt-7.1-linux-console-x64:

# ./truecrypt-7.1-setup-console-x64
TrueCrypt 7.1 Setup
____________________

Installation options:

 1) Install truecrypt_7.1_console_amd64.tar.gz
 2) Extract package file truecrypt_7.1_console_amd64.tar.gz and place it to /tmp

To select, enter 1 or 2: 1

Before you can use, extract, or install TrueCrypt, you must accept the
terms of the TrueCrypt License.

Press Enter to display the license terms...

Press Enter or space bar to see the rest of the license.

TrueCrypt License Version 3.0

Читаем лицензионное соглашение до самого конца и вводим yes

Do you accept and agree to be bound by the license terms? (yes/no): yes

Requirements for Running TrueCrypt:
-----------------------------------

 - FUSE library and tools
 - device mapper tools

Press Enter to continue...

Uninstalling TrueCrypt:
-----------------------

To uninstall TrueCrypt, please run 'truecrypt-uninstall.sh'.

Installing package...
usr/bin/truecrypt
usr/bin/truecrypt-uninstall.sh
usr/share/truecrypt/doc/License.txt
usr/share/truecrypt/doc/TrueCrypt User Guide.pdf

Press Enter to exit...

Шифрование раздела и создание контейнера

Шифрование раздела и создание контейнера мало чем отличаются. В первом случае, как аргумент команды, указывается раздел, а во втором случае — файл.

При шифровании раздела все данные на нём уничтожаются.

Раздел не надо форматировать перед шифрованием.

Пример:

Шифрование файла:

# truecrypt -c /var/file.txt

Шифрование раздела:

# truecrypt -c /dev/sda8
Volume type:
1) Normal
2) Hidden
Select [1]: 1

На этом этапе выбирается тип создаваемого тома. Normal — обычный, полностью зашифрованный, том. Hidden — незаметный, скрытый том, внутри реального отформатированного раздела. Для реального раздела-донора желательно выбирать раздел с файловой системой FAT32, чтобы внутрь раздела поместилось больше информации и уменьшилась вероятность повреждения скрытого тома.

Encryption algorithm:
1) AES
2) Serpent
3) Twofish
4) AES-Twofish
5) AES-Twofish-Serpent
6) Serpent-AES
7) Serpent-Twofish-AES
8) Twofish-Serpent
Select [1]:

Алгоритм шифрования AES самый быстрый и его, вероятно, лучше выбрать для томов, с которых будут запускаться программы. Для хранения информации можно выбрать любой алгоритм из представленного списка.

Hash algorithm:
1) RIPEMD-160
2) SHA-512
3) Whirlpool
Select [1]:

Просто нажимаю Enter. Первая хэш-функция в самый раз.

Filesystem:
1) None
2) FAT
3) Linux Ext2
4) Linux Ext3
5) Linux Ext4
Select [2]: 5

Файловая система для нового тома. Выбрал ext4.

Enter password:
Re-enter password:

Вводим достаточно длинный пароль. Надо заметить, что лучший пароль это действительно случайный набор символов или псевдослучайный.

Enter keyfile path [none]:

Хорошая мысль создать ключевой файл на удаленном носителе и указать его при шифровании. Главное в дальнейшем его не потерять. Но можно в качестве ключевого файла использовать простой текстовый файл с широко известным текстом.

Please type at least 320 randomly chosen characters and then press Enter:

Done: 100.000%  Speed:   58 MB/s  Left: 0 s

The TrueCrypt volume has been successfully created.

При первом использовании у меня возникла ошибка:

Error: fuse: device not found, try 'modprobe fuse' first

Решается все, соответственно:

# modprobe fuse
# modprobe -l | grep fuse
kernel/fs/fuse/fuse.ko
kernel/fs/fuse/cuse.ko

Процесс завершился и зашифрованный том создан.

Монтирование зашифрованного файла или раздела

Монтирование зашифрованного файла:

# truecrypt /var/file.txt /mnt/secure
Enter password for /var/file.txt:
Enter keyfile [none]:
Protect hidden volume (if any)? (y=Yes/n=No) [No]: n

Монтирование зашифрованного раздела:

# truecrypt /dev/sda8 /mnt

Раздел или файл зашифрован?

Некоторые задают этот вопрос приводя в пример, например, строку из статьи википедии посвящённой Truecrypt’у: Ни один том TrueCrypt не может быть идентифицирован (тома TrueCrypt невозможно отличить от набора случайных данных, то есть файл нельзя связать с TrueCrypt как с программой, его создавшей, ни в какой форме и рамках).

Ещё раз отвечаю, что в этой фразе заключён другой смысл. Тут ясно написано, что увидев раздел или файл со случайными данными нельзя сказать, что он точно зашифрован с применением программы Truecrypt. Просто читать надо до конца фразы.

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

Если очень упростить, то можно сказать, что случайные данные представляют собой набор повторяющихся последовательностей символов, огрызков читаемых данных от каких-то файлов, пустые промежутки. Слишком случайные данные — это набор неповторяющихся символов. Это шум, хаос, всплеск энтропии. Сжать такие «слишком случайные» данные каким-либо архиватором не представляется возможным. Ни один обычный раздел на винчестере не будет содержать в себе кластеры, полностью забитые слишком случайными данными.

Некоторое подобие шифрованных файлов — архивы. Но у архивов есть заголовки, по которым можно идентифицировать программу-архиватор, при помощи которой был создан архив.

Вариант использования

Свои разделы для фото- и видео-архивов закриптованы с помощью truecrypt на основе ключевого файла; ключевой файл лежит, например, на постоянно подсоединённой флэшке; в rc.local помещена команда truecrypt для монтирования томов.

Монтирование томов случилось только при явном указании отсутствия пароля и hidden-раздела:

$ /usr/bin/truecrypt -t -p "" --protect-hidden=no --keyfiles=/media/flashka/file /dev/sdc2 /media/photos
$ /usr/bin/truecrypt -t -p "" --protect-hidden=no --keyfiles=/media/flashka/file /dev/sdc3 /media/videos

Отказоустойчивый Asterisk-кластер на основе DRDB и Redfone foneBRIDGE2

Имеем задачу увеличить отказоустойчивость работы телефонии, для этого создаем кластер, основанный на использовании пакета DRDB. Для связи с PSTN-провайдером служит TDMoE-конвертер от Redfone — foneBRIDGE2. Конвертер преобразует поток T1/E1 в Ethernet. Для обеспечения отказоустойчивости в нашем случае используются 2 сервера Asterisk, — Master и Slave, пара других сетевых интерфейсов серверов (eth0) соединена с помощью cross-кабеля. Синхронизация между серверами осуществляется с помощью DRBD, благодаря которому мы получим «сетевой RAID1». В качестве системы управления отказоустойчивостью кластером, выбран пакет Heartbeat.

Предположим, что у нас есть 2 сервера, с установленным Asterisk и настроенной сетью.

Master: astmaster.local — eth0: 192.168.0.200, eth0: 10.10.10.10
Slave: astslave.local — eth0: 192.168.0.201, eth0: 10.10.10.11

Потребуется также 3-й IP-адрес, из сети 192.168.0.0/24, так называемый виртуальный IP-адрес, например — 192.168.0.203.

На данный момент, оба сервера c Asterisk, связаны с этим виртуальным IP, т.е. на интерфейсах eth1 каждого сервера прописан alias с IP-адресом 192.168.0.203.

Настройка файловой системы

Для осуществления синхронизации между серверами, нам потребуется дополнительный раздел.

1. Загрузимся с LiveCD

2. Проверим диск на наличие ошибок (все ошибки необходимо исправить):

 e2fsck –f /dev/sda2

3. Изменим размер текущего раздела sda2:

resize2fs –f –p /dev/sda2 3000M

где «3000M» — новый размер раздела, следует также помнить:

  • Раздел swap должен быть не менее 512M и не более 1G, для наших целей.
  • Для синхронизации разделов DRDB, слишком большой размер займет очень много времени, если раздел будет слишком маленьким — не хватит места. Минимальный размер раздела DRDB составляет 4 Gb. Оптимальные размеры от 4 до 16 Gb. (Примечание. Из-за бага или фичи в resize2fs, или даже в fdisk, размер главного раздела надо умножить на 0,75, в нашем случае будет именно 3 Gb).

4. Запускаем fdisk /dev/sda, жмем «p» и enter. В нашем случаем, как показано на скриншоте ниже, и стираем все разделы ниже 14-го цилиндра, являющегося началом раздела sda2.

  • Удаляем swap раздел:
    • Жмем «d», Enter
    • Жмем «3», Enter
  • Удаляем раздел sda2
    • Жмем «d», Enter
    • Жмем «2», Enter
  • Создаем новый раздел sda2
    • Жмем «n», Enter
    • Жмем «p», Enter
    • Жмем «2», Enter
    • Жмем «14», Enter (или то значение, с которого начинается раздел sda2)
    • Жмем «+4000M», Enter (или другой необходимый размер для DRDB-раздела)
    • Жмем «w», Enter

5. Проверяем раздел на наличие ошибок:

fsck –f /dev/sda2

6. Запускаем resize2fs, без указания размера раздела, чтобы использовать всё доступное место на этом разделе.

resize2fs -е -р / dev/sda2

7. Снова запускаем fsck, чтобы удостовериться, что всё прошло нормально:

fsck -f / dev/sda2

8. Запускаем fdisk /dev/sda еще раз, для создания swap-раздела:

  • Жмем «n», Enter
  • Жмем «p», Enter
  • Жмем «3», Enter, Enter
  • Жмем «+768M», Enter (вводим размер файла подкачки)
  • Жмем «t», Enter
  • Жмем «3», Enter
  • Жмем «82», Enter
  • Жмем «n», Enter
  • Жмем «p», Enter
  • Жмем Enter, Enter
  • Жмем «w», Enter

10. Форматируем swap-раздел:

mkswap –L SWAP-sda3 /dev/sda3

11. Перезагружаем сервера.

Установка и настройка DRDB

Для дальнейших настроек можно скачать уже настроенные пакеты DRDB и Heartbeat:

Для нескольких CPU: asterisk_ha_cpu_multi.tar.bz2

Для одного CPU: asterisk_ha_cpu_single.tar.bz2

Внимание! Скрипты заточены только под Trixbox 1.2.3!

Создаем новую директорию в корне:

mkdir /ha
cd /ha
wget http://891rpm.arthead.ru/filez/asterisk_ha_cpu_single.tar.bz2
tar -xjvf asterisk_ha_cpu_single.tar.bz2

Перед использованием скриптов, проверим:

1. Внешние интерфейсы серверов (eth1) должны принадлежать одной сети (192.168.0.0/24).

2.  Внутренние интерфейсы серверов (eth0) должны принадлежать одной сети (10.10.10.0/24). При необходимости можно указать другие IP-адреса в файле drdb.conf.

3. Имя первичного сервера — astmaster.local, вторичного — astsecondary.local. Команда uname -n должна возвращать эти имена. При необходимости можно указать другие имена в файлах drdb.conf, ha.d/ha.cf и ha.d/haresources.

Внимание! В имени хоста необходимо использовать «.». Если использовать простое имя, без точки, то Sendmail будет загружаться очень медленно, что снизит переключение между серверами на несколько минут, вместо секунд. 🙂

4. Оба интерфейса должны стартовать при загрузке системы.

5. IP-адреса серверов и шлюза также прописываются в ha.d/haresources.

6.  Необходимо убедиться, что сервера видят друг друга, и firewall на внутренних интерфейсах (eth0) отключен.

7. Для гигабитных интерфейсов, внутри кластера (eth0), необходимо в файле drdb.conf изменить параметр «rate» в значение «120».

8. Выполним скрипт /root/ha/drdb на обоих серверах — ошибок быть не должно. Если выполнить скрипты не одновременно или пройдет таймаут, DRDB может сообщить, что ожидает соседние ноды. Однако, после загрузки drdb.primary, необходимо убедиться, что узлы синхронизированы.

9. Проверить работу DRDB можно, выполнив cat /proc/drbd. При этом узлы будут находиться в состоянии secondary или inconsistent.

10. На первичном сервере надо запустить скрипт /root/ha/drbd.primary. Выполнение может занять некоторое время, однако ошибок быть не должно, разве что различных предупреждений типа — «timestamp in future».

11. Необходимо подождать, пока DRDB синхронизирует узлы кластера. Этот процесс может занять до нескольких часов. Для проверки готовности узлов можно проверить статус, командой cat /proc/drbd.

12. После окончания синхронизации, на первичном сервере появится сообщение:

13. DRDB установлен и работает!

Установка и настройка Heartbeat

1. Выполним скрипт /root/ha/ha на обоих серверах. Будут остановлены эти демоны: mysql, sendmail, asterisk, httpd, munin-node, ircd, xinetd, xplhub, vsftpd.

2. Через некоторое время, после запуска Heartbeat демоны снова начнут работать:

3. Если выполнить команду ifconfig eth1:0 увидим виртуальный IP-адрес 192.168.0.203, приписанный первичному серверу.

4. Для тестирования кластера просто выключаем питание на первичном сервере.

Через пару секунд все службы и alias сетевого интерфейса будут запущены на вторичном сервере.

Включаем первичный сервер. После загрузки первичного сервера, все службы на вторичном сервере «перейдут» на первичный сервер.

Кластер готов к работе.

 

Установка и настройка Redfone foneBRIDGE2

Желательно TDMoE трафик из foneBRIDGE изолировать VLAN’ом X, на коммутаторе.

Примечание: VLAN X имеет доступ к серверам кластера в VLAN Y, но не имеет доступа к VLAN Z, где размещены VoIP-устройства и пр. Между VLAN Y и VLAN Z обмен пакетами разрешен. Основная задача изолировать TDMoE трафик от остальной сети.

Настройка foneBRIDGE2 и Zaptel

Чтобы заставить foneBRIDGE работать, надо скачать, скомпилировать и установить программу Fonulator (Redfone). Основной файл настроек программы — redfone.conf.

Работа foneBRIDGE основана на TDMoE (Time Division Multiplexing over Ethernet) через MAC-адреса.

wget http://support.red-fone.com/downloads/fonulator/fonulator-2.0.3.tar.gz tar -xzvf fonulator-2.0.3.tar.gz
cd fonulator-2.0.3

(для более старых версий можно указать CFLAGS=-static)

./configure
make clean
make
make install
cd /usr/local/bin
chmod a+x fonulator

Загрузочный скрипт можно скачать здесь:

http://891rpm.arthead.ru/filez/fonulator

 

http://891rpm.arthead.ru/filez/foneBRIDGE2_Installation_Guide_English.pdf

Скрипт устанавливается в директорию /etc/init.d/ на каждом сервере.

cd /etc/init.d
chmod a+x fonulator

Настриваем foneBRIDGE  помощью файла настроек redfone1.conf и redfone2.conf. Надо скопировать эти файлы в директорию /etc/ на каждом сервере.

redfone1.conf

[globals]
fb1=00:50:C2:65:D1:62
fb2=00:50:C2:65:D1:63
server1=00:1A:64:11:3B:76
card=eth1,fb1

[span1]
span=1,0,0,ccs,hdb3,crc4
server1
fb1
pri

Измените fb1 и fb2 на MAC-адреса, указанные на каждом из foneBRIDGE. Параметр server1 изменяем на MAC-адрес сетевого интерфейса eth1, соответствующего сервера.

redfone2.conf

[globals]
fb1=00:50:C2:65:D1:6A
fb2=00:50:C2:65:D1:6B
server1=00:1A:64:11:3B:76
card=eth1,fb1

[span1]
span=1,0,0,ccs,hdb3,crc4
server1
fb1
pri

Измените fb1 и fb2 на MAC-адреса, указанные на каждом из foneBRIDGE. Параметр server1 изменяем на MAC-адрес сетевого интерфейса eth1, соответствующего сервера.

Скрип запуска fonulator, в /etc/init.d использует оба этих файла для запуска foneBRIDGE’ей.

zaptel.conf (dahdi.conf)

# 2 X E1 PRIs, on 2 separate fonebridges
#
# fonebridge No. 1
#
dynamic=eth,eth1/00:50:C2:65:D1:62/0,31,2
#
# fonebridge No. 2
#
dynamic=eth,eth1/00:50:C2:65:D1:6A/0,31,2
#
bchan=1-15,17-31
dchan=16
bchan=32-46,48-62
dchan=47

# Global data

loadzone	= ru
defaultzone	= ru

Надо указать MAC-адреса соответствующие MAC-адресам foneBRIDGE. Необходимо указывать только MAC-адреса интерфейса FB1, каждого из foneBRIDGE.

zapata.conf

;
; Zapata telephony interface
;
; Configuration file

[trunkgroups]

[channels]

language=en
context=default
switchtype=euroisdn
pridialplan=unknown
prilocaldialplan=unknown
signalling=pri_cpe
usecallerid=yes
hidecallerid=no
callwaiting=yes
usecallingpres=yes
callwaitingcallerid=yes
threewaycalling=yes
transfer=yes
cancallforward=yes
callreturn=yes
echocancel=yes
echocancelwhenbridged=yes
rxgain=0.0
txgain=0.0
group=0
callgroup=1
pickupgroup=1
immediate=no
channel =>  1-15,17-31,32-46,48-62

;faxdetect=both
faxdetect=incoming
;faxdetect=outgoing
;faxdetect=no

;Include genzaptelconf configs
#include zapata-auto.conf

group=1

;Include AMP configs
#include zapata_additional.conf

No you need to edit the haresources file on both machines.

Надо также отредактировать файл /etc/ha.d/haresources на обоих серверах:

astmaster.local 192.168.0.203/24/eth1 drbddisk::shared
Filesystem::/dev/drbd0::/share::ext3 drbdlinks mysqld sendmail
asterisk httpd munin-node vsftpd ircd xplhub amportal xinetd

изменить на:

asteriskmaster.local 192.168.0.203/24/eth1 drbddisk::shared
Filesystem::/dev/drbd0::/share::ext3 drbdlinks mysqld sendmail
fonulator
asterisk httpd munin-node vsftpd ircd xplhub amportal xinetd

Благодаря этому, скрипт fonulator заработает, как кластерный сервис! 🙂

Включите оба foneBRIDGE и подключите к коммутатору. Перезагрузите оба сервера. Если возникнут проблемы с загрузкой серверов, можно зайти на первичный сервер и выполнить zztool (dahdi_tool).

После этого, оба SPAN должны нормально и без ошибок работать.

(http://www.fintechcommunications.com/tutorials/asteriskCluster.htm)

 

———————————————-

Ubuntu Server 9.04 Install with Asterisk and foneBRIDGE2

Requirements

Base Install from ISO image

Components

dahdi-2.2.0

dahdi-tools-2.0.0

libpri-1.4.10.1

asterisk-1.4.26

Install Steps
Install dependencies and helper packages;

apt-get install openssh-server
apt-get install build-essential
apt-get install linux-headers-2.6.28-11-server
apt-get install libnet1 libnet1-dev
apt-get install libpcap0.8 libpcap0.8-dev
apt-get install libargtable2-0 libargtable2-dev
apt-get install libncurses5-dev
apt-get install libnewt-dev

Download ASTERISK, DAHDI, LIBPRI, FONULATOR, LIBFB. Please note many of the asterisk.org directories change frequently which may require modifications to the full URL path used in some of the following command examples.

cd /usr/src
wget http://support.red-fone.com/downloads/dahdi/dahdi-linux-2.2.0-redfone.tar.gz
wget http://support.red-fone.com/downloads/dahdi/dahdi-tools-redfone-2.0.0.tar.gz
wget http://support.red-fone.com/downloads/fonulator/libfb-2.0.0.tar.gz
wget http://downloads.asterisk.org/pub/telephony/libpri/releases/libpri-1.4.10.1.tar.gz
wget http://downloads.asterisk.org/pub/telephony/asterisk/releases/asterisk-1.4.26.tar.gz

Install libfb, fonulator library.

tar xzvf libfb-2.0.0.tar.gz
cd libfb-2.0.0
make clean
./configure
make
make install
cd ..

Install fonulator, the fonebridge configuration utility

tar xzvf fonulator-2.0.0.tar.gz
cd fonulator-2.0.0
./configure
make
make install

Confirm fonulator installation successful

fonulator -V

fonulator 2.0.0

Copyright (C) 2007 Redfone Communications, LLC.

Build Number: 36

Install dahdi and dahdi-tools

tar xzvf dahdi-1.4.9.2.tar.gz
cd zaptel-1.4.9.2
./configure
make menuselect
make
make install

Install libpri

tar xzvf libpri-1.4.5.tar.gz
cd libpri-1.4.5
make
make install
cd ..Install asterisk
tar xzvf asterisk-1.4.21.1.tar.gz
cd asterisk-1.4.21.1
./configure
make
make install
make samples
make config

Continue install following normal configuration guidelines for the fonebridge2 and Asterisk;

http://support.red-fone.com

Безопасный метод авторизации на PHP

Давайте посмотрим вокруг: форумы, интернет магазины, гостевые книги и т.д. используют регистрацию и последующую авторизацию пользователей. Можно даже сказать, что это почти необходимая функция каждого сайта (только если это не домашняя страничка Васи Пупкина или не визитная карточка, какой-нибудь небольшой компании). Сегодня я хочу поделиться со всеми новичками информацией, о том, как лучше это все реализовать.

1. Модель (клиент) 
Регистрация
— логин (a-z0-9)
— пароль
Вход
— логин
— пароль
Cookie
— уникальный идентификатор юзера
— хэш
Модель (сервер) MySQL
Таблица users
user_id (int(11))
user_login (Varchar(30))
user_password (varchar(32))
user_hash (varchar(32))
user_ip (int(10)) по умолчанию 0При регистрации в базу данных записываеться логин пользователя и пароль(в двойном md5 шифровании)

При авторизация, сравниваеться логин и пароль, если они верны, то генерируеться случайная строка, которая хешируеться и добавляеться в БД в строку user_hash. Также записываеться IP адрес пользователя(но это у нас будет опциональным, так как кто-то сидит через Proxy, а у кого-то IP динамический… тут уже пользователь сам будет выбирать безопасность или удобство). В куки пользователя мы записываем его уникальный индетификатор и сгенерированный hash.

Почему надо хранить в куках хеш случайно сгенерированной строки, а не хеш пароля?
1. Из-за невнимательности программиста, во всей системе могут быть дырки, воспользовавшийсь этими дырками, злоумышленик может вытащить хеш пароля из БД и подставить его в свои куки, тем самым получить доступ к закрытым данным. В нашем же случае, двойной хеш пароля не чем не сможет помочь хакеру, так как расшифровать он его не сможет(теоретически это возможно, но на это он потратит не один месяц, а может быть и год) а воспользоваться этим хешем ему негде, ведь у нас при авторизации свой уникальный хеш прикрепленный к IP пользователя.
2. Если злоумышленик вытащит трояном у пользователя уникальный хеш, воспользовать им он также не сможет(разве если только, пользователь решил принебречь своей безопастностью и выключил привязку к IP при авторизации).

2. Практика
--
— Структура таблицы `users`

CREATE TABLE `users` (
`user_id` int(11) unsigned NOT NULL auto_increment,
`user_login` varchar(30) NOT NULL,
`user_password` varchar(32) NOT NULL,
`user_hash` varchar(32) NOT NULL,
`user_ip` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;

register.php 
<?
// Страница регситрации нового пользователя

# Соединямся с БД
mysql_connect(«localhost»«myhost»«myhost»);
mysql_select_db(«testtable»);

if(isset($_POST[‘submit’]))
{
$err = array();

# проверям логин
if(!preg_match(«/^[a-zA-Z0-9]+$/»,$_POST[‘login’]))
{
$err[] = «Логин может состоять только из букв английского алфавита и цифр»;
}

if(strlen($_POST[‘login’]) < or strlen($_POST[‘login’]) > 30)
{
$err[] = «Логин должен быть не меньше 3-х символов и не больше 30»;
}

# проверяем, не сущестует ли пользователя с таким именем
$query mysql_query(«SELECT COUNT(user_id) FROM users WHERE user_login='».mysql_real_escape_string($_POST[‘login’]).«‘»);
if(
mysql_result($query0) > 0)
{
$err[] = «Пользователь с таким логином уже существует в базе данных»;
}

# Если нет ошибок, то добавляем в БД нового пользователя
if(count($err) == 0)
{

$login $_POST[‘login’];

# Убераем лишние пробелы и делаем двойное шифрование
$password md5(md5(trim($_POST[‘password’])));

mysql_query(«INSERT INTO users SET user_login='».$login.«‘, user_password='».$password.«‘»);
header(«Location: login.php»); exit();
}
else
{
print 
«<b>При регистрации произошли следующие ошибки:</b><br>»;
foreach(
$err AS $error)
{
print 
$error.«<br>»;
}
}
}
?>

<form method=»POST»>
Логин <input name=»login» type=»text»><br>
Пароль <input name=»password» type=»password»><br>
<input name=»submit» type=»submit» value=»Зарегистрироваться»>
</form>

login.php

<?
// Страница авторизации

# Функция для генерации случайной строки
function generateCode($length=6) {
$chars «abcdefghijklmnopqrstuvwxyzABCDEFGHI JKLMNOPRQSTUVWXYZ0123456789»;
$code «»;
$clen strlen($chars) — 1;  
while (strlen($code) < $length) {
$code .= $chars[mt_rand(0,$clen)];  
}
return 
$code;
}

# Соединямся с БД
mysql_connect(«localhost»«myhost»«myhost»);
mysql_select_db(«testtable»);

if(isset($_POST[‘submit’]))
{
# Вытаскиваем из БД запись, у которой логин равняеться введенному
$query mysql_query(«SELECT user_id, user_password FROM users WHERE user_login='».mysql_real_escape_string($_POST[‘login’]).«‘ LIMIT 1»);
$data mysql_fetch_assoc($query);

# Соавниваем пароли
if($data[‘user_password’] === md5(md5($_POST[‘password’])))
{
# Генерируем случайное число и шифруем его
$hash md5(generateCode(10));

if(!@$_POST[‘not_attach_ip’])
{
# Если пользователя выбрал привязку к IP
# Переводим IP в строку
$insip «, user_ip=INET_ATON(‘».$_SERVER[‘REMOTE_ADDR’].«‘)»;
}

# Записываем в БД новый хеш авторизации и IP
mysql_query(«UPDATE users SET user_hash='».$hash.«‘ «.$insip.» WHERE user_id='».$data[‘user_id’].«‘»);

# Ставим куки
setcookie(«id»$data[‘user_id’], time()+60*60*24*30);
setcookie(«hash»$hashtime()+60*60*24*30);

# Переадресовываем браузер на страницу проверки нашего скрипта
header(«Location: check.php»); exit();
}
else
{
print 
«Вы ввели неправильный логин/пароль»;
}
}
?>
<form method=»POST»>
Логин <input name=»login» type=»text»><br>
Пароль <input name=»password» type=»password»><br>
Не прикреплять к IP(не безопасно) <input type=»checkbox» name=»not_attach_ip»><br>
<input name=»submit» type=»submit» value=»Войти»>
</form>

check.php

<?
// Скрипт проверки

# Соединямся с БД
mysql_connect(«localhost»«myhost»«myhost»);
mysql_select_db(«testtable»);

if (isset($_COOKIE[‘id’]) and isset($_COOKIE[‘hash’]))
{
$query mysql_query(«SELECT *,INET_NTOA(user_ip) FROM users WHERE user_id = ‘».intval($_COOKIE[‘id’]).«‘ LIMIT 1»);
$userdata mysql_fetch_assoc($query);

if(($userdata[‘user_hash’] !== $_COOKIE[‘hash’]) or ($userdata[‘user_id’] !== $_COOKIE[‘id’])
or ((
$userdata[‘user_ip’] !== $_SERVER[‘REMOTE_ADDR’])  and ($userdata[‘user_ip’] !== «0»)))
{
setcookie(«id»«»time() — 3600*24*30*12«/»);
setcookie(«hash»«»time() — 3600*24*30*12«/»);
print 
«Хм, что-то не получилось»;
}
else
{
print 
«Привет, «.$userdata[‘user_login’].«. Всё работает!»;
}
}
else
{
print 
«Включите куки»;
}
?>

Для защиты формы логина от перебора, можно использовать капчу.

Хочу отметить, что здесь я рассматривал авторизацию основоную на cookies, не стоит в комментариях кричать, что сессии лучше/удобнее и т.д. Спасибо.

Примечания:
1. mysql_select_db(«testtable»); // нелогичное название базы, testdb лучше
2. Нужно использовать mysql_real_escape_string()
3. Убирать лишние пробелы нет смысла, так как их не пропустит вот эта строка:
if(!preg_match(«/^[a-zA-Z0-9]+$/»,$_POST[‘login’]))

sipp

sipp – мощная утилита для генерации нагрузки на SIP оборудование. Обычно sipp используется для проверки отказоустойчивости систем IP-телефонии, выявления максимально-допустимой нагрузки или ddos-а конкурентов 🙂 Сценарий сессии в sipp описывается в XML файле. Можно воспользоваться одним из множества сценариев распространяемых в комплекте с sipp или создать свой.

Кроме тестирования сигнализации (SIP) sipp способен тестировать и медиа нагрузку. Для этого существуют два модуля: PCAP play и RTP echo. PCAP play – проигрывает заранее записанный сетевым анализатором (например wireshark) медиа файл. RTP echo – позволяет sipp отсылать обратно все полученные RTP потоки.

Пример использования sipp

 sipp 10.10.10.1 -s 12345 -i 10.10.10.2 -d 2h -l 60 -aa -mi 10.10.10.2 -rtp_echo -nd -r 10

10.10.10.1 – IP адрес SIP сервера, на который следует слать запросы.

-s 12345 – Указывает номер который будет вызван. Может быть числом или текстом. Значение по умолчанию – service

-i 10.10.10.2 – Локальный IP адрес. Этот адрес будет использован в SIP сообщениях в качестве адреса источника сообщений. По умолчанию используется адрес 127.0.0.1.

-d 2h – Устанавливает длительность звонков. В данном случае звонки будут длиться 2 часа. Длительность по умолчанию – 1 секунда.

-l 60 – Ограничивает максимальное количество одновременных звонков – 60.

-aa – Включает автоматические ответы 200 OK на сообщения INFO, UPDATE и NOTIFY.

-mi 10.10.10.2 – Устанавливает локальный IP для RTP.

-rtp_echo – Включает режим RTP эха. Все RTP пакеты полученные от удалённой стороны – отправляются обратно.

-nd – Отключает стандартную обработку неожиданных ситуаций – sipp будет прерывать звонки в случае получения неправильных SIP сообщений.

-r 10 – Устанавливает максимальную «скорость звонков» (CPS) в данном случае – не более 10 звонков в секунду.

Максимальной скоростью вызовов можно управлять во время работы sipp с помощью клавиш «+» и «-» – повышая и понижая её соответственно. Вообще, опустив параметры -aa -mi 10.10.10.2 -rtp_echo -nd – мы получаем отличное средство для тестирования отказоустойчивости и максимального CPS у SIP proxy.

Настройка Asterisk

Для того, что бы Asterisk принимал звонки от sipp, необходимо создать в SIP.conf специальный SIP-peer с именем sipp. К сожалению, заставить sipp совершать вызовы от имени существующего пользователя – нельзя. В стандартных сценариях sipp всегда представляется как sipp. Добавляем в SIP.conf запись:

 [sipp]
 type=friend
 context=in
 username=sipp
 host=10.10.10.2
 dtmfmode=rfc2833
 disallow=all
 allow=ulaw,alaw
 insecure=port,invite

Важными моментом, является наличие кодека ulaw в списке разрешенных т.к. именно его анонсирует sipp. Если 711u не будет в списке разрешённых кодеков, то Asterisk отклонит вызов от sipp. Вторым важным моментом, является строка insecure=port,invite. Данная строка заставляет Asterisk авторизовать sipp не по паролю, а по IP адресу указанному в поле host. Кроме записи в SIP.conf, можно создать специальный контекст в extensions.conf для обработки тестовых звонков от sipp.

Следующий пример принимает звонки на «номер» service – именно этот идентификатор используется по умолчанию:

 [in]
 exten => service,1,MusicOnHold()

Вот и всё. Успехов в стресс тестах! 🙂

P.S. Документация по sipp — http://sipp.sourceforge.net/doc3.0/reference.html

GRUB 2 — ошибка 15

Изредка, особенно при невнимательной настройке загрузчика grub2 возникает ситуация, при которой система полностью отказывается грузиться, а на экране консоли возникает ошибка — “Error 15: File not found!”. Для решения проблемы необходимо внести изменения в файл /boot/grub/menu.lst, указав правильный раздел для загрузки — раздел root.

С начала загружаемся с Live CD и открываем терминал.

Проверяем, какие разделы доступны в системе:

$ sudo fdisk -l | grep -i linux

Обычно это раздел системы и swap-раздел. Нас интересует раздел, содержащий /root.

/dev/hda5  1276  1397  979902    82  Linux swap / Solaris
/dev/hda6  1398  2550  9261441   83  Linux

/dev/hda6 — в нашем примере это раздел root. /dev/hda6 прописывается в grub, как (hd0,5). К примеру, если ваша система находится в /dev/hda1, то при загрузке нужно прописывать — (hd0,0). В grub прописывается значение на единицу меньшее, чем указано в разделе.

Откройте файл menu.lst и проверьте, что /dev/hda6 и (hd0,5) соответствуют разделу root, и никаких лишних разделов не указано. Это основная причина появления ошибки 15. В нашем примере root-раздел должен соответствовать разделу /dev/hda6, ниже указан пример файла /boot/grub/menu.lst:

title       Debian GNU/Linux, kernel 2.6.26-2-686
root        (hd0,5)
kernel      /boot/vmlinuz-2.6.26-2-686 root=/dev/hda6 ro
initrd      /boot/initrd.img-2.6.26-2-686
title       Debian GNU/Linux, kernel 2.6.26-2-686 (single-user mode)
root        (hd0,5)
kernel      /boot/vmlinuz-2.6.26-2-686 root=/dev/hda6 ro single
initrd      /boot/initrd.img-2.6.26-2-686

Далее желательно проверить файл /etc/fstab на соответствие разделов и типов файловых систем:

# /etc/fstab: static file system information.
#
# <file system> <mount point>  <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults          0     0
/dev/hda6       /               ext3    errors=remount-ro 0     1
/dev/hda5       none            swap    sw                0     0
/dev/hdc        /media/cdrom0   udf,iso9660 user,noauto   0     0

После перезагрузки, система должна нормально загрузиться.

Переустановка загрузчика

После загрузки LiveCD, открываем терминал и монтируем разделы системы:

Предварительно запускаем fdisk для того, чтобы удостовериться в правильности указания корневого раздела.

# fdisk -l

Монтирование обычных систем:

# mount /dev/sda2 /mnt/

Если /boot примонтирован отдельно:

# mount /dev/sda1 /mnt/boot

Монтирование специальных систем:

# mount --bind /dev /mnt/dev
# mount --bind /dev/pts /mnt/dev/pts
# mount --bind /proc /mnt/proc
# mount --bind /sys /mnt/sys

Заходим в chroot-систему:

# chroot /mnt

Если отсутствует файл /boot/grub/grub.cfg, или есть проблемы с настройкой:

# update-grub

Переустанавливаем GRUB2 :

# grub-install /dev/sda

(Внимание! Номер после названия раздела не пишется!)

Проверяем правильность настроек:

# grub-install --recheck /dev/sda

Выходим из chroot-системы:

# exit

# umount /mnt/sys
# umount /mnt/proc
# umount /mnt/dev/pts
# umount /mnt/dev
# umount /mnt/boot
# umount /mnt

# reboot

После перезагрузки всё должно заработать! 🙂