FastNetMon

Wednesday 27 February 2013

Как практически посчитать максимальный объем памяти на платформе?



  1. ддр обычная - 8 гб для планки пределх
  2. ддр регистровая - есть планки до 32 гб на одну железку
  3. число каналов на процессоре
  4. из пункта 3 следует число планок на матери суммарное (оно кратно числу каналов)
  5. поддержка процессором регистровой памяти (онли серверные)
  6. на основании 1-5 можно посчитать предел, но с поправкой на то, что память развивается и завтра появятся более емкие планки
  7. мультисковетность, если проца два - планок вдвое больше сходу
Это довольно примерный план, на оснвоании которого можно посчитать максимальную практическую емкость памяти на платформе.

Сниффер UNIX сокета - как реализовать?

При именно такой постановке задача довольно сложная. Как простое решение рекомендую strace:
strace -s 1024 -f -p 4478 -e trace=read,write

25 прогнозов главного футуролога Cisco

Thursday 21 February 2013

Установка WHDD

Утилита позиционируется как аналог mhdd, но, к сожалению, не является им в чистом виде.

Все тривиально:
apt-get install -y git cmake gcc make libncurses5-dev libncursesw5-dev
git clone https://github.com/krieger-od/whdd.git
cd whdd
cmake . && make && make install
У утилиты есть две версии - whdd-curses и whdd-cli.

Из приятных фишек - очень информативные read/write тесты. Минусы - работа со smart сводится к отображению параметров в  стиле smartctl.

Как запустить logrotate на Debian ранее запланированного срока?

Вот так:
logrotate --force /etc/logrotate.d/apache2

Monday 18 February 2013

Аналог vzps на bash


Довольно топорно, но работает:
#!/bin/bash
for i in `ps aux | awk '{print $2}'`; do vzpid $i|grep -v CTID | awk '{print $1 " " $2}'|grep $1 | awk '{print $1}'  ;done
Пример использования:

/usr/bin/vzprocess 2001
5839
5840
5841
6400
6461
6462
6595
6602
6662
6785
6803
6865


Определение CPU, на которых выполняются процессы определенного контейнера?

До начала работ требуется поставить вот это дело: http://www.stableit.ru/2009/12/openvz-vztop-vzps.html

Далее же все осуществляется простой Bash командой:

for i in `vzps -E 1023 --no-headers   |awk '{print $2}'`; do cat /proc/$i/stat|awk '{print $39}';done|sort | uniq -c
Выдача будет примерно следующая:
      1 0
      3 1
      8 10
      7 11
      4 12
      3 13
      9 22
     11 23
      4 3
      2 4
      1 6
     12 8
     17 9
Обращаю внимание, что первый столбец - число процессов на заданном процессоре, второй - номер логического процессора.

Также предлагаю вариацию команды, отображающей физические слоты (в случае многопроцессорых - несколько реальных, физических процессоров):

for i in `vzps -E 1023 --no-headers   |awk '{print $2}'`; do cpu=$(cat /proc/$i/stat|awk '{print $39}'); cat /sys/devices/system/cpu/cpu$cpu/topology/physical_package_id; done|sort | uniq -c
Ее выдача имеет похожий вид:
     44 0
     38 1

Linux: physical id/processor mapping

How to get list of logical cores per every physical cpu in Linux?

It's very tricky and we need use Perl:
cat /proc/cpuinfo |egrep '(^processor)|(physical id)' | awk -F": " '{printf $2 " "}'| perl -e '$_=<>; @list=split/\s+/,$_; $hs={}; while(scalar @list > 0) { ($a,$b) = (shift @list, shift @list); push @{$hs->{$b}}, $a;} for my $cpu (keys %$hs) {print "cpu:$cpu\n";print join ",", @{$hs->{$cpu}}; print "\n"}' 
Sample script output looks like:
cpu:1
6,7,8,9,10,11,18,19,20,21,22,23
cpu:0
0,1,2,3,4,5,12,13,14,15,16,17 
But we have a very simple solution (works pretty on 2.6.18/rhel5):
for i in `ls /sys/devices/system/node|grep node`; do cpu=$(echo $i|sed 's/node//'); echo -n "$cpu: "; cat /sys/devices/system/node/$i/cpulist|sed 's/-/../g' | perl -e 'print join ",", (eval(<>)); '; echo  ;done 
Sample output is very similar, but script is too short.
0: 0,1,2,3,4,5,12,13,14,15,16,17
1: 6,7,8,9,10,11,18,19,20,21,22,23
Sample content of cpilist elements in proc fs:

# cat /sys/devices/system/node/node1/cpulist
6-11,18-23
# cat /sys/devices/system/node/node0/cpulist
0-5,12-17

Как узнать число физических процессоров в Linux?

Очевидный вариант:
cat /proc/cpuinfo | grep 'physical id'  | sort | uniq | wc -l
Неочевидный (точно работает на 2.6.18/rhel5, 2.6.32/rhel6):
ls /sys/devices/system/node|grep node|wc -l 

Как посмотреть, на каком процессоре/ядре работают процессы?

top, f => j => Enter. И в поле: P будет номер используемого CPU.

Например, вот так:

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  P COMMAND                                                                
 6020 whistler  18   0 8853m 649m  10m S    2  4.1   4:32.05 1 java                                                                  

 7503 root      18   0 18944 1284 1024 R    0  0.0   0:00.01 3 top                                                                    
    1 root      18   0  8364  836  712 S    0  0.0   0:01.82 1 init                                                                    
 1517 root      19   0 54572  996  496 S    0  0.0   0:00.00 0 saslauthd                                                              

 1518 root      19   0 54572  656  156 S    0  0.0   0:00.00 0 saslauthd                                                              

 1525 root      15   0  5988  728  568 S    0  0.0   0:00.14 0 syslogd                                                                
 1529 daemon    18   0 18720  432  272 S    0  0.0   0:00.00 2 atd                                                                    
 1542 bind      21   0  177m  17m 2280 S    0  0.1   0:00.04 4 named                                                                  
 1560 root      18   0  352m  18m  11m S    0  0.1   0:01.03 2 apache2                                                                
 1563 www-data  15   0  136m 3284  476 S    0  0.0   0:00.28 2 apache2                                                                

 1582 root      15   0 20916  992  764 S    0  0.0   0:00.03 2 cron                                                                    
 1588 messageb  16   0 23276  880  632 S    0  0.0   0:00.00 0 dbus-daemon                 

Sunday 17 February 2013

Script for netconsole activation on Debian squeeze

Данный скрипт использовать НЕ РЕКОМЕНДУЕТСЯ!!!! Рекомендую использовать новый: http://www.stableit.ru/2013/03/netconsole-debian-squeeze.html

Вот такой скриптец. http://fastvps.googlecode.com/svn/trunk/scripts/activate_netconsole.pl

Что он делает? Он включает логгирование ошибок ядра (netconsole) на сервер и пор, указаные в начале кода.

Как им пользоваться? Крайне просто:
wget http://fastvps.googlecode.com/svn/trunk/scripts/activate_netconsole.pl
perl activate_netconsole.pl 
В результате этих операций в текущей сессии будет загружен модуль netconsole, а также будет настроена его автозагрузка при следующем запуске системы.

У модуля есть недостаток - netconsole отвалится в случае, если машина, на которую идет логгирование будет доступна без роутинга, напрямую. Также он отвалится в случае, если поменяется mac роутера.

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

Добавление модулей в автозагрузку Debian на примере netconsole

Особенность Debian в том, что само имя модуля нужно добавлять в /etc/modules, а сами настройки модуля в /etc/modprobe.d/имя_модуля.conf.

Например:
echo 'netconsole' >> /etc/modules
echo 'options netconsole netconsole=6666@5.9.yy.xx/eth0,514@78.47.xx.zz/78:fe:3d:43:4f:96' > /etc/modprobe.d/netconsole.conf

Friday 15 February 2013

OpenVZ: самый быстрый способ вывести load average на всех конетейнерах

Вот такой хитрый хак:
vzlist -o ctid,laverage 
Пример выдачи:
      1041 0.00/0.00/0.00
      1042 0.00/0.00/0.00
      1303 0.66/0.52/0.35
      4226 0.65/0.97/1.52
      7846 0.48/0.23/0.33
      7924 0.00/0.00/0.00
      8126 0.00/0.00/0.00
      8218 0.07/0.04/0.02
      8284 0.00/0.01/0.00
      8447 0.10/0.16/0.17

