Показаны сообщения с ярлыком Linux. Показать все сообщения
Показаны сообщения с ярлыком Linux. Показать все сообщения

вторник, 16 сентября 2014 г.

Использование putty и ssh ключей в Windows

Скачиваем архив putty отсюда putty.zip
1. Распаковываем и запускаем ssh-keygen

Выбираем ключ ssh-rsa и длину 2048 бит. Жмем «Generate».


Ключ готов, заполняем кодовую фразу и комментарий к нему. Сохраняем приватный ключ как mykey.ppk и публичный как id_rsa.pub

2. Далее необходимо скопировать наш публичный ключ на сервер. Для этого запускаем psftp.
psftp: no hostname specified; use «open host.name» to connect
psftp> open myserver
The server's host key is not cached in the registry. You
have no guarantee that the server is the computer you
think it is.
The server's rsa2 key fingerprint is:
ssh-rsa 2048 XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
If you trust this host, enter «y» to add the key to
PuTTY's cache and carry on connecting.
If you want to carry on connecting just once, without
adding the key to the cache, enter «n».
If you do not trust this host, press Return to abandon the
connection.
Store key in cache? (y/n) y
login as: root
root@myserver's password:
Remote working directory is /root
psftp>put id_rsa.pub /tmp/id_rsa.pub
local:id_rsa.pub => remote:/tmp/id_rsa.pub
psftp>


3. Ключ скопировался, теперь нужно добавить его в /root/.ssh/authorized_keys
Для этого логинимся еще раз по паролю, через putty и выполняем
ssh-keygen -i -f /tmp/id_rsa.pub >> /root/.ssh/authorized_keys

Теперь осталось добавить наш ключ в ssh-agent'a. После запуска он сидит в трее, чтобы добавить ключ кликаем правой кнопкой на «Add Key»


Вводим кодовую фразу:


Теперь логинимся в putty:
login as: root
Authenticating with public key "rsa-key-20080908" from agent


Практически все, чтобы устранить проблемы с кодировками, с кривым отображением mc в путти, исправляем локаль в настроках:

четверг, 21 ноября 2013 г.

Организация приема SNMP trap’ов и их отправки на коммутаторах DLink

В рамках поставленной задачи (узнавать о появлении новых MAC-адресов на портах
коммутаторов DLink) понадобилось организовать настройку SNMP-trap'ов на
коммутационном оборудовании с последующим приемом их на сервере и дальнейшей
обработкой в зависимости от пришедшего события.

Для начала надо установить и настроить демон, который будет принимать трапы от
оборудования и при нужном MIB вызывать наш обработчик. Установка net-snmp -
тема отдельная, выполняется из пактов или портов, и особых трудностей не вызывает.

Собственно приемом трапов занимается snmptrapd. Для обработки заданного трапа
пишем в snmptrapd.conf:

    traphandle 1.3.6.1.4.1.171.11.63.6.2.20.0.2 /scripts/trap.php

Теперь после рестарта демона snmptrapd, он начнет принимать приходящие трапы и
при наличии трапа с заданным MIB (1.3.6.1.4.1.171.11.63.6.2.20.0.2 - в нашем
случае), будет вызывать наш обработчик, который уже будет совершать необходимые
нам действия.
Обработчик SNMP-трапов

Принимать SNMP trap-ы на самом деле достаточно просто. Вот пример простого
обработчика SNMP-трапов на PHP:

      #!/usr/bin/php -q
      <?php
      $message = "";
      $fd = fopen("php://stdin", "r");
      while (!feof($fd)) $message .= fread($fd, 1024);
      ?>

Все что делает этот скрипт - получает в переменную $message текст, который
передается демоном snmptrapd. Текст приходит разделенный знаками конца строки.
Первая строка - это всегда имя хоста (который прислал трап), вторая - IP-адрес
этого хоста, третья - его uptime, четвертая - MIB пришедшего трапа. Остальные
строки в сообщении - это детальная информация касательно пришедшего трапа, если
она предусмотрена.


Для отправки Trap-ов на коммутаторе исполняем такие команды:

    create snmp community trap_com view CommunityView read_only
    create snmp host x.x.x.x v2c trap_com

Где х.х.х.х - IP-адрес сервера, котоырй будет принимать SNMP traps.

Далее надо включить опцию дабы коммутатор отсылал трап при появлении на порту
нового мака. Делается это через SNMP

    snmpset -v2c -c write_commenity switch_ip 1.3.6.1.4.1.171.11.63.6.2.1.2.19.0 i 3

Выключить эту опцию можно так

    snmpset -v2c -c write_commenity switch_ip 1.3.6.1.4.1.171.11.63.6.2.1.2.19.0 i 2

Узнать текущее состояние опции можно так

    snmpwalk -v2c -c read_commenity switch_ip 1.3.6.1.4.1.171.11.63.6.2.1.2.19


Вся информация справедлива для коммутаторов 3028. Для других моделей MIB-ы
могут сильно отличаться - к сожалению, DLink любит менять их от серии к серии.
Надо заметить, что опция отправки трапа при появлении нового мака на порту
доступна далеко не на всех моделях DLink-овых коммутаторов - например, 3010
такой возможности не поддерживает.

Tcpdump usage examples

In most cases you will need root permission to be able to capture packets on an interface. Using tcpdump (with root) to capture the packets and saving them to a file to analyze with Wireshark (using a regular account) is recommended over using Wireshark with a root account to capture packets on an "untrusted" interface. See the Wireshark security advisories for reasons why.
See the list of interfaces on which tcpdump can listen:
tcpdump -D
Listen on interface eth0:
tcpdump -i eth0
Listen on any available interface (cannot be done in promiscuous mode. Requires Linux kernel 2.2 or greater):
tcpdump -i any
Be verbose while capturing packets:
tcpdump -v
Be more verbose while capturing packets:
tcpdump -vv
Be very verbose while capturing packets:
tcpdump -vvv
Be less verbose (than the default) while capturing packets:
tcpdump -q
Limit the capture to 100 packets:
tcpdump -c 100
Record the packet capture to a file called capture.cap:
tcpdump -w capture.cap
Record the packet capture to a file called capture.cap but display on-screen how many packets have been captured in real-time:
tcpdump -v -w capture.cap
Display the packets of a file called capture.cap:
tcpdump -r capture.cap
Display the packets using maximum detail of a file called capture.cap:
tcpdump -vvv -r capture.cap
Display IP addresses and port numbers instead of domain and service names when capturing packets:
tcpdump -n
Capture any packets where the destination host is 192.168.1.1. Display IP addresses and port numbers:
tcpdump -n dst host 192.168.1.1
Capture any packets where the source host is 192.168.1.1. Display IP addresses and port numbers:
tcpdump -n src host 192.168.1.1
Capture any packets where the source or destination host is 192.168.1.1. Display IP addresses and port numbers:
tcpdump -n host 192.168.1.1
Capture any packets where the destination network is 192.168.1.0/24. Display IP addresses and port numbers:
tcpdump -n dst net 192.168.1.0/24
Capture any packets where the source network is 192.168.1.0/24. Display IP addresses and port numbers:
tcpdump -n src net 192.168.1.0/24
Capture any packets where the source or destination network is 192.168.1.0/24. Display IP addresses and port numbers:
tcpdump -n net 192.168.1.0/24
Capture any packets where the destination port is 23. Display IP addresses and port numbers:
tcpdump -n dst port 23
Capture any packets where the destination port is is between 1 and 1023 inclusive. Display IP addresses and port numbers:
tcpdump -n dst portrange 1-1023
Capture only TCP packets where the destination port is is between 1 and 1023 inclusive. Display IP addresses and port numbers:
tcpdump -n tcp dst portrange 1-1023
Capture only UDP packets where the destination port is is between 1 and 1023 inclusive. Display IP addresses and port numbers:
tcpdump -n udp dst portrange 1-1023
Capture any packets with destination IP 192.168.1.1 and destination port 23. Display IP addresses and port numbers:
tcpdump -n "dst host 192.168.1.1 and dst port 23"
Capture any packets with destination IP 192.168.1.1 and destination port 80 or 443. Display IP addresses and port numbers:
tcpdump -n "dst host 192.168.1.1 and (dst port 80 or dst port 443)"
Capture any ICMP packets:
tcpdump -v icmp
Capture any ARP packets:
tcpdump -v arp
Capture either ICMP or ARP packets:
tcpdump -v "icmp or arp"
Capture any packets that are broadcast or multicast:
tcpdump -n "broadcast or multicast"
Capture 500 bytes of data for each packet rather than the default of 68 bytes:
tcpdump -s 500
Capture all bytes of data within the packet:
tcpdump -s 0

Debian, exim4. Настраиваем SMTP сервер для нашего веб-сервера