OpenVZ: Показать число running процессов с детализацией по контейнерам

Вот такой вот набор команд на баше:
 for i in `ps aux|awk '{if($8=="R"){print $2}}'`; do vzpid $i | grep -v CTID | awk '{print $2}';done |sort | uniq -c
      1 1003
      2 1004
      1 1011
      5 1018
      5 1020
     19 1023
      1 1027
      5 1034
      2 1039
Выдача примерно такая:

      1 1003
      2 1004
      1 1011
      5 1018
      5 1020
     19 1023
      1 1027
      5 1034
      2 1039

Thursday 14 February 2013

Chrome does not support Java 7. Java 7 runs only on 64-bit browsers and Chrome is a 32-bit browser.

Вот такая вот оказия с Mac OS X 10.7.5 при заходе на страницу: http://www.java.com/en/download/mac_download.jsp


grub, lenny: The file /boot/grub/stage1 not read correctly.

Такая ошибка может означать, что на диске нету кода grub, например, еще не закончилась синхронизация.

Фикс следующий - ждать конца синхронизации.

Тут лучше использовать grub shell, так как у него ошибки адекватнее:

grub> root (hd1,1)
root (hd1,1)
 Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd1)          
setup (hd1)
 Checking if "/boot/grub/stage1" exists... yes
 Checking if "/boot/grub/stage2" exists... yes
 Checking if "/boot/grub/e2fs_stage1_5" exists... yes
 Running "embed /boot/grub/e2fs_stage1_5 (hd1)"... failed (this is not fatal)
 Running "embed /boot/grub/e2fs_stage1_5 (hd1,1)"... failed (this is not fatal)
 Running "install /boot/grub/stage1 (hd1) /boot/grub/stage2 p /boot/grub/menu.lst "... succeeded
Done.
grub> root (hd0,1)
root (hd0,1)
 Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd1)
setup (hd1)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... no
Error 15: File not found

Tuesday 12 February 2013

Автодополнение команд в bash при наличии sudo

В случае использования sudo на Debian, при вызове команд не выполняется автодополнение.

Ставим спец-пакет:
apt-get intsall -y bash-completion

Результат наших трудов:

sudo apt
apt-cache                     apt-file                      aptitude-create-state-bundle  apt-mark
apt-cdrom                     apt-ftparchive                aptitude-curses               apt-rdepends
apt-config                    apt-get                       aptitude-run-state-bundle     apt-sortpkgs
apt-extracttemplates          aptitude                      apt-key                       

Выдача имени пакета при попытке запуска команды из неустановленного пакета

Такой вот своего рода Ubuntu way :) Фича может быть удобна в ряде случаев.

Установка как всегда крайне проста:
apt-get install -y command-not-found

После установки нужно сформировать кэш:
update-command-not-found
После установки у обычных пользователей, при попытке что-либо вызвать будет появляться сообщение в стиле Ubuntu:
mysql
The program 'mysql' is currently not installed.  To run 'mysql' please ask your administrator to install the package 'mysql-client-5.1'
mysql: command not found

Monday 11 February 2013

Monit, debian, status not monitored

Если монит в своем статусе пишет, что сервис не могиторится и, как следствие, не ребутает его, то нужно сделать следующее (предварительно основановив monit):
sudo cp /dev/null /var/lib/monit/monit.state
Это обнулит его state данные и все заработает ок. 

Как запретить ntpd слушать внешние соединения вообще?

Это довольно просто, открываем конфиг:
vim /etc/ntp.conf

Вносим там:

interface ignore wildcard
interface listen 127.0.0.1
Перезапускаем:
/etc/init.d/ntp restart 
Убеждаемся, что все ок:
sudo netstat -lnpu
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
udp        0      0 127.0.0.1:123           0.0.0.0:*                           16625/ntpd    
udp6       0      0 ::1:123                 :::*                                16625/ntpd    
Источник: http://serverfault.com/questions/475635/how-to-prevent-ntpd-to-listen-on-0-0-0-0123/475639#475639 

Защита серверов на Debian Squeeze от брутфорса посредством fail2ban

Ставим:
apt-get install -y fail2ban
Сервис сразу же запустится и будет добавлен в автозапуск.

Также fail2ban сразу создаст свою цепочку, через которую будет пропускать трафик (забаниваемые адрес) конкретного сервера (и как следвствие - крайне низкий оверхед, что плюс):

sudo iptables -nvL
Chain INPUT (policy ACCEPT 845 packets, 149K bytes)
 pkts bytes target     prot opt in     out     source               destination      
    0     0 fail2ban-ssh  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           multiport dports 22
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination      
Chain OUTPUT (policy ACCEPT 815 packets, 336K bytes)
 pkts bytes target     prot opt in     out     source               destination      
Chain fail2ban-ssh (1 references)
 pkts bytes target     prot opt in     out     source               destination      
    0     0 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0           



Открываем конфиг:
vi /etc/fail2ban/jail.conf

Там будет ряд блоков с заголовками вида - [ssh], это блоки правил, описывающих, какие именно сервисы контролируются и защищаются от брутфорса. Стандартно включен лишь один - ssh, он нам и нужен. Обращаю внимание! Что здесь нужно исправить порт, если он у Вас отличается от стандартного (я рекомендую это сделать!).


[ssh]
enabled = true
port    = 1022
filter  = sshd
logpath  = /var/log/auth.log
maxretry = 6


Теперь самое важное - внесите свой IP адрес (если он постоянный) в белый список fail2ban, это делается в том же файле в блоке:
ignoreip = 127.0.0.1 178.xx.yy.zz

Применяем измененный конфиг (если внесли туда коррективы):

/etc/init.d/fail2ban restart

Лог работы сервиса fail2ban можно смотреть так:

tail -f /var/log/fail2ban.log

Теперь настало время проверить fail2ban в деле - пробуем 6 раз ввести неверно ssh пароль со внешнего хоста, чтобы нас забанило.

Забаненые айпи можно смотреть вот так (либо в фаероволле):

sudo fail2ban-client status ssh
Status for the jail: ssh
|- filter
|  |- File list: /var/log/auth.log
|  |- Currently failed: 1
|  `- Total failed: 7
`- action
   |- Currently banned: 1
   |  `- IP list: 188.40.74.10
   `- Total banned: 1

Раазбанивать ошибочно забаненых юзеров вот так (криво, да, но прямой механизм в fail2ban появится лишь к 0.9 версии, да и-то не факт):

sudo iptables -nvL --line-numbers
Chain INPUT (policy ACCEPT 77613 packets, 15M bytes)
num   pkts bytes target     prot opt in     out     source               destination      
1      974 75898 fail2ban-ssh  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           multiport dports 1022
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination      
Chain OUTPUT (policy ACCEPT 75761 packets, 30M bytes)
num   pkts bytes target     prot opt in     out     source               destination      
Chain fail2ban-ssh (1 references)
num   pkts bytes target     prot opt in     out     source               destination      
1       25  2596 DROP       all  --  *      *       188.xx.xx.xx         0.0.0.0/0        
2      949 73302 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0           

Разбаниваем (очень аккуратно, чтобы ):

sudo iptables -D fail2ban-ssh 1


Источник: http://debianclusters.cs.uni.edu/index.php/Fail2Ban:_Preventing_Brute_Force_SSH

Saturday 9 February 2013

Работа с zabbix из Python

Под это дело уже есть готовый компонент:
easy_install pyzabbix
Простейший код с выводом версии АПИ и тестом соединения:

#!/usr/bin/python
from pyzabbix import ZabbixAPI
zapi = ZabbixAPI("https://zabbix.domain.ru")
zapi.login("admin", "xxx")
print "Connected to Zabbix API Version %s" % zapi.api_version()
for h in zapi.host.get(extendoutput=True):
    print h['host']

Если работать будете от имени админа, то нужно добавить его в группу API access, иначе доступа не будет.


Источник: https://github.com/lukecyca/pyzabbix/wiki

Wednesday 6 February 2013

Облачный ssh-copy-id - ssh-import-id

Подробнее:
http://blog.dustinkirkland.com/2012/02/ssh-import-id-gaining-some-steam.html и http://manpages.ubuntu.com/manpages/precise/man1/ssh-import-id.1.html