данной статье я рассмотрю один из самых быстрых способов настройки smtp-демона для нашего вебсервера. Если вам нужен сервер, который ещё и должен принимать почту — проходите мимо. Эта статья подойдёт для тех, кто принимает почту гуглом или яндексом (на своём домене, само собой), но не хочет дергать их SMTP серверы, чтобы слать письма.
Внимание! Этот мануал описывает то, как настроить SMTP сервер (сервер отправки писем), отправить письмо через который можно только с того же сервера (то есть с localhost). При этом не будет требоваться никакой авторизации для «доверенных» доменов! Будьте внимательны.
lamp-server:~# aptitude install exim4
lamp-server:~# dpkg-reconfigure exim4-config

Отвечаем на вопросы:
General type of mail configuration: internet site; mail is sent and received directly using SMTP
System mail name: желательно вписываем сюда обратную зону для вашего IP интерфейса eth0. Либо просто full hostname сервера (mail.debian.pro, например)
IP-addresses to listen on for incoming SMTP connections: 127.0.0.1 (нам же не нужен open relay?)
Other destinations for which mail is accepted: вписываем через пробел домены, от имени которых нам нужно отправлять письма с этого сервера.
Domains to relay mail for: если не знаете зачем оно, то оставляйте пустое поле
Machines to relay mail for: аналогично, если не знаем — оставляем пустым
Keep number of DNS-queries minimal (Dial-on-Demand)? No
Delivery method for local mail: Maildir
Split configuration into small files? По желанию. Я ставлю No.
Ещё могут спросить, кому перенаправлять почту локального админа. Я пишу root и не парюсь.
Теперь вы можете отправлять письма при помощи апача (чуть позже опишу как настроить) или командой вида echo «Testing Exim» | mail -s Test vlad@debian.pro
Ну и да — не стоит спамить ;)
Так же не используйте этот метод для тех случаев, когда доступ к серверу по ssh (или даже по ftp в каталоги, доступные по http) имеют доступ люди, которые могут начать спамить.

вторник, 19 ноября 2013 г.

Централизованный сбор, хранение и просмотр Syslog в Debian Linux

В качестве стандартного syslog-сервиса в Debian используется rsyslog. Дальше рассказывается, как отправлять копии журналов на сервер, сохранять их в SQL-базе и просматривать через удобный Веб-интерфейс.



Отправка с клиентских машин на центральный сервер


Создаём файл /etc/rsyslog.d/send2server.conf со строкой:
*.* @hostname-или-fqdn-или-ip-адрес-сервера
Например:
*.* @netlog.lan
Чтобы не собирать отладочный мусор, можно заменить "*.*" на "*.notice" или "*.warning".
Перечитываем настройки: /etc/init.d/rsyslog restart

Протокол доставки


  • по умолчанию используется udp/514
  • если указать "@@" вместо "@", то вместо стандартного UDP станет использоваться TCP (нестандартное расширение!).
  • если нужна 100% надёжность доставки, вместо udp/tcp следует использовать модули omrelp на клиенте и imrelp на сервере.


Приём на сервере


В /etc/rsyslog.conf должны быть раскомментированы строки:
$ModLoad imudp
$UDPServerRun 514

$ModLoad imtcp
$InputTCPServerRun 514

Перечитываем настройки: /etc/init.d/rsyslog restart

Хранение в MySQL


  • apt-get install rsyslog-mysql
  • аккуратно отвечаем на все задаваемые вопросы,
  • если не считать паролей, достаточно подтверждать предлагаемые значения,
  • настройки сохраняются в /etc/rsyslog.d/mysql.conf


Просмотр в LogAnalyzer


  • Страница скачивания: loganalyzer.adiscon.com/downloads (в пакетах Debian отсутствует)
  • Установка зависимостей: apt-get install libapache2-mod-php5
  • Из архива с исходными текстами внутрь /var/www требуется скопировать папку ./src и переименовать её в «loganalyzer».
  • Рекомендуемое исправление для ./include/functions_common.php, чтобы убрать предупреждения из логов Apache:
    --- loganalyzer/include/functions_common.php.orig 2011-11-14 14:32:32.000000000 +0200
    +++ loganalyzer/include/functions_common.php 2011-11-16 02:05:58.982834986 +0200
    @@ -1163 +1163,2 @@
    - $content['EXTRA_METATAGS'] .= '/>';
    + if (array_key_exists($content['HeaderDefaultEncoding']))
    + $content['EXTRA_METATAGS'] .= '/>';
  • Создание пустого файла конфигурации, будет заполнен инсталлятором:
    touch config.php
    chmod 666 config.php


Подготовка SQL-баз для LogAnalyzer



SQL-таблицу Syslog.SystemEvents стандартного формата LogAnalyzer автоматически дополняет собственными столбцами, но для этого потребуется давать ему слишком большие привилегии. Чтобы разрешить ему только SELECT, создадим столбцы вручную:
ALTER TABLE `SystemEvents` ADD `processid` varchar(60) NOT NULL DEFAULT '';
ALTER TABLE `SystemEvents` ADD `checksum` int(11) UNSIGNED NOT NULL DEFAULT '0';



Настройка LogAnalyzer


  • Открываем netlog.lan/loganalyzer/install.php и проходим все шаги.
  • Формат syslog-базы = MonitorWare.
  • Имя базы Syslog и таблицы SystemEvents являются регистрозависимыми.

После завершения установки:
chmod 644 config.php
rm install.php

Первый пользователь имеет права администратора.
Рекомендуется зайти в «Admin Center / Users» и зарегистрировать гостя с флагом «ReadOnly User».

пятница, 8 ноября 2013 г.

Восстановление пароля root

Для смены пароля root, не зная его, делаем следующее:
Получив физический доступ к компьютеру, нажимаем Ctrl + Alt + Del (возможно дважды) - система уходит в перезагрузку.

1 вариант)
  • Попробовать загрузиться в однопользовательском режиме (single mode). Для этого в меню загрузчика (Grub или Lilo - всё равно) отредактировать вариант, начинающийся со слова kernel - добавить в конец 1 или слово single, заменив также режим монтирования диска (если указан) с ro на rw (чтобы можно было сохранить новый пароль).
  • Если при загрузке запрашивает пароль root'a, то нужно перезагрузиться и изменить команду загрузчика по другому, добавив вместо single параметр init=/bin/bash, заменив также режим монтирования диска (если указан) с ro на rw

2 вариант)
  • Входим в интерактивный режим загрузчика (см выше) и указываем ему опцию:
linux init=/bin/bash
  • После загрузки оболочки необходимо перемонтировать корневой раздел в режим RW:
mount -o remount,rw /
  • Меняем пароль:
passwd
  • Сбросим данные из кеша на диск. Для этого достаточно просто перемонтировать корневой раздел обратно в режим только для чтения:
mount -o remount,ro /
  • Теперь можно перезагрузить компьютер в обычный режим. Не забывайте, что скрипты инициализации для нашего сеанса /bash не работают.

понедельник, 4 ноября 2013 г.

Настройка VLAN в Linux

1. Модуль ядра для работы с VLAN
Для работы в Linux с VLAN необходимо загрузить модуль ядра: 8021q
# modprobe 8021q
Для этого, ядро должно быть сконфигурировано с поддержкой стандарта IEEE 802.1Q (включается при конфигурировании ядра: в kernel/net/8021q включить 802.1Q VLAN Support или в Network options / 802.1Q VLAN Support). Во многих современных дистрибутивах Linux (Debian, CentOS, openSUSE и т.д) такая поддержка уже включена в ядре и модуль можно загружать.

 2. Использование утилиты vconfig для настройки VLAN
Что бы настроить на интерфейсе необходимые VLAN, можно воспользоваться утилитой vconfig она находится в пакете vlan либо в пакете vconfig, в зависимости от дистрибутива Linux.
vconfig имеет следующие опции:
 add [interface-name] [vlan_id] — добавить VLAN с номером vlan_id (от 0 до 4095) на интерфейсе interface-name
 rem [vlan-name] — удалить VLAN, именованый как vlan-name (имя vlan-name зависит от того, какой тип именования выбран см. ниже)
 set_flag [interface-name] [flag-num] [0 | 1] — указывает следует ли делать перестановку (reorder) заголовка Ethernet кадра. Если значение 1 — перестановка включена, и трафик в снифферах (tcpdump и т.д)  будет выглядеть как трафик обычного сетевого устройства без тегов VLAN. Если значение 0 - перестановка отключена, и трафик видится с тегами VLAN. Значение по умолчанию: 0.
 set_egress_map [vlan-name] [skb_priority] [vlan_qos] - указывает, что для исходящих пакетов через vlan-name с определённым приоритетом буфера сокетов (sk_buff) skb_priority, должна выполняться маркировка приоритета VLAN в значение vlan_qos (3-х битное значение в VLAN заголовке). По умолчанию значение приоритета VLAN vlan_qos: 0.
 set_ingress_map [vlan-name] [skb_priority] [vlan_qos] - указывает, что входящие пакеты через vlan-name с определённым приоритетом VLAN vlan_qos, должны помещаться в очередь буфера сокетов с приоритетом  skb_priority. Значение по умолчанию приоритета очереди буфера сокетов skb_priority: 0.
 set_name_type [name-type] - задаёт тип именования VLAN интерфейсов, при их добавлении. Возможные значения name-type:
    VLAN_PLUS_VID — имя vlan-name будет вида  vlan0020
    VLAN_PLUS_VID_NO_PAD - имя vlan-name будет вида vlan20
    DEV_PLUS_VID - имя vlan-name будет вида eth0.0020
    DEV_PLUS_VID_NO_PAD - имя vlan-name будет вида eth0.20
 Пример добавление VLAN 100 и VLAN 200 на интерфейсе eth0:
#
# modprobe 8021q
# vconfig add eth0 100
    Added VLAN with VID == 100 to IF -:eth0:-
# vconfig add eth0 200
    Added VLAN with VID == 200 to IF -:eth0:-
#
Посмотреть существующие VLAN можно в файле "/proc/net/vlan/config"
# cat /proc/net/vlan/config
   VLAN Dev name | VLAN ID
   Name-Type: VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD
   eth0.100 | 100 | eth0
   eth0.200 | 200 | eth0
#
Задать IP адрес на  VLAN интерфейсах и включить их, можно командой ifconfig:
#
# ifconfig eth0.100 192.168.100.1 netmask 255.255.255.0 up
# ifconfig eth0.200 192.168.200.1 netmask 255.255.255.0 up
#

 3. Сохранение конфигурации VLAN интерфейсов при перезагрузке системы 
Создание VLAN через vconfig и их настройка через ifconfig позволяет сохранить настройки до перезагрузки системы, что бы настройка применялась при загрузке операционной системы, необходимо создать специальные файлы конфигурации для VLAN интерфейсов.
Конфигурация VLAN интерфейсов зависит от того, какие скрипты инициализации сети используется в дистрибутиве Linux (initscripts, sysconfig или interfaces). Что бы узнать, какая система инициализации сети у Вас, следует:
  — Выполнить команду "rpm -qf /sbin/ifup" на экране отобразится название пакета, название начинается на "initscripts" либо на "sysconfig". Этот пакет и предоставляет скрипты инициализации сети.
  - Если в директории "/etc/network" присутствует файл "interfaces", то в Вашей системе используется interfaces для инициализации сети
 Рассмотрим примеры настройки для всех трёх типов инициализации сети.

Настройка VLAN в Linux с использованием initscripts
Примером дистрибутивов Linux, использующих для настройки сети initscripts, являются RedHat, CentOS, Fedora и пр.
Файлы описания (конфигурации) для VLAN интерфейсов следует создавать в "/etc/sysconfig/network-scripts/". Имя файла должно быть вида: ifcfg-ethX.Y, либо вида ifcfg-vlanY (тогда в самом файле ifcfg-vlanY необходимо задать соответствующее значение параметра VLAN_NAME_TYPE ), где X — номер сетевого интерфейса, Y — идентификатор (номер) VLAN (VID)
Для примера, на интерфейсе eth0 добавим два VLAN 100 и 200. Что бы рассмотреть пример обоих файлов, создадим в "/etc/sysconfig/network-scripts/" один файл ifcfg-eth0.100 (описание для VLAN 100) и второй ifcfg-vlan200 (описание для VLAN 200).
 Содержание файла "ifcfg-eth0.100":
VLAN=yes
DEVICE=eth0.100
BOOTPROTO=static
ONBOOT=yes
TYPE=Ethernet
IPADDR=192.168.100.1
NETMASK=255.255.255.0
 Содержание файла "ifcfg-vlan200":
VLAN=yes
VLAN_NAME_TYPE=VLAN_PLUS_VID_NO_PAD
DEVICE=vlan200
PHYSDEV=eth0
BOOTPROTO=static
ONBOOT=yes
TYPE=Ethernet
IPADDR=192.168.200.1
С такими файлами, после перезагрузки системы, на интерфейсе eth0 будут присутствовать два VLAN 100 и 200. Модуль ядра 8021q, при этом, загрузился автоматически.
Проверка:
#
# lsmod | grep 8021q
    8021q 20355 0
    garp 5703 1 8021q
#
# cat /proc/net/vlan/config
     VLAN Dev name | VLAN ID
     Name-Type: VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD
     eth0.100 | 100 | eth0
     vlan200  | 200 | eth0
#
#
# ifconfig eth0.100
   eth0.100 Link encap:Ethernet HWaddr 00:0C:29:64:7F:04
            inet addr:192.168.100.1 Bcast:192.168.100.255 Mask:255.255.255.0
            inet6 addr: fe80::20c:29ff:fe64:7f04/64 Scope:Link
            UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
            RX packets:0 errors:0 dropped:0 overruns:0 frame:0
            TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
            collisions:0 txqueuelen:0
            RX bytes:0 (0.0 b) TX bytes:768 (768.0 b)

# ifconfig vlan200
   vlan200 Link encap:Ethernet HWaddr 00:0C:29:64:7F:04
           inet addr:192.168.200.1 Bcast:192.168.200.255 Mask:255.255.255.0
           inet6 addr: fe80::20c:29ff:fe64:7f04/64 Scope:Link
           UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
           RX packets:0 errors:0 dropped:0 overruns:0 frame:0
           TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 txqueuelen:0
           RX bytes:0 (0.0 b) TX bytes:768 (768.0 b)
#
 Видно, что модуль ядра 8021q загружен, созданы VLAN 100 и 200, подняты соответствующие им интерфейсы с заданными IP адресами. (Значение RX равно 0, так как на интерфейс ещё не подан транк со стороны коммутатора).

Настройка VLAN в Linux с использованием sysconfig
Одним из примеров дистрибутива Linux, использующего для настройки сети sysconfig, является SuSE Linux.
Нужно создать в директории "/etc/sysconfig/network/" файлы для конфигурации необходимых VLAN. Имя файла имеет вид: ifcfg-vlanX, где X — номер VLAN (VID)
В содержание файла, помимо настроек сети (IP адрес, маска сети и т.д.), необходимо добавить параметры: ETHERDEVICE и VLAN

Пример создания двух VLAN 100 и 200 на интерфейсе eth0:
Создаем в "/etc/sysconfig/network/" два файла, первый с именем  ifcfg-vlan100 и второй с именем ifcfg-vlan200
Содержание файла "ifcfg-vlan100":
ETHERDEVICE="eth0"
IPADDR="192.168.100.2"
NETMASK="255.255.255.0"
NETWORK="192.168.100.0"
BROADCAST="192.168.100.255"
STARTMODE="onboot"
VLAN="YES"
Содержание файла "ifcfg-vlan200":
ETHERDEVICE="eth0"
IPADDR="192.168.200.2"
NETMASK="255.255.255.0"
NETWORK="192.168.200.0"
BROADCAST="192.168.200.255"
STARTMODE="onboot"
VLAN="YES"
После перезагрузки системы или выполнения команды "/etc/init.d/network restart", на интерфейсе eth0 появятся два VLAN 100 и 200, а VLAN интерфейсы vlan100 и vlan200 будут подняты с заданной настройкой IP адреса и маской сети. Так же модуль ядра 8021q будет загружен автоматически.
Проверить результат можно таким же способом, как описано в случае с initscripts ("lsmod | grep 8021q", "cat /proc/net/vlan/config","ifconfig")

Настройка VLAN в Linux с использованием interfaces (ifupdown)
Примером дистрибутивов Linux, использующих для настройки сети interfaces, являются Debian, Ubuntu и пр.
Настройка производится в файле: "/etc/network/interfaces", в который необходимо добавить дополнительные строки, описывающие VLAN интерфейсы и их настройку.

Пример создания двух vlan 100 и 200 на интерфейсе eth0:
Добавить в файл "/etc/network/interfaces" строки:
auto eth0.100
iface eth0.100 inet static
   address 192.168.100.3
   netmask 255.255.255.0
   vlan_raw_device eth0

auto eth0.200
iface eth0.200 inet static
   address 192.168.200.3
   netmask 255.255.255.0
   vlan_raw_device eth0

После перезагрузки, или после выполнения команд "# ifup eth0.100″ и "# ifup eth0.200″, на интерфейсе eth0 появятся два VLAN 100 и 200, интерфейсы eth0.100 и eth0.200 будут подняты с заданными сетевыми настройками. Так же модуль ядра 8021q будет автоматически загружен.
Проверить результат можно таким же способом, как описано в случае с initscripts ("lsmod | grep 8021q", "cat /proc/net/vlan/config","ifconfig")

понедельник, 28 октября 2013 г.

Конвертация flv to avi, swf to avi