Суть идеи в создании авторизованного безопасного хранилища для публичных rsa/ssh ключей, откуда их можно быстро вытянуть и внести в систему.

Риквестую подобное вне убунт! 

Monday 4 February 2013

Как на уровне iptables отсечь DNS запросы определенного типа к определенному домену?

Итак, нам нужен спец-скрипт, берем его по адресу: http://www.bortzmeyer.org/files/generate-netfilter-u32-dns-rule.py  (зеркало).

Генерируем правило для модуля u32 iptables и сохраняем его в переменной:
rule=$(python generate-netfilter-u32-dns-rule.py --qname suxx.us --qtype ANY)
Добавляем это правило для фльтрации:
iptables -A INPUT -p udp --dport 53 --match u32 --u32 "$rule" -j ACCEPT 
Делаем откуда-либо извне запрос:
host -t any suxx.usaa dns-server.ru
После этого, фиксируем попадание правила в фаерволл:
iptables -nvL|grep u32
    4   212 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:53 u32 0x0>>0x16&0x3c@0x14=0x4737578&&0x0>>0x16&0x3c@0x18=0x78027573&&0x0>>0x16&0x3c@0x1c&0xffffff00=0xff00 
 Как можно убедиться, модуль u32 дает почти неограниченную гибкость для фильтрации различных протоколов.
 

Как посредством сниффера пакетов отловить DNS запросы заданного типа?

This summary is not available. Please click here to view the post.

Универсальный мониторинг любого DNS сервера


Все очень просто
apt-get install -y dnstop
Вот пример выдачи (включен режим анонимизации, флаг -a, который скрывает реальные адреса):
Queries: 594 new, 7867 total                                                                  Mon Feb  4 09:05:11 2013
Sources        Count      %
---------- --------- ------
::34.0.0.0      3313   42.1
::               182    2.3
::2.0.0.0         47    0.6
::3.0.0.0         44    0.6
::20.0.0.0        43    0.5
::31.0.0.0        42    0.5
::37.0.0.0        34    0.4
::24.0.0.0        34    0.4
::22.0.0.0        34    0.4
::42.0.0.0        33    0.4
::4.0.0.0         33    0.4
::5.0.0.0         28    0.4
::1.0.0.0         23    0.3
::47.0.0.0        19    0.2
::35.0.0.0        19    0.2
::45.0.0.0        18    0.2
::46.0.0.0        18    0.2
::48.0.0.0        16    0.2
::43.0.0.0        15    0.2
Обращаю внимание, что программа имеет множество команд в интерактивном режиме, например, для получения распределения по типам запросов нужно нажать t и будет выдано примерно следующее:

Queries: 707 new, 51766 total                                                                 Mon Feb  4 09:11:00 2013
Query Type     Count      %
---------- --------- ------
ANY?           26750   51.7
A?             18165   35.1
AAAA?           2755    5.3
MX?             2356    4.6
PTR?            1208    2.3
TXT?             222    0.4
NS?              208    0.4
SPF?              61    0.1
SOA?              32    0.1
SRV?               7    0.0
CNAME?             2    0.0

Friday 1 February 2013

Установка puppet из репозитория от разработчиков

В ряде случаев это предпочтительно использованию встроенной в дистрибутив версии: http://docs.puppetlabs.com/guides/puppetlabs_package_repositories.html#open-source-repositories

Переход со стандартной версии (обновление) довольно прост:
wget http://apt.puppetlabs.com/puppetlabs-release-wheezy.deb
sudo dpkg -i puppetlabs-release-wheezy.deb
apt-get update
apt-get upgrade
apt-get dist-upgrade
Для установки новой версии:

wget http://apt.puppetlabs.com/puppetlabs-release-wheezy.deb
sudo dpkg -i puppetlabs-release-wheezy.deb
apt-get update
sudo apt-get install -y puppet

ERROR 1436 (HY000): Thread stack overrun: 8384 bytes used of a 131072 byte stack, and 128000 bytes needed. Use 'mysqld -O thread_stack=#' to specify a bigger stack.

Данная ошибка фиксится довольно просто.

Открываем конфиг:

vim /etc/mysql/my.cnf
И корректируем там:
thread_stack            = 512K


Применяем изменения:

/etc/init.d/mysql restart