Добрый день. Возникла необходимость сконвертировать видео flv в avi, для просмотра на IPad и Android устройствах. Наверное есть какие-то приложения для Android и IOS, которые позволяют смотреть flv, но приложений под IOS, которые просматривают swf точно нет, т.к. для проигрывания swf нужен Flash. От конвертации под Windows я сразу отказался, по трём причинам:
1.  Происхождение приложений. Скачивая приложения с непонятных сайтов и устанавливая их с правами администратора, можно получить очень "интересные" последствия. Наверное, я параноик, но устанавливать непонятные Win-приложения я не хочу.
2. Интерфейс у приложений, какой-то не очень для меня очевидный. Может быть я тупой или ленивый, но разбираться в невероятном количестве менюшек мне не хотелось.
3. В процессе конвертации видео на моём бюджетном ноутбуке, выяснилось что время, затрачиваемое на конвертацию, чуть ли не больше, чем время воспроизведения файла. Т.е. на конвертацию 20 часов видео потратиться более суток и если при этом что-то, программа  вернёт ошибку, то сколько то часов времени будет потеряно.

И тут мне в голову пришла совершенно очевидная мысль: не может быть, что бы в репозиториях для Debian не было средства для конвертации. Первая же ссылка в поиске привела меня на форум OpenNet . А дальше дело техники:
# apt-get install ffmpeg

Сам код для конвертации без потери качества, для тех кому день читать man :
ffmpeg -i src.flv -vcodec copy -acodec copy dst.avi

И маленький скриптик:

#!/bin/bash
for i in 1 2 3 4 5 6 7 8 9 10 11 12
do
        ffmpeg -i $i.flv -vcodec copy -acodec copy $i.avi &
done

exit 0


Кстати, очень важно наличие амперсанда & в конце команды :

ffmpeg -i $i.flv -vcodec copy -acodec copy $i.avi

Т.к. это позволяет запустить конвертацию в несколько "потоков" и отвязать выполнение скрипта от консоли в которой он запущен. Т.е. после запуска скрипта проверяем наличие ffmpeg
в top и можно закрывать консоль. На моём сервере с древним Xeon и 2 Гб оперативной памяти все процессы (12 шт.) ffmpeg "съели" 4% процессорного времени и всё видео (20 часов) сконвертировалось в течении 3-4 минут.

Желающие могут усовершенствовать скрипт использую BASH Guide .
Конвертация проходит без потери качества.
Удачи:)

четверг, 17 октября 2013 г.

Lighttpd + WebDAV


Ставим пакеты:

apt-get update
apt-get install -y lighttpd
apt-get install -y lighttpd-mod-webdav

Добавляем в конфиг файл
vi /etc/lighttpd/lighttpd.conf

$HTTP["url"] =~ "^/dav($|/)" {
webdav.activate = "enable" # allow module
webdav.is-readonly = "disable" # enable write
webdav.sqlite-db-name = "/var/run/lighttpd/lighttpd.webdav_lock.db" # access to locaks and metadata database
}

Около блока "server.modules" ищем строку "mod_webdav" и убираем знак диеза слева, если он установлен.

После этого нам требуется создать хотя бы одну папку с доступом по WebDAV. Корнем веб сервера устанавливается папка /var/www, если вас устраивает такое положение, можете её так и оставить, в противном случае можете изменить её местоположение в конфиг файле. После этого создаем папку для WebDAV доступа:
mkdir /var/www/dav
chown www-data:www-data /var/www/dav

Ну и напоследок применяем настройки:
/etc/init.d/lighttpd restart

После это можно каким-нить WebDAV клиентом (я использовал nd) попробовать поиграться с папкой http://ваш_сайт/dav

Я использовал версию (в случае же проблем, обновляемся на более новую):
lighttpd-1.4.13 (ssl) - a light and fast webserver
Build-Date: Apr 15 2008 08:23:10

Играемс:
nd -d http://домен.ru:81/dav/suxx.ics --- удаление файла
nd -p wammu.log http://домен.ru:81/dav/suxx.log -- загружаем файл
nd -m http://домен.ru:81/dav/suxx555.log http://домен.ru:81/dav/suxx.log -- перемещаем файл
nd -v http://домен.ru:81/dav/555suxx.log -- запрос свойств объекта
У меня было выдано:
Status: 0
Last-Modified:
Created:
Size:
Content-Type:
Resource-Type:

Зададим новое свойство:
nd -l http://домен.ru:81/dav/suxx555.log -- блокируем объект
Lock: token="opaquelocktoken:aebb8df4-3321-4604-a8aa-cf69429c2725",
scope="exclusive",
owner-href="",
timeout="Second-600"

nd -u -t opaquelocktoken:aebb8df4-3321-4604-a8aa-cf69429c2725 http://домен.ru:81/dav/suxx555.log -- разлочим объект посредством "ключа", выданного нам при блокировке
nd -k http://домен.ru:81/dav/folder1 -- создаем новую папку

А вот далее интереснее:
nd -e test=12345 http://домен.ru:81/dav/suxx555.log
nd -v http://домен.ru:81/dav/suxx555.log
Name: http://домен.ru:81/dav/suxx555.log
Status: 0
Last-Modified:
Created:
Size:
Content-Type:
Resource-Type:


Как видите, вновь заданное свойство не показывается (хотя в sqlite лайта базе данных оно имеется). Это баг nd / lighttpd или же я туплю ? Попробуем другой WebDAV клиент, пожалуй, это будет cadaver.
nrg@dell:~$ cadaver
dav:!> open http://домен.ru:81/dav
dav:/dav/> propset suxx555.log suxx 777
dav:/dav/> propget suxx555.log suxx
Fetching properties for `suxx555.log':
Value of suxx is: 777


Таки выходит, глюк nd. Ну вот и все, осталось только придумать, для чего использовать такой замечательный протокол :)

Установка net-snmp-utils в RHEL

Добрый день. Возникла необходимость установить на RedHat x86_64 snmpwalk. Естественно в репозитории rhel его нет. snmpwalk находится в пакете net-snmp-utils . Поискав решение в интернете я поключил несколько репозиториев EPEL, REMI, RPMforge .

Комманды для x86_64 (RHEL 6) :

cd /tmp
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY*
rpm --import http://dag.wieers.com/rpm/packages/RPM-GPG-KEY.dag.txt
wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
rpm -ivh rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
rpm --import https://fedoraproject.org/static/0608B895.txt
wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm
rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
yum install -y yum-priorities

Комманды для i386 (RHEL 6) :

cd /tmp
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY*
rpm --import http://dag.wieers.com/rpm/packages/RPM-GPG-KEY.dag.txt
wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.i686.rpm
rpm -ivh rpmforge-release-0.5.3-1.el6.rf.i686.rpm
rpm --import https://fedoraproject.org/static/0608B895.txt
wget http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm
rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
yum install -y yum-priorities
 
Включаем репозитории и выставляем приоритет: 
Во всех репозиториях выставляем enabled=1 и после этой строчки добавляем priority=10 .
vim /etc/yum.repos.d/remi.repo
 
[remi]
name=Les RPM de remi pour Enterprise Linux $releasever - $basearch
#baseurl=http://rpms.famillecollet.com/enterprise/$releasever/remi/$basearch/
mirrorlist=http://rpms.famillecollet.com/enterprise/$releasever/remi/mirror
enabled=1
priority=10
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi
failovermethod=priority
 
vim /etc/yum.repos.d/epel.repo
 
[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&amp;arch=$basearch
failovermethod=priority
enabled=1
priority=10
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
 
Но это не сработало. На http://mirror.centos.org/centos/5/os/x86_64/CentOS/ я нашёл 
нужные пакеты:
wget http://mirror.centos.org/centos/5/os/x86_64/CentOS/net-snmp-5.3.2.2-20.el5.x86_64.rpm
wget http://mirror.centos.org/centos/5/os/x86_64/CentOS/net-snmp-utils-5.3.2.2-20.el5.x86_64.rpm
wget http://mirror.centos.org/centos/5/os/x86_64/CentOS/net-snmp-libs-5.3.2.2-20.el5.i386.rpm
rpm -Uhv net-snmp-libs-5.3.2.2-20.el5.i386.rpm
rpm -Uhv net-snmp-5.3.2.2-20.el5.x86_64.rpm
rpm -Uhv net-snmp-utils-5.3.2.2-20.el5.x86_64.rpm

Теперь работает.

RPM

Простые манипуляции

Чтобы ... Нужно выполнить
Импортировать GPG ключ для проверки пакетов # rpm --import RPM-GPG-KEY
Посмотреть информацию о пакете, который лежит в текущем каталоге $ rpm -qip package-1.rpm
Посмотреть список файлов из неустановленного пакета $ rpm -qlp package-1.rpm
Посмотреть скрипты %pre- %post- install (uninstall) $ rpm -qp --scripts package-1.rpm
Посмотреть changelog пакета $ rpm -qp --changelog package-1.rpm
Установить пакет $ rpm -ivh package-1.rpm
Обновить или установить пакет $ rpm -Uvh package-1.rpm
Обновить пакет, если его предыдущая версия установлена в системе $ rpm -Fvh package-1.rpm
Узнать, какому пакету принадлежит данный файл $ rpm -qf /etc/sysctl.conf
Посмотреть информацию об уже установленном пакете $ rpm -qi initscripts
Посмотреть список всех установленных пакетов $ rpm -qa
Найти все пакеты, начинающиеся на gnome $ rpm -qa "gnome*"
Удалить пакет $ rpm -e package
Посмотреть даты инсталляции пакетов $ rpm -qa --last
Посмотреть зависимости необходимые пакету $ rpm -qR yum



Манипуляции посложнее

Использование ключа подсказки --aid

При инсталляции нового пакета иногда возникают ситуации, в которых требуется добавить еще один или несколько пакетов для удовлетворения зависимостей. К сожалению, по-умолчанию RPM не сообщает какой именно пакет нужен, сообщает только имя библиотеки и версию. Дело в том, что информация о все пакетах, входящих в официальный дистрибутив, содержится отдельно - в специальном пакете rpmdb-* (для версий дистрибутивов RedHat это будет rpmdb-redhat-<дата-релиза>, для CentOS - rpmdb-CentOS-<дата-релиза> и т.д.).
Например: rpmdb-CentOS-4.4-0.20060828
Т.е. необходимым условием является наличие этого пакета, проинсталлированного в системе.
Проверяем:
# rpm -ivh --aid samba-swat-3.0.9-1.3E.7.x86_64.rpm
error: open of /var/spool/up2date/samba-3.0.9-1.3E.7.x86_64.rpm failed: No such file or directory
error: Failed dependencies:
        samba = 0:3.0.9 is needed by samba-swat-3.0.9-1.3E.7
Здесь нам указали, что для инсталляции samba-swat потребуется обязательный пакет samba с версией 0:3.0.9
Обратите внимение на строчку "error: open of /var/spool/up2date/samba-3.0.9-1.3E.7.x86_64.rpm failed: No such file or directory". RPM сам попытался проинсталлировать пакет, но не нашел его в каталоге /var/spool/up2date. Если мы заглянем в конфигурационный файл /etc/rpm/macros.solve и исправим параметр %_solve_pkgsdir на местоположение всех пакетов дистрибутива, то после повторного выполнения команды, RPM найдет необходимый пакет и автоматически его проинсталлирует.
Например, все пакеты дистрибутива у нас живут в каталоге /opt/linux/redhat/as30u7/x86-64, который в свою очередь смонтирован по NFS с сервера. Тогда в файле /etc/rpm/macros.solve должно быть:
%_solve_pkgsdir /opt/linux/redhat/as30u7/x86-64
А вот результат выполнения команды:
# rpm -ivh --aid samba-swat-3.0.9-1.3E.7.x86_64.rpm
Preparing...                ########################################### [100%]
   1:samba                  ########################################### [ 50%]
   2:samba-swat             ########################################### [100%]


Чтобы добавить новые ключи, расширяющие возможности стандартного вывода:

$ cat >~/.popt 
rpm     alias --arch --qf '%{NAME}  %{VERSION}-%{RELEASE} %{ARCH}\n' \
        --POPTdesc=$\"list package name, version, release and arch\"
^D
Посмотреть оригинальные запросы можно в /usr/lib/rpm/rpmpopt-*.
Альтернативные форматы запросов можно помещать в /etc/popt или в ~/.popt

Чтобы увидеть результат выполним комнду: `rpm -q --arch postfix` 
 и сравним ее вывод с выводом этой команды: `rpm -q --arch kernel`
Посмотреть список полей $ rpm -q --querytags
Вывод дополнительных полей $ rpm -q --qf '%{NAME}\t%{VERSION}-%{RELEASE}.%{ARCH}\t%{LICENSE}\n' package-1
Проверить целостность установленного пакета $ rpm -V postfix
Проверить целостность всех установленных пакетов в системе $ rpm -Va
Откатить пакеты по состоянию на 1 мая $ rpm -Uhv --rollback 'may 1'




  • расшифровка результатов проверки целостности:
    `S.......` отличаются размеры файлов
    `.M......` отличаются флаги и права доступа
    `..5.....` отличается контрольная сумма
    `...D....` несоответствуют major/minor номер устройств
    `....L...` readLink(2) path mismatch
    `.....U..` отличаются владельцы
    `......G.` отличаются группы-владельцы
    `.......T` отличается время модификации
    ` c` - файл из секции %config, то есть явно конфигурационный файл
    ` d` - файл из секции %doc, аналогично - явно принадлежит к документации
    ` g` - файл-призрак, т.е. содержимое файла явно не существует в пакете (но возможно создается скриптами при инсталляции пакета)
    ` l` - файл из секции %license
    ` r` - файл из секции %readme

Сложные манипуляции

Как откатить систему пакетов по состоянию на определенное время

1. Добавить в файл /etc/rpm/macros
%_repackage_all_erasures 1
2. Для отката состояния использовать опцию --rollback
rpm -Uhv --rollback '12 hours ago'
требуется `%_repackage_all_erasures 1` в /etc/rpm/macros

вторник, 15 октября 2013 г.

Cacti не рисует графики

Cacti не рисует графики - что делать?

imageОчень часто, когда мы начинаем писать свои скрипты получения данных, нас начинает преследовать так называемая проблема NaN - график не отображает данные. Когда я делал первые свои графики это просто ужас как бесило и заставляло меня ругать Cacti. Тратил кучу времени на то что вновь и вновь заново создавал источники данных, переписывал скрипт, искал чорт знает что вобщем. Потом, всеже успокоившись, решил перейти к методическому убийству данной проблемы. В результате набрел на хороший англоязычный ман по лечению данной проблемы и вольно перевел его для себя и глядишь тем пригодится кто только отправляется в битву за графики с Cacti. Итак пошаговое руководство в борьбе с NaN в Cacti.

Проверка Cacti логфайла

В первую очередь следует заглянуть в него. Обычно он находится по адресу /log/cacti.log. В противном случае необходимо заглянуть в настройки - Settings, Paths. В случае если в данном лог файле будет встречаться

SPINE: Host[...] DS[....] WARNING: SNMP timeout detected [500 ms], ignoring host '...'

Это означает вероятнее всего, что опрашиваемое вами устройство не может полностью отработать, то количество SNMP OID в SNMP запросе, которое к нему приходит. Для устранения этой ошибки следует уменьшит количество SNMP OID в запросе. Идем в Settings, Poller и уменьшаем значение The Maximum SNMP OID's Per SNMP Get Request. Следует установить значение в 1 и после того как poller начнет собирать требуемую статистику, следует его постепенно увеличить, выбрав подходящее для вашего случая значение.

Проверка функционирования вашего скрипта

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

su - cactiuser
/full/path/to/perl your-perl-script.pl p1 p2
... (проверяем ответ)

Если вы получаете данные посредством snmp запроса, то для проверки следует использовать snmpget, в запросе укажите OID, используйте тоже значение community и укажите версию snmp, туже что вы определили в cacti. Например опрос OID of .1.3.6.1.4.blablabla, со значением community "very-secret" и версией 2 SNMP опрашиваемый хост target это будет выглядеть вот так:

snmpget -c very-secret -v 2c target .1.3.6.1.4.blablabla
.... (проверяем ответ)


Проверяем Cacti Poller

В первую очередь проверьте наличие poller.php в cron. Эта программа вызывает базовый скрипт cmd.php, или spine, альтернативный метод запросов данных, написанный на C. Установить какой поллер используется встроенный или spine можно в настройках - Settings, Poller. Если вы хотите использовать Spine, то его следует установить отдельно, в базовую установку Cacti он не входит.
Теперь следует очистить лог файл /log/cacti.log (ну или переименуйте его, чтобы не было "старого мусора"). Затем измените настройки - Settings, Poller Logging Level установив значение DEBUG.
Теперь вам следует определить ID вашего запроса и ID вашего хоста. Найти требуемый вам ID запроса следует в меню Data Sources. ID хоста определяется в меню Devices.
Теперь следует запустить наш poller вручную и только для выбранного нами запроса данных. Делается это следующим образом -

php -q cmd.php id id

если вы используете Spine, то запустить такую проверку в режиме логгирования на уровне Debug можно вот так:

./spine --verbosity=5 id id

В обоих случаях мы увидим ответ в STDOUT. Данную процедуру можно повторять не дожидаясь установленного в Cacti временного интервала. Кроме того это очень удобно - вам не надо искать ошибку в сотнях записей лога, когда у вас уже очень большое количество данных мониторится в Cacti.

Проверка состояние MySQL

В большинстве своем данная проверка является излишней, и ее можно на первом этапе дабага проблемы просто опустить, но в случае если все далее описанные шаги, показывают что все работает правильно, то следует ее всеже сделать.
В дебаг логе, найдите запрос MySQL update соответствующий исследуемому хосту. Там будет SQL запрос который следует выполнить непосредственно на сервере mysql либо через терминал, либо средствами phpmyadmin. Проверьте что запрос сервером mysql выполняется корректно.

Проверка обновления RRD файла

Проверьте лог файл, в нем должны быть примерно такие строки:

rrdtool update filename --template ...

Для каждого RRD файла должна быть одна строка в логе.
RRD файлы должны создаваться изначально самим поллером. Если он их не создал то соответственно не пойдет и их обновление. Если их нет, проверьте Poller Cache в меню Utilities и проверьте там запрос к файлу.

Проверка владельца RRD файлов

Если rrd файлы были созданы с правами root-а, а поллер запущен в системи с привилегиями cactiuser , то естественно поллер не сможет обновить данные в RRD файле.

cd /var/www/html/cacti/rra
ls -l localhost*
-rw-r--r-- 1 root root 463824 May 31 12:40 localhost_load_1min_5.rrd
-rw-r--r-- 1 cactiuser cactiuser 155584 Jun 1 17:10 localhost_mem_buffers_3.rrd
-rw-r--r-- 1 cactiuser cactiuser 155584 Jun 1 17:10 localhost_mem_swap_4.rrd
-rw-r--r-- 1 cactiuser cactiuser 155584 Jun 1 17:10 localhost_proc_7.rrd
-rw-r--r-- 1 cactiuser cactiuser 155584 Jun 1 17:10 localhost_users_6.rrd


Выполните следующую команду для решения такой проблемы, если она у вас присутствует:

chown cactiuser:cactiuser *.rrd

Проверка пределов в RRD файле

Возможно причиной ваших проблем являются некорректно установленные пределы MAXIMUM и MINIMUM в RRD файле данных. Выполните следующее:

rrdtool fetch rrd_file AVERAGE

просмотрите 10-20 строк и если вы там видите NaN, то:

rrdtool info rrd_file

нас интересуют значения ds[loss].min ds[loss].max (loss - это частный пример - у вас будет имя ваших данных) и в результате вы увидите например такую картину:

ds[loss].min = 0.0000000000e+00
ds[loss].max = 1.0000000000e+02


В данном примере мы имеем MINIMUM = 0 и MAXIMUM = 100. Теперь следует сравнить значение ds.[…].type=ВЕЛИЧИНА, то есть мы убеждаемся что полученная нами ВЕЛИЧИНА находится в установленных значениях максимума и минимума.
Если значение не укладывается в установленные пределы , то недостаточно изменить пределы в Data Template, следует выполнить :

rrdtool tune rrd_file --maximum ds-name:new_ds_maximum>

где ds_name имя для данных определенное внутри RRD файла, а new_ds_maximum - новое значение максимума для данных. (Изменение минимума делается аналогично).
На этом шаге следует также проверить значения step и heartbeat интересующего нас RRD файла.

Проверка связи RRD файла и графика


Наконец следует проверить те ли хранилища данных использует график, который мы пытаемся получить. Идем в Graph Management и выбираем наш график. В данном режиме выбираем Turn On Graph Debug Mode и в появивишемся окне RRDTool Command: видим к каким RRD файлам обращается наш график (на это указывает выражение DEF).

Разное

До версии 0.8.6j, poller_output мог "вылезти за грани разума" ).
Эо обычно происходило из-за параметров настройки памяти в php.ini в значение 8 МБ. Измените данное значение по крайней мере на 64 MB.
Чтобы проверить это, выполните sql запрос через mysql cli (или phpmyadmin)
select count(*) from poller_output;
Для устранения проблемы выполните:
truncate table poller_output;
Данная проблема решена, начиная с версии 0.8.7

Установка через RPM

Некоторые RPM инсталяции некорректно встраивают поллер в cron - в результате поллер присутствует в cron в двух таблицах. Необходимо сделать проверку /etc/crontab и таблицы cron пользователя cactiuser (ну или как вы там у себя его назвали) и настроить cron так чтобы вызов шол однократно.

Не Nan , но значение 0

Во первых, внимательно пишите свои скрипты. Если в ы в скрипте используете внешние команды, то не надо надеятся на переменную $PATH. Указывайте нормальный, полный путь до команды /full/path/to/external/command

Во вторых, следите чтобы скрипт выполнялся быстро. Если в логах cacti вы видите “U”, это значит что Cacti устал ждать выполнения скрипта , и в результате вы словите NaN. Скрипт должен выполняться быстро! Но это уже ваша забота по его оптимизации.


Проблема : CACTID: ERROR: Problem with MySQL: 'Can't find file: 'poller_output' (errno: 2)'
 Проблема возникает из-за гибели таблички poller_output (обычное дело для myisam табличек при переполнении диска):

select TABLE_NAME,TABLE_TYPE,ENGINE,TABLE_ROWS,DATA_FREE,CHECK_TIME,CHECKSUM,TABLE_COMMENT from information_schema.tables;
...
| poller_output                         | BASE TABLE  | NULL   |       NULL |      NULL | NULL                |     NULL | Can't find file: 'poller_output' (errno: 2)      
...
Решается  :
mysql -uroot -p -e'repair table cacti.poller_output';

или

mysql -uroot -p -e'truncate table poller_output';

четверг, 12 сентября 2013 г.

Настраиваем ftp с TLS/SSL

Процесс установки ftp сервера рассмотрен ранее, поэтому начинаем настраивать SSL/TLS .

Создаём сертификат:
# cd /etc/ssl/
# /usr/bin/openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout vsftpd.pem -out vsftpd.pem


Настриваем vsftpd :
vim /etc/vsftpd.conf

# Turn on SSL
ssl_enable=YES
# Allow anonymous users to use secured SSL connections
allow_anon_ssl=YES
# All non-anonymous logins are forced to use a secure SSL connection in order to
# send and receive data on data connections.
force_local_data_ssl=YES
# All non-anonymous logins are forced to use a secure SSL connection in order to send the password.
force_local_logins_ssl=YES
# Permit TLS v1 protocol connections. TLS v1 connections are preferred
ssl_tlsv1=YES
# Permit SSL v2 protocol connections. TLS v1 connections are preferred
ssl_sslv2=NO
# permit SSL v3 protocol connections. TLS v1 connections are preferred
ssl_sslv3=NO
# Specifies the location of the RSA certificate to use for SSL encrypted connections
rsa_cert_file=/etc/ssl/vsftpd.pem
 
Рестартуем vsftpd . Ура! Всё работает.

среда, 7 августа 2013 г.

KVM на Debian.

Несколько недель назад я выбрал себе KVM для виртуализации. Сразу отвечу на вопросы «почему?»: виртуальные машины под KVM шустры и позволяют запускать любую ОС. Еретические ОС я не пробовал, но Debian и FreeBSD бегают под KVM+Debian очень и очень неплохо — это признают даже бывалые администраторы.
Если вы готовы за скорость заплатить удобством настройки и использования хост-машины — просим под кат.

Устанавливал я KVM на машинку с процессором core i7. Рекомендую использовать именно многоядерные процессоры с HT. При том не стоит отдавать виртуальным машинам виртуальных процессоров больше, чем есть ядер на хост-машине. В случае с i7 я получил 8 ядер, которые в дальнейшем смогу разделить как пожелаю между контейнерами.  Если раздать больше процессоров чем есть — это может сказаться на производительности.
Первым делом проверяем — поддерживает ли процессор аппаратную виртуализацию:
cat /proc/cpuinfo | egrep ‘(svm|vmx)’
Если после ввода команды на экране появился какой-либо текст — то ваш процессор поддерживает аппаратную виртуализацию. Если вывод команды пустой — то не стоит использовать KVM. Да и вообще не стоит использовать современные гипервизоры.
Теперь устанавливаем необходимые пакеты:
sudo apt-get install kvm libvirt-bin virtinst bridge-utils
После чего стоит перезагрузить хост. Конечно же стоит использовать последнее доступное стабильное linux-ядро, доступное в репозиториях.
Проверяем, установился ли KVM:
virsh -c qemu:///system list —all
Вывод команды опять же должен быть не пустым и не содержать ошибок вида «команда не найдена».
Приступим к настройке сети на хост машине. Приведем файл /etc/network/interfaces к следующему виду:
auto lo
iface lo inet loopback
auto  eth0
iface eth0 inet static
auto br0
iface br0 inet static
address   178.ххх.ххх.137
netmask   255.255.255.192

network 178.ххх.ххх.0
broadcast 178.ххх.ххх.191
gateway   178.ххх.ххх.129
bridge_ports eth0
bridge_fd 9
bridge_hello 2
bridge_maxage 12
bridge_stp off
После чего применяем все сетевые настройки:
/etc/init.d/networking restart
Для удобства создадим каталоги:
mkdir /iso && mkdir /vms
И скачаем образ установочный образ debian:
cd /iso && wget -c http://cdimage.debian.org/debian-cd/5.0.4/amd64/iso-cd/debian-504-amd64-CD-1.iso
Теперь перейдём к созданию виртуальной машины:
virt-install -n vm1 -r 1024 -f /vms/vm1.img -s 50 -c /iso/debian-cd/5.0.4/amd64/iso-cd/debian-504-amd64-CD-1.iso —accelerate —os-type=linux —os-variant=generic26 -v —vnc -w bridge:br0
Расскажу о приведенных выше опциях:
-n vm1 — имя домена (виртуальной машины)
-r 1024 — количество оперативной памяти
-f /vms/vm1.img — расположение «жесткого диска».
-s 50 — размер «жесткого диска»
-c /iso/debian-cd/5.0.4/amd64/iso-cd/debian-504-amd64-CD-1.iso — указываем iso образ, с которого будем производить установку системы. Рекомендую запускать 64х битные образы под 64й битной ОС хост-машины.
—accelerate —os-type=linux —os-variant=generic26 -v — оптимизируем VDS для работы с виртуальным Linux с ядром 2.6.хх
—vnc — запускаем VNC-сервер для доступа к виртуальной машине.
-w bridge:br0 — указываем, что виртуальная машина должна использовать сетевлй мост br0  хост-машины
Теперь перейдем к установке ОС на виртуальную машину.
На вашем компьютере (не на сервере, а на рабочей станции с графической средой) вводим команды:
ssh -L 5900:localhost:5900 root@178.ххх.ххх.137
И во второй консоли:
vncviewer localhost:5900
Теперь вы должны увидеть в VNC установщик Debian. Ставим всё как обычно (возможно вам будет недоступна сеть). После того, как установщик Debian отправит систему в перезагрузку — виртуальная машина выключится, вместо того, чтобы перезагрузиться.
Самое время изменить количество выделенных процессоров для виртуальной машины:
virsh -c qemu:///system setvcpus vm1 2
Эта команда сработает, только если виртуальная машина находится в выключенном состоянии.  Теперь запустим её снова:
virsh -c qemu:///system start vm1
Теперь нужно настроить сеть на виртуальной машине. Заходим на неё по VNC и приводим файл /etc/network/interfaces к следующему виду:
auto lo
iface lo inet loopback
allow-hotplug eth0
iface eth0 inet static
address 178.xxx.xxx.177
netmask 255.255.255.192
network 178.xxx.xxx.128
broadcast 178.xxx.xxx.191
gateway 178.xxx.xxx.137
Шлюзом необходимо указать ip-адрес хост-сервера. Так же стоит прописать NS в файл /etc/resolv.conf
Теперь ваша виртуальная машина работает и доступна из сети (а в моём случае она стала доступна и из интернета).
Осталось сделать aptitude update && aptitude upgrade && aptitude install openssh-server и зайти на виртуальный сервер по SSH.
Пользуясь случаем расскажу вам, что у хостера QS.biz сдаются в аренду VDS на KVM.

Kernel Based Virtual Machine (KVM)

Kernel Based Virtual Machine (KVM)


KVM - это технология полной виртуализации для Linux, поддерживающая аппаратную виртуализацию для процессоров с поддержкой Intel VT или AMD-V. Сам KVM состоит из из подгружаемого модуля ядра kvm.ko, предоставляющего базовый функционал, а также специфичного для процессора модуля kvm-intel.ko или kvm-amd.ko.

Установка

В Lenny он находится в пакете 'kvm', в Squeeze - 'qemu-kvm'. Объяснение смены названия пакета можно найти в файле README.Debian.gz для пакета qemu-kvm.

Использование virt-manager

Следующая команда установит kvm и virt-manager
aptitude install kvm virt-manager
По зависимостям будет установлен демон libvirt-bin. Его задачей является загрузка соответствующего для процессора модуля kvm-amd или kvm-intel во время запуска системы. Для управления виртуальными машинами из-под учётной записи, отличной от root, необходимо добавить пользователя в группу libvirt:
adduser <youruser> libvirt
Если Вы предпочитаете управлять через консоль и визуальная оболочка Вам не нужна, тогда установить kvm можно следующим образом:
aptitude install kvm libvirt-bin
Для управления виртуальными машинами можно использовать virsh(1) . За более подробной информацией следует обратиться к странице посвящённой libvirt.

Squeeze

Установить KVM можно так, при этом управление виртуальными машинами kvm аналогична управлению виртуальными машинами в QEMU.
aptitude install qemu-kvm

Использование virt-manager

Установка qemu-kvm следующей командой автоматически установит Менеджер Виртуальных Машин (Virtual Machine Manager) virt-manager.
aptitude install qemu-kvm virt-manager
Будет установлен демон libvirt-bin, который будет запускаться во время старта системы и подгружать специфичный для процессора модуль kvm-amd или kvm-intel. Для управления виртуальными машинами из-под непривилегированного пользователя, необходимо данного пользователя добавить в группу libvirt:
adduser <youruser> libvirt
В случае когда графический интерфейс не нужен, то установить kvm можно следующей командой:
aptitude install qemu-kvm libvirt-bin
Командой virsh(1) управлять виртуальными машинами.

Диагностика

No network bridge available:
virt-manager uses a virtual network for its guests, by default this is routed to 192.168.122.0/24 and you should see this by typing ip route as root.
If this route is not present in the kernel routing table then the guests will fail to connect and you will not be able to complete a guest creation.
Fixing this is simple, open up virt-manager and go to "Edit" -> "Host details" -> "Virtual networks" tab. From there you may create a virtual network of your own or attempt to fix the default one. Usually the problem exists where the default network is not started.

Смотри также

Ссылки

четверг, 1 августа 2013 г.

Установка паравиртуальной CentOS в Xen

Итак, у нас есть задача - установить Linux CentOS 5 как гостевую паравиртуальную виртуальную машину в гипервизор Xen (здесь мы будем рассматривать Xen 4.0.1 как последний на момент написания статьи).

Установка показана на примере Xen 4.0.1 с доменом-0 Linux Debian. Путь к виртуальным машинам оставлен по-умолчанию:
/etc/xen

вторник, 30 июля 2013 г.

Виртуализация Windows Server 2008R2 на Xen

Добрый день. Сегодня поговорим о виртуализации Windows Server 2008R2 на Xen.
Готовим disk image под Windows Server 2008R2 :
dd if=/dev/zero of=xenwin2008.img bs=1024k seek=40000 count=0
Внимание! Размер диска будет 39 с хвостиком Гб. Убедитесь заранее в наличии свободного места.

среда, 24 июля 2013 г.

Задержки при авторизации по ssh

Бывают в жизни такие ситуации :) когда при авторизации по ssh мы имеем большие задержки или завершение соединения по тайм-ауту. Решается чаще всего это очень просто:
UseDNS no в sshd_config

вторник, 23 июля 2013 г.

Установка ftp сервера на Debian

Добрый день. Казалось бы, достаточно тривиальный вопрос: как установить ftp сервер.
Но и здесь нашлись грабли:))). А нашлись они в следующем месте : ftp сервер был необходим исключительно для замера пропускной способности сети между интерфейсом сервера уходящим в up-link и замеряющим. Поэтому варианты с поднятием ftp на виртуалке в DMZ и дальнейший проброс портов на неё исключался. Нужен был исключительно боевой сервер.
И вот тут то и начались грабли . FTP категорически не хотел выполнять комманду LIST в пассивном режиме. Кто-то скажет - для разовой операции замера скорости всё равно, можно использовать и активный режим ftp. Но это, не Debian way:) . Всё должно просто работать.

И так... Устанавливаем vsftpd на Debian 6 squeeze.

$ sudo apt-get install vsftpd
Устанавливаем  vsftpd
 Приводим конфиг к виду :

listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/private/vsftpd.pem
pasv_enable=YES
pasv_min_port=50200
pasv_max_port=50299

Как известно, для работы FTP-сервера в пассивном режиме нужны следующие порты:
1) port #21
2) random port #>1024. 


Мы установили для пассивного режима диапазон портов от 50200-50299. Осталось настроить фаерволл.

Фаервол(если у кого не был настроен) :
$ sudo iptables -I INPUT 1 -m state --state RELATED,ESTABLISHED -j ACCEPT
Разрешаем все установленные соединения.

$ sudo iptables -A INPUT -i eth0 -m state --state NEW   -p tcp --dport 22  \
-j ACCEPT 
Разрешаем ssh . Интерфейсы, порты и адреса добавить по вкусу.

$ sudo iptables -A INPUT -p tcp -m state --state NEW -m multiport --dport 21,50200:50299 \
-j ACCEPT
Разрешаем устанавливать соединение по ftp, в т.ч. в пассивном режиме.


$ sudo iptables -P INPUT DROP
Запрещаем всё, что не разрешено.

суббота, 20 апреля 2013 г.

Балансировка нагрузки с LVS

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



DNS-RR


Первым делом напрашивается вариант с использованием Round-robin DNS. Если кто не знает, это метод позволяющий размазать запросы между n-ым количеством серверов просто отдавая на каждый DNS запрос новый IP.

Каковы минусы:
  • Сложно управлять: вы забили группу IP-адресов и все, никаких тебе управлений весами, состояние серверов не отслеживается и т.д.
  • Фактически вы размазываете запросы по диапазону IP, но не балансируете нагрузку на серверах
  • Кэширование DNS клиента может поломать всю малину


Хотя и не стоит добавлять между вводом и выводом «слишком много компьютера», хочется каких-либо методов контроля над ситуацией.

LVS


И тут на помощь к нам приходит Linux Virtual Server или LVS. Фактически, это модуль ядра (ipvs), существующий еще где-то с версии 2.0-2.2.

Что же он из себя представляет? Фактически это L4-роутер (я бы сказал что L3, но авторы настаивают на L4), позволяющий прозрачно и управляемо разруливать пакеты по заданным маршрутам.



Основная терминология следующая:
  • Director — собственно узел осуществляющий роутинг.
  • Realserver — рабочая лошадка, узел нашей фермы серверов.
  • VIP или Virtual IP — всего лишь IP нашего виртуального (собранного из кучи реальных) сервера.
  • Соответственно DIP и RIP — IP директора и реальных серверов.


На директоре включается этот самый модуль IPVS (IP Virtual Server), настраиваются правила проброса пакетов и поднимается VIP — обычно как алиас к внешнему интерфейсу. Пользователи будут ходить через VIP.

Пакеты, пришедшие на VIP пробрасываются выбранным методом до одного из Realserver'ов и там уже нормально отрабатываются. Клиенту кажется что он работает с одной машиной.

Правила


Правила проброса пакетов крайне просты: задаем виртуальный сервис, определяемый парой VIP:port. Сервис может быть TCP или UDP. Здесь же задаем метод ротации узлов (планировщик, scheduler). Далее задаем набор серверов из нашей фермы, также парой RIP:port, а также указываем метод проброса пакетов и вес, если того требует выбранный планировщик.

Выглядит это примерно следующим образом.

# ipvsadm -A -t 192.168.100.100:80 -s wlc
# ipvsadm -a -t 192.168.100.100:80 -r 192.168.100.2:80 -w 3
# ipvsadm -a -t 192.168.100.100:80 -r 192.168.100.3:80 -w 2
# ipvsadm -a -t 192.168.100.100:80 -r 127.0.0.1:80 -w 1


Да, не забудьте поставить пакет ipvsadmin, он должен быть в репозитории вашего дистрибутива. Во всяком случае в Debian и RedHat он есть.

В примере выше мы создаем виртуальный HTTP сервис 192.168.100.100 и включаем в него сервера 127.0.0.1, 192.168.100.2 и 192.168.100.3. Ключ "-w" задает вес сервера. Чем он выше, тем с бОльшей вероятностью он получит запрос. Если выставить вес в 0, то сервер будет исключен из всех операций. Очень удобно, если нужно вывести сервер из эксплуатации.

Пакеты по умолчанию пробрасываются методом DR. Вообще существуют следующие варианты роутинга:
  • Direct Routing (gatewaying) — пакет направляется напрямую на ферму, без изменений.
  • NAT (masquarading) — просто хитрый механизм NAT.
  • IPIP incapsulation (tunneling) — туннелирование.


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

Планировщиков в комплекте поставки несколько, подробно можно почитать в инструкции. Рассмотрим лишь основные.
  • Round Robin — знакомая всем круговая порука.
  • Weighted Round Robin — тоже самое, но с использованием весов сервера.
  • Least Connection — отправляем пакет серверу с наименьшим количеством соединений.
  • Weighted Least Connection — тоже самое, но с учетом весов.


Ко всему прочему, можно сообщить, что сервис требует persistence, т.е. удерживание пользователя на одном из серверов в течении заданного промежутка времени — все новые запросы с одного и того же IP будут прокинуты на тот же сервер.

Подводные камни


Итак, согласно примеру выше, мы должны были получить виртуальный сервер на VIP 192.168.100.100, о чем нам ipvsadm и радостно сообщает:

ipvsadm -L -n
IP Virtual Server version 1.0.7 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.100.100:80 wlc
-> 192.168.100.2:80 Route 3 0 0
-> 192.168.100.3:80 Route 2 0 0
-> 127.0.0.1:80 Local 1 0 0


Однако, при попытке соединения ничего не произойдет! В чем же дело? Первым делом необходимо поднять алиас.
# ifconfig eth0:0 inet 192.168.100.100 netmask 255.255.255.255

Но и тут нас ждет неудача — пакет приходит на интерфейс реального сервера немодифицированным и следовательно тупо отпинывается ядром как не предназначающийся машине. Простейшим методом разрешения этого вопроса является поднятие VIP на loopback.

# ifconfig lo:0 inet 192.168.100.100 netmask 255.255.255.255

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

Теперь пакетики должны побежать куда надо. Кстати, директор сам может быть реальным сервером, что мы и видим в нашем примере.

Единая точка отказа


В этом решении очевидной точкой отказа, вызывающей разрушение всего сервиса, будет сам директор.

Что ж, не беда, ipvsadm поддерживает запуск в режиме демона с возможностью синхронизации таблиц и текущих соединений между несколькими директорами. Один, очевидно, станет мастером, остальные будут слейвами.

Что остается нам? Переезжать VIP между директорами в случае отказа. Тут нам помогут HA решения вроде heartbeat.

Другой задачей будет мониторинг и своевременный вывод из эксплуатации серверов из нашей фермы. Проще всего это делать весами.

Для разруливания обоих вопросов написано множество решений, заточенных под разные типы сервисов. Мне лично больше всего понравилось решение Ultramonkey, от самих же авторов LVS.

У RedHat есть родная штука под названием Piranha, она имеет свой набор демонов для мониторинга фермы и директоров и даже некий топорненький веб-интерфейс, однако она не поддерживает более чем 2 директора в HA связке. Уж не знаю почему.

Ultramonkey


Итак, Ultramonkey состоит из 2-х основных пакетов — heartbeat и ldirectord. Первый занимается обеспечением HA для директоров, в том числе поднятие и переезд VIP (и вообще говоря может использоваться не только для директоров), а второй поддерживает конфиг ipvsadm и мониторит состояние фермы.

Для heartbeat необходимо нарисовать 3 конфига. Базовые версии снабжены подробными комментариями, поэтому просто приведу примеры.

authkeys
auth 2
#1 crc
2 sha1 mysecretpass
#3 md5 Hello!

Настраиваем авторизацию демонов на разных машинах.

haresources
Здесь у нас информация о том, для какого ресурса мы создаем HA и какие сервисы дергаем при переезде.
director1.foo.com IPaddr::192.168.100.100/24/eth0 ldirectord

Т.е. поднять на интерфейсе eth0 192.168.100.100/24 и запустить ldirectord.

ha.cf
keepalive 1
deadtime 20
udpport 694
udp eth0
node director1.foo.com # <-- должно совпадать с uname -n !
node director2.foo.com #

Говорим каким образом поддерживать HA кластер и кто собственно в него входит.

У ldirectord всего один конфиг и там в общем-то тоже все понятно.
checktimeout=10
checkinterval=2
autoreload=yes
logfile="/var/log/ldirectord.log"
# Virtual Service for HTTP
virtual=192.168.100.100:80
real=192.168.100.2:80 gate
real=192.168.100.3:80 gate
service=http
request="alive.html"
receive="I'm alive!"
scheduler=wlc
protocol=tcp
checktype=negotiate


Т.е. ldirectord будет каждые 2 секунды дергать через http файл alive.html и если в нем не будет строчки «I'm alive!» или, хуже того, сервер не ответит, демон тут же поставит ему вес 0 и он будет исключен из последующих пересылок.

Веса также можно расставлять самому, например пробегаясь кроном по полю и вычисляя их в зависимости от текущего loadavg и т.п. — прямой доступ к ipvsadm у вас никто не отнимает.

Применимость


Хотя везде по интернету в качестве сферы применения LVS в основном рассматривается балансировка веб-серверов, на самом деле им можно балансировать великое множество сервисов. Если протокол держится на одном порте и не имеет состояний, то его можно будет балансировать без особых проблем. Сложнее дело обстоит с мультипортовыми протоколами вроде samba и ftp, но и тут есть решения.

Кстати, в качестве реальных серверов не обязательно должен выступать Linux. Это можеть быть практически любая ОС со стеком TCP/IP.

Что еще почитать?