Шукати в цьому блозі

вівторок, 18 грудня 2012 р.

Juniper: vpls, l2 point-multipoint

Задача: есть 2 маршрутизатора Cisco и один маршрутизатор Juniper MX-80, собрать на втором уровне трафик на джунипере, третий уровень клиент себе настроит так как захочет.

Cisco маршрутизаторы rc0 и rc1. Juniper маршрутизатор rj0.

Конфигурация rc0 (xx.xx.171.185), Gi0/1.2222:
rc0#sh run int Gi0/1.2222
interface GigabitEthernet0/1.2222
 description junos vpls test
 encapsulation dot1Q 2222
 xconnect xx.xx.120.69 2222 encapsulation mpls
end
Конфигурация rc1 (xx.xx.171.187), Gi0/1.2222:
rc1#sh run int Gi0/1.2222
interface GigabitEthernet0/1.2222
 description junos vpls test
 encapsulation dot1Q 2222
 xconnect xx.xx.120.69 2222 encapsulation mpls
end
Конфигурация rj0 (xx.xx.120.69):
rj0> show configuration interfaces ge-1/1/0.2222
set interfaces ge-1/1/0 unit 2222 description "vpls test"
set interfaces ge-1/1/0 unit 2222 encapsulation vlan-vpls
set interfaces ge-1/1/0 unit 2222 vlan-id 2222
set interfaces ge-1/1/0 unit 2222 family vpls
rj0> show configuration routing-instances vpls_test | display set
set routing-instances vpls_test instance-type vpls
set routing-instances vpls_test vlan-id all
set routing-instances vpls_test interface ge-1/1/0.2222
set routing-instances vpls_test protocols vpls no-tunnel-services
set routing-instances vpls_test protocols vpls mtu 2000
set routing-instances vpls_test protocols vpls mesh-group l2ccc vpls-id 2222
set routing-instances vpls_test protocols vpls mesh-group l2ccc local-switching
set routing-instances vpls_test protocols vpls mesh-group l2ccc neighbor xx.xx.171.187 encapsulation-type ethernet-vlan
set routing-instances vpls_test protocols vpls mesh-group l2ccc neighbor xx.xx.171.185 encapsulation-type ethernet-vlan

пʼятниця, 14 грудня 2012 р.

Juniper: аналог cisco global в vrf.

Задача: вывести маршрут из vrf в глобальную таблицу (например для живущих внутри vrf sip-абонентов). Например, из vrf необходимо получить доступ к внешним ресурсам 2xx.xx.xx1.0/28, 2xx.xx.xx0.2/32 и 2xx.xx.xx0.27/32.

Описываем routing-instances:
routing-instances {
    ANOTHER_CLIENT {
        description "ANOTHER CLIENT";
        instance-type vrf;
        interface ge-1/0/1.210;
        interface ge-1/0/7.207;
        interface ge-1/1/0.209;
        route-distinguisher xxxxx:10008;
        vrf-target target:xxxxx:10008;
        vrf-table-label;
        routing-options {
            static {
                route 0.0.0.0/0 next-hop 10.255.xxx.6;
                route 2xx.xx.xx1.0/28 next-table inet.0;
                route 2xx.xx.xx0.2/32 next-table inet.0;
                route 2xx.xx.xx0.27/32 next-table inet.0;
            }
            auto-export {
                family inet {
                    unicast {
                        rib-group Export_VRF_VoiceDevice_to_inet.0;
                    }
                }
            }
        }
    }
}
На маршрут 0.0.0.0/0 не обращаем внимания, это из другой оперы, не относящейся к теме данной статьи.
После этого нарисуем policy-options который затем будет использоваться в rib-groups-е:
policy-options {
    policy-statement VoiceDevice_in_VRF {
        term vd {
            from {
                route-filter 10.255.xxx.4/30 exact;
            }
            then accept;
        }
        then reject;
    }
}
И завершающий штрих, рисуем rib-groups:
routing-options {
    rib-groups {
        Export_VRF_VoiceDevice_to_inet.0 {
            import-rib inet.0;
            import-policy VoiceDevice_in_VRF;
        }
    }
    router-id 9x.xxx.xxx.x9;
    autonomous-system xxxxx;
}

середа, 14 листопада 2012 р.

Обновить все установленные модули Perl с CPAN

Обновить с CPAN-а все установленные в системе perl-модули можно одной командой:
sudo perl -MCPAN -e 'CPAN::Shell->notest(install => CPAN::Shell->r)'
при этом останется лишь ответить на ряд вопросов и дождаться окончания процесса ;)

вівторок, 2 жовтня 2012 р.

JunOS: архивирование конфигурации при внесении изменений


set system archival configuration transfer-on-commit
set system archival configuration archive-sites user@backup.host:/backup/juniper/

Cisco vs Juniper - команды

Сравнительная таблица команд Cisco IOS и Juniper OS.
Cisco Command Juniper Command Co-Ordinating Definition
show run sh configuration Show running configuration
sh ver sh ver Show version
show ip interface brief show interface terse displays the status of interfaces configured for IP
show interface [intfc] show interfaces [intfc] detail displays the interface configuration, status and statistics.
show controller intfc show interfaces intfc extensive displays information about a physical port device
show interface | incl (proto|Desc) show interfaces description displays the interface configuration, status and statistics
show ip route show route displays summary information about entries in the routing table
show ip bgp summary show bgp summary displays the status of all Border Gateway Protocol (BGP) connections
show ip bgp net mask show route protocol bgp prefix will show you how that route is being advertised, look for the first line
show ip bgp net mask longer-prefixes show route range prefix will show you how that route is being advertised, look for the first line
show ip bgp regexp AS-regexp show route aspath-regexp "AS-regexp" displays routes matching the autonomous system (AS) path regular expression
show ip bgp neighbors neigh received-routes show route receive-protocol bgp neigh

show route source-gateway neigh protocol bgp
Shows whether a neighbor supports the route refresh capability
show ip bgp neighbor neigh advertised-routes show route advertising-protocol bgp neigh Shows whether a neighbor supports the route refresh capabilty
show clns neighbors show isis adjacency displays both ES and IS neighbors
show clns interface show isis interface shows specific information about each interface
show ip route isis show isis routes displays the current state of the the routing table
show isis topology show isis spf displays a list of all connected routers in all areas
show ip ospf interface show ospf neighbor shows neighbor ID, Priority, IP, & State if the neighbor router, dead time.
show ip ospf interface show ospf interface shows neighbor id, pri, state, dead time, address and interface
show ip route ospf show ospf route display the current state of the routing table
show ip ospf database show ospf database display list of information related to the OSPF database for a specific communication server
show version show version, show system uptime display the system hardware config., software version, and name and source of configuration files and boot images
show diags show chasis hardware displays power-on diagnostics status
show processes cpu show system process displays utilization statistics
show tech-support request support info displays the current software image, configuration, controllers, counters, stacks, interfaces, memory and buffers
show logging show log messages display the state of logging to the syslog
show route-map name show policy name displayall route-maps configured or only the one specified
show ip prefix-list name show policy name display information about a prefix list or prefix list entries
show ip community-list list configure, 
show policy-options community name
display routes that are permitted by BGP community list
show environment all show chassis  environment displays temperature and voltage information on the console
ping dest ping dest rapid (for cisco like output)
ping dest (for unix like output)
to check to see if a destination is alive
ping (setting source int) ping dest bypass-routing to check to see if a destination is alive
terminal monitor monitor start messages Change console terminal settings
terminal no monitor monitor stop Change console terminal settings
terminal length 0 set cli screen-length 0 sets the length for displaying command output
Слямзил туточки networking.ringofsaturn.com.

JunOS: BGP маршруты - advertised и received

Как это делается в Cisco IOS:
IOS# show ip bgp neighbor x.x.x.x advertised-routes
IOS# show ip bgp neighbor x.x.x.x received-routes
Как это делается в JunOS:
JUNOS> show route receive-protocol bgp x.x.x.x
JUNOS> show route advertising-protocol bgp x.x.x.x

netfilter ip conntrack: переполнение

Что делать если вдруг в syslog вывалится такое сообщение об ошибке?
ip_conntrack: table full, dropping packet.

Для начала не помешает проверить величину максимального количества записей которое может отследить ip conntrack:
$ sysctl net.ipv4.netfilter.ip_conntrack_max
если значение мало или по каким либо причинам вам кажется, что оно мало, то имеет смысл его увеличить:
$ sudo sysctl -w net.ipv4.netfilter.ip_conntrack_max=65535
Чтобы при следующей перезагрузке это значение было восстановлено не забудьте добавить его в /etc/sysctl.conf.

субота, 29 вересня 2012 р.

Шейпим трафик, используя ifb и hash фильтры tc

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

Итак, есть следующая схема сети:

На сервере присутствуют две сетевых карты:
  • eth0 - ip 192.168.0.10/24, смотрит в мир и на ней поднят nat
    iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.0.10
  • eth1 - ip 192.168.200.254/24, смотрит в локальную сеть.
Шейпить можно только исходящий трафик с интерфейса. Для клиентов (pc0 - ip 192.168.200.10 и pc1 - ip 192.168.200.20) скорость закачки (download) шейпим на интерфейсе eth1, т.к. для этого интерфейса трафик будет исходящим в сторону клиента.

Логично для отдачи (upload) использовать eth0, но тут есть один нюанс, на этом интерфейсе прописан nat и шейпить на нем исходящий трафик от клиентов не получиться. Чтобы решить данную проблему, завернём весь входящий трафик от клиентов на интерфейсе eth1 в виртуальный интерфейс ifb0, тем более, на данный момент, поддержка IFB есть в ядре.

Для начала нарежем download:
  • Создаем корневую дисциплину на интерфейсе eth1:
    tc qdisc add dev eth1 root handle 1: htb default 20
  • Далее создаем корневой класс для наших клиентских классов. Скорость у него будет 1 mbit, для тестов достаточно:
    tc class add dev eth1 parent 1: classid 1:1 htb rate 1024kbit
  • Теперь создадим таблицу 10 на 256 ячеек:
    tc filter add dev eth1 parent 1:0 prio 1 handle 10: protocol ip u32 divisor 256
  • Создаем фильтр, направлящий весь трафик в хеш таблицу с ID 10:
    tc filter add dev eth1 parent 1:0 protocol ip u32 ht 800:: match ip dst 192.168.200.0/24 hashkey mask 0x000000ff at 16 link 10:
  • Ну а теперь нарежем скорость для наших двух клиентов, для pc0 - 256 kbit, а для pc1 - 512 kbit:
    • Создаем класс 100 со скоростью 256 kbit для pc0:
      tc class add dev eth1 parent 1:1 classid 1:100 htb rate 256kbit ceil 256kbit prio 2 quantum 15365
    • Создаем дисциплину шейпирования для конечного класса:
      tc qdisc add dev eth1 parent 1:100 handle 100: sfq perturb 10
    • Заворачиваем весть трафик для ip 192.168.200.10 в класс 100:
      tc filter add dev eth1 protocol ip prio 2 u32 ht 10:a: match ip dst 192.168.200.10/32 flowid 1:100
    • То же самое, но для pc1:
      tc class add dev eth1 parent 1:1 classid 1:200 htb rate 512kbit ceil 512kbit prio 2 quantum 15365
      tc qdisc add dev eth1 parent 1:200 handle 200: sfq perturb 10
      tc filter add dev eth1 protocol ip prio 2 u32 ht 10:14: match ip dst 192.168.200.20/32 flowid 1:200
  • Весь трафик, который не подпадает под указанные правила будет заворачиваться в класс по умолчанию 20:
    tc class add dev eth1 parent 1:1 classid 1:20 htb rate 32kbit ceil 32kbit prio 2 quantum 15365
    tc qdisc add dev eth1 parent 1:20 handle 20: sfq perturb 10

Теперь upload. Для этого будем использовать виртуальный интерфейс ifb0, куда будет заворачиваться весь входящий трафик от пользователей на интерфейс eth1.
  • Подключаем модуль ядра для ifb:
    modprobe ifb
  • Поднимаем интерфейс ifb0:
    ip link set dev ifb0 up
  • Создаем корневую дисциплину для входящего трафика на интерфейсе eth1:
    tc qdisc add dev eth1 ingress
  • Теперь непосредственно заворачиваем трафик в ifb0:
    tc filter add dev eth1 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0
  • А далее по аналогии с исходящим трафиком с интерфейса eth1:
    • Создаем корневую дисциплину и класс:
      tc qdisc add dev ifb0 root handle 1: htb default 20
      tc class add dev ifb0 parent 1: classid 1:1 htb rate 1024kbit
    • Описываем правила для pc0:
      tc class add dev ifb0 parent 1:1 classid 1:100 htb rate 256kbit ceil 256kbit prio 2 quantum 15365
      tc qdisc add dev ifb0 parent 1:100 handle 100: sfq perturb 10
      tc filter add dev ifb0 protocol ip prio 2 u32 ht 800:: match ip src 192.168.200.10/32 flowid 1:100
    • Теперь для pc1:
      tc class add dev ifb0 parent 1:1 classid 1:200 htb rate 512kbit ceil 512kbit prio 2 quantum 15365
      tc qdisc add dev ifb0 parent 1:200 handle 200: sfq perturb 10
      tc filter add dev ifb0 protocol ip prio 2 u32 ht 800:: match ip src 192.168.200.20/32 flowid 1:200
  • Ну и про класс по умолчанию не забываем:
    tc class add dev ifb0 parent 1:1 classid 1:20 htb rate 32kbit ceil 32kbit prio 2 quantum 15365
    tc qdisc add dev ifb0 parent 1:20 handle 20: sfq perturb 10
    
psht 10:14: ; ht 10:a: ; ht 800:: - это значения не в десятичной, а шестнадцатеричной системе исчисления.

пʼятниця, 28 вересня 2012 р.

Дополнительные атрибуты

Для начала небольшой примерчик:
root@terminal:/tmp# touch text.txt
root@terminal:/tmp# ls -l text.txt 
-rw-r--r-- 1 root root 0 2012-09-28 18:41 text.txt
root@terminal:/tmp# lsattr text.txt 
-----------------e- text.txt
Теперь о том, что всё это значит.
Через команду chattr можно добавить и удалить дополнительные атрибуты. Какие же они бывают?

Usage: chattr [-RVf] [-+=AacDdeijsSu] [-v version] files...
  • i: Файл с установленным атрибутом 'i' становится полностью не модифицируемым (недосягаемым): он не может быть удален или переименован, никакие ссылки не могут быть созданы на этот файл и никакие данные не могут быть записаны в него. Только суперпользователь или процесс, обладающий возможностью CAP_LINUX_IMMUTABLE может установить или очистить такой атрибут.
    root@terminal:/tmp# chattr +i text.txt 
    root@terminal:/tmp# lsattr text.txt 
    ----i------------e- text.txt
    root@terminal:/tmp# echo test >> text.txt 
    bash: text.txt: Отказано в доступе
    root@terminal:/tmp# chattr -i text.txt 
    root@terminal:/tmp# echo test >> text.txt 
  • j: Для файла с установленным атрибутом 'j' все его данные прежде, чем быть записанными непосредственно в файл, сохраняются в журнал, правда, это происходит в том случае, если файловая система смонтирована с опциями "data=ordered" или "data=writeback". Когда файловая система смонтирована с опцией "data=journal" все данные файла уже журналируются и этот атрибут не имеет никакого эффекта. Только суперпользователь или процесс, обладающий возможностью CAP_SYS_RESOURCE, может установить или очистить этот атрибут.
  • s: при удалении файла с установленным атрибутом 's' выполняется обнуление его блоков и запись их обратно на диск.
  • S: модифицируя файл с атрибутом `S', внесенные изменения синхронно записываются на диск; использование этого атрибута эквивалентно применению опции монтирования `sync' к подмножеству расположенных файлов.
  • u: при удалении файла с атрибутом 'u', его содержимое сохраняется (остается не тронутым) на диске. Это позволяет пользователю в последующем восстановить такой файл.
  • d: указывает на то, что не нужно делать резервные копии файла. Файл будет проигнорирован командой dump.
  • а: указывает, что в файл можно добавлять информацию, но нельзя удалять.
  • A: не обновлять время доступа к объекту. Теоретически установка этого атрибута должна повысить производительность файловой системы и соответственно системы в целом.
  • c: файл использующий этот атрибут автоматически сжимается ядром при записи на диск. При чтении с диска он автоматически будет распакован.
  • D: при изменении директории с установленным флагом все изменения синхронно записываются на диск.

Дополнительно можно почитать тут https://rstcenter.com/forum/35191-advanced-file-permissions-extended-attributes.rst

четвер, 9 серпня 2012 р.

Как использовать Tor в Debian GNU/Linux: Google Chrome

Однако же отвык я от огненной лисы и её клонов, но чертовски привык к Google Chrome, а потому возник вопрос: "Как использовать Tor в Google Chrome?". Как использовать Tor с одним из свободных клонов огеннной лисы было написано в предыдущей заметке.

Устанавливаем Tor. Открываем настройки Google Chrome, открываем расширенные настройки, находим кнопочку "Изменить настройки прокси-сервера..." и жмём её. В появившемся окне выбираем пункт которые позволяет вбить настройки прокси-сервера вручную (Use manually specified proxy configuration), в пункте SOCKS Proxy прописываем ip-адрес 127.0.0.1 и порт 9050.

Нажимаем "Ok". Ура, мы заtorены!

Если хотите ходить в "эти ваши Интернеты" по разным правилам, где используя Tor, а где нет, то можете установить в Google Chrome плагин Proxy Switchy!, очень гибкий в настройке плагин, позволяет использовать несколько наборов proxy-серверов.

Кроме всего прочего, всегда остаётся возможность использовать "родной" TorBrowser.

Как использовать Tor в Debian GNU/Linux

Для начала, что такое Tor? Wikipedia описывает этот сервис следующим образом:
Tor (сокр. от англ. The Onion Router) — свободное программное обеспечение для реализации второго поколения так называемой «луковой маршрутизации». Это система, позволяющая устанавливать анонимное сетевое соединение, защищённое от прослушивания. Рассматривается как анонимная сеть, предоставляющая передачу данных в зашифрованном виде. Написана преимущественно на языке программирования Си и на конец 2010 года имеет более 100 000 строк программного кода.
С помощью Tor пользователи могут сохранять анонимность при посещении веб-сайтов, публикации материалов, отправке сообщений и при работе с другими приложениями, использующими протокол TCP. Безопасность трафика обеспечивается за счёт использования распределённой сети серверов (нод — «узлов»), называемых «многослойными маршрутизаторами» (onion routers). Технология Tor также обеспечивает защиту от механизмов анализа трафика, которые ставят под угрозу не только анонимность пользователя, но также конфиденциальность бизнес-данных, деловых контактов и др. Tor оперирует сетевыми уровнями onion-маршрутизаторов, позволяя обеспечивать анонимные исходящие соединения и анонимные скрытые службы.
Итак, хоть в репозитории и есть Tor, но подключим его родной репозиторий:
Внимание! В Вашем случае дистрибутив может оказаться на sid ;)
# echo "deb http://deb.torproject.org/torproject.org sid main" /etc/apt/sources.list.d/tor.list
Далее:
$ gpg --keyserver keys.gnupg.net --recv 886DDD89
$ gpg --export A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89 | sudo apt-key add -
$ sudo aptitude update
$ sudo aptitude install deb.torproject.org-keyring
$ sudo aptitude install tor
Ну вот, теперь tor нас слушает на порту 9050 по адресу 127.0.0.1. При желании можете дать доступ к своему tor'у участникам своей сети, но это, как говорится, на вкус и цвет.
Однако установить tor мало, надо ещё найти браузер или расширение к своему любимому браузеру которое умело бы именно через tor выходить в Сеть. Таковое имеется, установим его:
$ sudo aptitude install iceweasel-torbutton
iceweasel это ни что иное как свободный firefox ;) iceweasel-torbutton. это расширение к этому чудному браузеру. Посмотреть и настроить это расширение можно запустив браузер и зайдя в Инструменты -> Дополнения (можно просто нажать Ctrl+Shift +A):
 Заходим в настройки Torbutton:



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


Удачи, камрады ;)

Простой TCL скрипт на Cisco

Предположим, что мы хотим пропинговать по порядку несколько адресов. Конечно можно отдельно для каждого адреса вызвать ping и посмотреть результаты, а можно сделать так, предварительно переключившись в режим tclsh:
foreach address {
8.8.8.8
8.8.4.4
212.90.160.2
212.90.160.8
} { puts [ exec "ping $address" ] }
Результат будет выглядеть примерно так:
router#tclsh
router(tcl)#foreach address {
+>8.8.8.8
+>8.8.4.4
+>212.90.160.2
+>212.90.160.8
+>} { puts [ exec "ping $address" ] }

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 8.8.8.8, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 36/36/40 ms

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 8.8.4.4, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 36/36/40 ms

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 212.90.160.2, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/1 ms

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 212.90.160.8, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 1/1/4 ms

router(tcl)#

середа, 25 липня 2012 р.

Perl: сохраняем хэш (hash) в XML, считываем XML в хэш (hash)

Используем для этого модуль XML::Simple. Для дампа хэша используем Data::Dumper.
#!/usr/bin/perl

use strict;
use warnings;
use XML::Simple;
use Data::Dumper;
$Data::Dumper::Indent = 1;
$Data::Dumper::Terse = 1;
Имя XML-файла куда будем сохранять наш хэш:
my $conf_xml = 'serpol.xml';
Пример многоуровневого хэша:
my $routers = {
    "router0" => {
        user    => 'user0',
        password=> 'pass0',
        enable  => 'enab0',
        edgedev => {
            'switch00' => { type => "Cisco" },
            'switch01' => { type => "ExtremeNetworks" },
            'dslam0' => { type => "Alcatel 7324" }
        }
    },
    "router1" => {
        user    => 'user1',
        password=> 'pass1',
        enable  => 'enab1',
        edgedev => {
            'switch10' => { type => "Cisco" }
        }
    }
};
Вот таким вот образом мы сохраняем данные в XML-файл:
my $xml_os = XML::Simple->new();
open my $fh, '>:encoding(utf8)', $conf_xml or die "open($conf_xml): $!";
my $xml = $xml_os->XMLout( $routers,
    OutputFile => $fh,
    RootName => 'serpol',
    AttrIndent => 0,
    NoAttr => 0
);
close $fh;
undef $xml_os;
Вот, что у нас получилось:
<serpol>
  <router0 enable="enab0" password="pass0" user="user0">
    <edgedev name="dslam0" type="Alcatel 7324" />
    <edgedev name="switch00" type="Cisco" />
    <edgedev name="switch01" type="ExtremeNetworks" />
  </router0>
  <router1 enable="enab1" password="pass1" user="user1">
    <edgedev name="switch10" type="Cisco" />
  </router1>
</serpol>
А теперь прочитаем назад этот XML-файл в хэш:
my $xml_is = XML::Simple->new();
my $hash = $xml_is->XMLin( $conf_xml );
print Dumper( $hash );
undef $xml_is;
Дамп восстановленного хэша:
{
  'router1' => {
    'enable' => 'enab1',
    'password' => 'pass1',
    'user' => 'user1',
    'edgedev' => {
      'name' => 'switch10',
      'type' => 'Cisco'
    }
  },
  'router0' => {
    'enable' => 'enab0',
    'password' => 'pass0',
    'user' => 'user0',
    'edgedev' => {
      'dslam0' => {
        'type' => 'Alcatel 7324'
      },
      'switch01' => {
        'type' => 'ExtremeNetworks'
      },
      'switch00' => {
        'type' => 'Cisco'
      }
    }
  }
};

вівторок, 24 липня 2012 р.

Аналог iperf в Cisco

Запускаем приёмник. На маршрутизаторе Cisco необходимо выполнить нижеописанные команды. Значения в скобках — значения по умолчанию, которые вступают в силу по нажатию ENTER. В настройках можно изменить окно TCP для имититации работы рабочих станций.
#ttcp
transmit or receive [receive]:
buflen [8192]:
bufalign [16384]:
bufoffset [0]:
port [5001]:
sinkmode [y]:
rcvwndsize [2144]: 4096
show tcp information at end [n]:
ttcp-r: buflen=8192, nbuf=2048, align=16384/0, port=5001, rcvwndsize=4096 tcp

Теперь необходимо запустить передатчик:
#ttcp
transmit or receive [receive]: trans
Target IP address: 192.168.0.254
buflen [8192]:
nbuf [2048]: 50
bufalign [16384]:
bufoffset [0]:
port [5001]:
sinkmode [y]:
buffering on writes [y]:
show tcp information at end [n]:
ttcp-t: buflen=8192, nbuf=50, align=16384/0, port=5001 tcp -> 192.168.0.254

Когда соединение установлено, приемник выводит в строке состояния сообщение о том, что связь установлена. После завершения передачи, приемник выводит статистику тестирования, которая показывает количество переданных данных, время передачи, рассчитанную пропускную способность, количество операций ввода/вывода для чтения данных:
ttcp-r: accept from 192.168.0.253 (mss 1460, sndwnd 2144, rcvwnd 4096)
ttcp-r: 409600 bytes in 61064 ms (61.064 real seconds) (~5 kB/sec) +++
ttcp-r: 301 I/O calls ttcp-r: 0 sleeps (0 ms total) (0 ms average)
Аналогичным образом передатчик делает вывод в строке состояния, когда он подключается к получателю. Когда передача завершена, передатчик показывает свою статистику:
ttcp-t: connect (mss 1460, sndwnd 4096, rcvwnd 2144)
ttcp-t: 409600 bytes in 60504 ms (60.504 real seconds) (~5 kB/sec) +++
ttcp-t: 50 I/O calls
ttcp-t: 0 sleeps (0 ms total) (0 ms average)
Дополнительно можно почитать тут http://worm.org.ua/2010/12/ttcp-iperf-cisco/

понеділок, 16 липня 2012 р.

Debian: i386 параллельно с amd64

- Есть ли жизнь на Марсе?
- Тоже нет!

Добавить архитектуру i386 в дистрибутив amd64 в Debian'е сейчас не просто, а очень просто:
sudo dpkg --add-architecture i386
После чего наслаждаемся возможностью установки пакетов архитектуры i386.
Зачем это надо?
Ну, к примеру, совсем недавно в Debian Sid куда-то делся ia32-libs, а skype 64-й архитектуры отказался без него работать и рекомендовал себя удалить. Пришлось ставить skype архитектуры i386 и продолжить наслаждаться общением:
sudo dpkg -i ./skype-install-i386.deb
sudo apt-get install -f

субота, 7 липня 2012 р.

Использование разрешений POSIX в Linux

Томас Бёчлер (Tomas Bächler), перевод: attila
Оригинал http://archlinux.me/brain0/

В традиционных системах UNIX существовал единственный уровень привилегий: суперпользователь (root). Если вы root, вам позволено все. Но и простые пользователи иногда должны иметь возможность выполения привилегированных операций.

Есть два простых решения:
  1. временное получение прав суперпользователя, используя su или sudo;
  2. установка setuid бита на исполняемом файле.
В обоих случаях вы получаете привилегии суперпользователя целиком, и хотя таким образом обычно запустить только весьма ограниченное команд, ошибки в этих программах или библиотеках создают угрозу взлома. Злоумышленник может заставить делать программу то, для чего она изначально не предназначалась, вплоть до запуска командой оболочки root’а.

В 1997 году комитет по стандартам (POSIX 1003.1e) создал черновую версию стандарта расширений механизма защиты. Одно из таких расширений разбивает привилегии root на части, позволяя давать задача лишь часть его привилегий. Хотя этот стандарт так и остался черновиком, спецификация была завершена и фактически реализована в ядре Linux.

Начиная с версии 2.2, ядро Linux при выполнении системного вызова проверяет, есть ли у процесса необходимые разрешения, вместо проверки root ли вы. Процесс имеет три набора прав доступа: доступный (permitted), наследуемый (inheritable) и текущий (effective). Именно последний набор используется ядром при проверке, дозволяется ли процессу выполнение определенных операций. Наследуемые разрешения передаются новой программе при выполнении execve. Доступные же разрешения ограничивают множество всех возможных текущих разрешений, на которые только процесс может рассчитывать. Кроме того, процесс может добавлять в свой наследуемый набор только разрешения из доступного набора (если только у процесса не имеется разрешения CAP_SETPCAP в списке текущих, об этом позже).

Как процесс может управлять своими наборами разрешений, подробно описано в [4].

В ядре 2.6.24 был реализован механизм «файловых разрешений», позволяющий администратору присваивать разрешения определенным исполняемым файлам, которые получат пользователи, когда запустят их.

Полный список разрешений приведен в ман-странице capabilities (7) и в заголовочном файле /include/linux/capability.h. Примеры ниже будут касаться разрешения CAP_NET_RAW. Но прежде всего вы должны убедиться, что библиотека libcap 2.X установлена в системе. (Если вы используете Arch Linux, скорее всего, она уже установлена как зависимость coreutils).
$ pacman -Q libcap
libcap 2.19-1
$ pacman -Ql libcap | grep bin/
libcap /usr/sbin/
libcap /usr/sbin/capsh
libcap /usr/sbin/getcap
libcap /usr/sbin/getpcaps
libcap /usr/sbin/setcap
{
Для Debian'а:
$ aptitude show libcap2 libcap2-bin
$ apt-file show libcap2 | grep bin/ | grep -v doc
libcap2-bin: /sbin/capsh
libcap2-bin: /sbin/getcap
libcap2-bin: /sbin/getpcaps
libcap2-bin: /sbin/setcap
}

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

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

Итак, начнем. Файл /bin/ping традиционно имеет установленный setuid-бит для работы:
$ ls -l /bin/ping
-rwsr-xr-x 1 root root 30824 Фев 23 21:40 /bin/ping
Уберем его и установим текущий бит и CAP_NET_RAW разрешение:
$ chmod -s /bin/ping
$ setcap cap_net_raw=ep /bin/ping
$ getcap /bin/ping
/bin/ping = cap_net_raw+ep
ping продолжает работать! То же самое можно проделать и с traceroute. Но есть программы, с которыми это не проходит. Некоторые программисты считают нужным проверить, root ли вы, перед выполнение определенного системного вызова. Так, программа tcptraceroute содержит такой код:
if (getuid() & geteuid())
fatal("Got root?\n");
Эта программа не будет работать без прав суперпользователя, даже если разрешить CAP_NET_RAW.

Хорошо, но как сделать, чтобы привилегированные функции программы были доступны лишь некоторым пользователям? Чтобы решить эту проблему, Tomas Bächler написал небольшую утилиту, capsudo. Для работы этой утилиты необходмо наличие libcap и iniparser в системе. Сборка и установка выполняется командами make и make install. Исполняемый файл capsudo должен иметь установленное разрешение CAP_SETPCAP.  CAP_SETPCAP позволяет процессу добавлять в набор наследуемых любые разрешения, даже те, которые отсутствуют среди доступных, но не позволяют им быть доступными, пока не будет выполнена программа с установленным соотетсвтующим наследуемым разрешением файла.

Установим для /bin/ping CAP_NET_RAW в качестве наследуемого разрешения:
$ setcap cap_net_raw=ei /bin/ping
и добавим следующую секцию в /etc/capsudoers:
[ping]
caps = cap_net_raw
command = /bin/ping
users = user1 user2
allow_user_args = 1
Теперь пользователи user1 и user2 могут запускать ping без прав суперпользователя командой
capsudo ping 127.0.0.1
Просто команда `ping’ работать уже не будет, так как у файла /bin/ping есть только наследуемое разрешение, а не доступное. Процесс же capsudo, проверив права пользователя в /etc/capsudoers, добавляет CAP_NET_RAW-разрешение в список своих наследуемых разрешений (это ему позволено, так как у файла capsudo установлено разрешение CAP_SETPCAP). Когда capsudo запускает ping, наследуемое разрешение файла совпадает с наследуемым разрешением процесса и добавляется в список доступных (и, соответсвенно, текущих, так как у файла /bin/ping установлен текущий бит).

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

Итак, у файла /bin/ping разрешения остаются прежними
getcap /bin/ping
/bin/ping = cap_net_raw+ei
В /etc/pam.d/login добавляем строчку:
auth        required    pam_cap.so
Файл /etc/security/capability.conf приводим к виду:
cap_net_raw user1
none *
После входа в систему командная оболочка пользователя user1 будет иметь установленное наследуемое разрешение cap_net_raw. Действительно:
$ getpcaps $$
Capabilities for `3658': = cap_net_raw+i
Теперь пользователь user1 будет иметь возможность запускать программу ping, если заходит в систему обычным образом (и не будет иметь такой возможности, когда заходит, например, по ssh, так как использование модуля pam_cap прописано только в /etc/pam.d/login).

Ссылки:
[1] man 7 capabilities
http://www.kernel.org/doc/man-pages/online/pages/man7/capabilities.7.html
[2],[3] Tomas Bächler, его блог
http://archlinux.me/brain0/
http://archlinux.me/brain0/2009/07/28/using-posix-capabilities-in-linux-part-one/
http://archlinux.me/brain0/2010/01/05/using-posix-capabilities-in-linux-part-two/
[4] Серж Е. Халлин, «Разрешение POSIX для файлов: разделяем полномочия root»
http://www.ibm.com/developerworks/ru/library/l-posixcap/l-posixcap.html#
[5] Chris Friedhoff, POSIX Capabilities & File POSIX Capabilities
http://www.friedhoff.org/posixfilecaps.html

Примечение переводчика:
Слово ‘capability’ всюду переведено словом „разрешение“, как это сделано в [4].



Копипаст http://posix.ru/freenotes/linux/51, касательно Debian'а - отсебятина ;)

вівторок, 26 червня 2012 р.

Запрос к MSSQL на Perl из Linux

Собственно используем FreeTDS, /etc/freetds/freetds.conf:
[orion]
        host = 10.254.103.38
        port = 1433
        client charset = UTF-8
        tds version = 8.0
        text size = 20971520
Устанавливаем tdsodbc, unixodbc и libdbd-odbc-perl:
$ sudo aptitude install tdsodbc libdbd-odbc-perl unixodbc
Настраиваем UnixODBC, /etc/odbcinst.ini:
[FreeTDS]
Description = FreeTDS
Driver      = /usr/lib/odbc/libtdsodbc.so
Setup       = /usr/lib/odbc/libtdsS.so
UsageCount  = 1
Ну вот, теперь пишем запрос в Perl'е:
#!/usr/bin/perl -w

use strict;
use DBI;

my $dbh = DBI->connect('dbi:ODBC:server=orion;port=1433;driver=FreeTDS;tds_version=8.0', 'username', 'password', {PrintError => 0});
die "Unable for connect to server $DBI::errstr" unless $dbh;

my $rc;
my $sth;
    
#$sth = $dbh->prepare('select @@servername');
$sth = $dbh->prepare('SELECT [Caption] AS conn_details, 0 AS cnt_conn_details FROM [OrionDB].[dbo].[Nodes] GROUP BY [Caption] ORDER BY conn_details');
if($sth->execute) {
    while(my $dat = $sth->fetchrow_hashref) {
        foreach my $k (sort keys %{ $dat }) {
            print $k,"=>",${ $dat }{$k},"\n";
        }
    }
}

Чтение UTF16 в Perl

Попалась чудная программа, которая разработана под Windows и хранит свои данные хоть и в текстовом формате, но не в UTF8, который является привычным для Linux, а в UTF16.
Встала задача прочитать этот чудный файл в Perl'е, да так чтобы его содержимое было корректно воспринято.
Оказалось всё не просто, а очень просто:
foreach my $orionmap ( sort @orionmap ) {
    open my $FMAP, "<:encoding(utf16)", "$orionmap" || die "Can't open $orionmap for read: $!\n";
    while (<$FMAP>) {
        chomp;
        chop if /\r$/;
        print;
        print "\n";
    }
    close $FMAP;
}
Потом уже нашёл статью на Хабре где народ говорит о возможных граблях. Что-ж, как говорил один знакомый людоед: "Пожуём - увидим!".

середа, 6 червня 2012 р.

Сброс пароля учётной записи в Windows7


Случается, что пароль или забылся(особенно если он был сложный), или потерялся. В данном примере мы не будем пытаться узнать забытый пароль, мы его просто сбросим или поменяем.
Нам понадобится установочный диск Windows7 для активации скрытой учетной записи Администратора. Способ активации заключается в правке реестра из установочной среды.
Загружаемся с диска и нажимаем Shift+F10 для запуска командной строки. Вбиваем regedit и запускаем редактор реестра. Выделяем раздел HKEY_LOCAL_MACHINE и в меню выбираем Файл -> Загрузить куст.. (File -> Load hive..). Нам нужен будет файл с именем SAM, который находится в каталоге \Windows\System32\config на диске, где установлена Windows7. В запросе ввода имени куста — пишите что угодно. Теперь выбираем раздел HKEY_LOCAL_MACHINE\имя_куста\SAM\Domains\Account\Users\0001F4 и дважды кликаем по ключу F. Откроется редактор, в котором нужно перейти к первому числу в строке с номером 0038, это будет число 11. Меняем его на 10. На этом моменте осторожнее — поменять надо только это число, ничего не добавляя и не удаляя. Теперь выделяем загруженный куст HKEY_LOCAL_MACHINE\имя_куста\ и в меню выбираем Файл -> Выгрузить куст… (File -> Unload hive…), подтверждаем выгрузку куста.
Всё. Вынимаем диск и перезагружаемся. Теперь можно зайти под учетной записью Администратора(по умолчанию без пароля) и в панели управления пользователями поменять забытый пароль.

ps: Мопедик не мой, я только объявку дал ;)

вівторок, 5 червня 2012 р.

Skype + PulseAudio

С переходом на KDE как-то незаметно в жизнь вошёл PulseAudio. Недавно заметил, что в Skype перестал работать микрофон, хотя пока под Gnome использовался ALSA такой проблемы не существовало.
Решение достаточно простое - установить пакет pavucontrol и настроить с его помощью ввод с микрофона
aptitude install pavucontrol
Всё дело в том, что при первоначальной установке PulseAudio пакет pavucontrol не устанавливался автоматически, хотя именно с его помощью и настраивается PulseAudio.
А так всё достаточно просто и понятно.

четвер, 31 травня 2012 р.

Шифруемся и прячемся: стеганография

Кратко о предметной области.
Стеганография - в переводе с греческого дословно означает «тайнопись». Это наука о скрытой передаче информации путём сохранения в тайне самого факта передачи. В отличие от криптографии, которая скрывает содержимое секретного сообщения, стеганография скрывает само его существование.
Для достижения преследуемых в этой заметке целей в Debian GNU/Linux есть замечательный пакет - steghide:
A steganography hiding tool
Steghide is steganography program which hides bits of a data file in some of the least significant bits of another file in such a way that the existence of the data file is not visible and cannot be proven.

Steghide is designed to be portable and configurable and features hiding data in bmp, wav and au files, blowfish encryption, MD5 hashing of passphrases to blowfish keys, and pseudo-random distribution of hidden bits in the container data.
установим его:
$ aptitude install steghide
Теперь можем попробовать спрятать любой текст в изображении. Спрячем текст взяв его со стандартного ввода:
$ echo "Текст спрятанного сообщения" | steghide embed -cf image.jpg -p passw0rd -ef -
"Текст спрятанного сообщения" будет имплементирован в файл image.jpg поэтому если оригинал изображения дорог вам как память то предварительно создайте его копию.
Чтобы увидеть спрятанный текст проделаем обратную операцию:
$ steghide extract -sf image.jpg -p passw0rd -xf -
Ничего сложного! Можно посмотреть информацию о спрятанных данных:
$ steghide info image.jpg
"image.jpg":
  format: jpeg
  capacity: 4,9 KB
Try to get information about embedded data ? (y/n) y
Enter passphrase: 
  embedded data:
    size: 53,0 Byte
    encrypted: rijndael-128, cbc
    compressed: yes
А также получить список всех поддерживаемых алгоритмах шифрования, которые можно использовать совместно с опцией -e (--encryption):
$ steghide encinfo
encryption algorithms:
<algorithm>: <supported modes>...
cast-128: cbc cfb ctr ecb ncfb nofb ofb
gost: cbc cfb ctr ecb ncfb nofb ofb
rijndael-128: cbc cfb ctr ecb ncfb nofb ofb
twofish: cbc cfb ctr ecb ncfb nofb ofb
arcfour: stream
cast-256: cbc cfb ctr ecb ncfb nofb ofb
loki97: cbc cfb ctr ecb ncfb nofb ofb
rijndael-192: cbc cfb ctr ecb ncfb nofb ofb
saferplus: cbc cfb ctr ecb ncfb nofb ofb
wake: stream
des: cbc cfb ctr ecb ncfb nofb ofb
rijndael-256: cbc cfb ctr ecb ncfb nofb ofb
serpent: cbc cfb ctr ecb ncfb nofb ofb
xtea: cbc cfb ctr ecb ncfb nofb ofb
blowfish: cbc cfb ctr ecb ncfb nofb ofb
enigma: stream
rc2: cbc cfb ctr ecb ncfb nofb ofb
tripledes: cbc cfb ctr ecb ncfb nofb ofb
Спрятанный текст можно брать не только из стандартного ввода, но и из заранее подготовленного файла:
$ steghide embed -cf image.jpg -p passw0rd -ef secretfile.txt
Равно как и восстанавливать его из картинки:
$ steghide extract -cf image.jpg -p passw0rd -ef secretfile.txt
Кстати, интересный момент, можно прятать не только текст, но и изображение в изображении, главное чтобы размер того в чём прячем изначально был больше того, что прячем (не знаю на сколько - не проверял), а иначе рискуем получить ошибку следующего вида:
steghide: the cover file is too short to embed the data.
Для примера "спрячем" мой аватар в другой красивой картинке:
$ steghide embed -cf image.jpg -p passw0rd -ef gremlin-gizmo.jpg
Оригинал от полученного изображения по размеру не сильно отличается, равно как и по качеству:
$ ls -l image.*
-rw-r--r-- 1 olden olden 260660 Май 31 15:55 image.jpg
-rw-r--r-- 1 olden olden 250538 Май 31 15:55 image.orig.jpg
$ md5sum image.*
5c3dfbd17d4e8bfbe15006e2282e17c2  image.jpg
b2d51cdf620b9180daebb5a2dad4a186  image.orig.jpg
Аватарка:

Оригинал:

А вот тут спрятана аватарка:

Всё тайное рано или поздно становится явным!
$ steghide extract -sf image.jpg -p passw0rd -xf avatar.jpg
Сравним результаты:
$ md5sum gremlin-gizmo.jpg avatar.jpg 
4c9106a839c2e0c6d7e4ccd8b095ff6e  gremlin-gizmo.jpg
4c9106a839c2e0c6d7e4ccd8b095ff6e  avatar.jpg
и визуально:

Кстати, помимо сравнения размеров и md5sum для оригинального изображения и изображения со стеганограммой, интересно сравнить их ещё и визуально:
$ compare -verbose image.orig.jpg image.jpg diff.png
Прелюбопытнейший результат. А с первого взгляда на изображения и не скажешь, что в них столько различий.

У вас до сих пор не было паранойи?! Тогда мы идём к вам!!!

вівторок, 24 квітня 2012 р.

Ограничение доступа на Extreme Networks

Создаём полиси:

edit policy noc-telnet
(редактор а-ля vi, поэтому не составляет особого труда с ним освоиться)

Заполняем содержимым:
entry entry-10 {
 if match any {
    source-address xxx.xxx.xxx.xxx/32 ;
    source-address xxx.xxx.xxx.xxx/27 ;
 }
 then {
    permit;
 }
}
entry entry-20 {
  if {

 }
 then {
    deny;
 }
}
(В каком-то мануале читал, что в match any необходимо использовать вместо source-address nlry, но так policy не работало)
Подключаем полиси к сервису:
configure telnet access-profile noc-telnet

Посмотреть полиси можно так:
show policy noc-telnet

Если хотим что-то поменять в полиси то опять рисуем edit, а затем не забываем:
refresh policy noc-telnet

вівторок, 20 березня 2012 р.

Samba user account management tool (pdbedit)


Если Вы используете SAMBA в качестве контроллера домена Window, то управлять групповыми политиками необходимо с помощью утилиты - pdbedit.

В данной заметке хочу описать и привести примеры ее использования:
Просмотр перечня всех существующих груповых политик домена:
[root@router ~]# pdbedit -P ?
No account policy by that name!
Account policy names are:
min password length
password history
user must logon to change password
maximum password age
minimum password age
lockout duration
reset count minutes
bad lockout attempt
disconnect time
refuse machine password change
Samba политики домена NT4
NT4 policy Name Samba Policy Name NT4 Range Samba Range Samba Default
Maximum Password Age maximum password age 0 - 999 (days) 0 - 4294967295 (sec) 4294967295
Minimum Password Age minimum password age 0 - 999 (days) 0 - 4294967295 (sec) 0
Minimum Password Length min password length 1 - 14 (Chars) 0 - 4294967295 (Chars) 5
Password Uniqueness password history 0 - 23 (#) 0 - 4294967295 (#) 0
Account Lockout - Reset count after reset count minutes 1 - 99998 (min) 0 - 4294967295 (min) 30
Lockout after bad logon attempts bad lockout attempt 0 - 998 (#) 0 - 4294967295 (#) 0
*** Not Known *** disconnect time TBA 0 - 4294967295 0
Lockout Duration lockout duration 1 - 99998 (min) 0 - 4294967295 (min) 30
Users must log on in order to change password user must logon to change password 0/1 0 - 4294967295 0
*** Registry Setting *** refuse machine password change 0/1 0 - 4294967295 0

Просмотреть значение параметра политики, можно так:
[root@router ~]# pdbedit -P "НАЗВАНИЕ ПОЛИТИКИ"
min password length - минимальная длинна пароля, который можно задать. В данном случае пароль должен быть не меньше 8-ми символов.
[root@router ~]# pdbedit -P "min password length"
account policy "min password length" description: Minimal password length (default: 5)
account policy "min password length" value is: 8
password history - история пароля. Сохранять историю прежде вводимых паролей. Если указать, например значение "5", то старый пароль можно будет повтороно ввести только после 6-ти уникальных паролей.
[root@router ~]# pdbedit -P "password history"
account policy "password history" description: Length of Password History Entries (default: 0 => off)
account policy "password history" value is: 0
Пример, установим сохранение 3-х прежде введенных паролей:
[root@router ~]# pdbedit -P "password history" -C 3
account policy "password history" description: Length of Password History Entries (default: 0 => off)
account policy "password history" value was: 0
account policy "password history" value is now: 3
user must logon to change password - требовать смену пароля при следующем входе в систему.
[root@router ~]# pdbedit -P "user must logon to change password"
account policy "user must logon to change password" description: Force Users to logon for password change (default: 0 => off, 2 => on)
account policy "user must logon to change password" value is: 0
maximum password age - Запрос смены пароля пользователям. Тут указываем количество времени в секудах, на протяжении которого пароль можно не менять. С этого момента времени пароль будет меняться в соответствии с политикой.
[root@router ~]# pdbedit -P "maximum password age"
account policy "maximum password age" description: Maximum password age, in seconds (default: -1 => never expire passwords)
account policy "maximum password age" value is: 4294967295
Пример, установим максимальный срок действия пароля 90дней:
[root@router ~]# pdbedit -P "maximum password age" -C 777600
minimum password age - Минимальный срок действия пароля в секундах (по умолчанию: 0 => позволяют немедленного изменения пароля).
[root@router ~]# pdbedit -P "minimum password age"
account policy "minimum password age" description: Minimal password age, in seconds (default: 0 => allow immediate password change)
account policy "minimum password age" value is: 0
Пример, установим минимальный срок действия пароля 80дней:
[root@router ~]# pdbedit -P "minimum password age" -C 691200
lockout duration - время блокировки при неудачном входе. Устанавливаем в минутах, или ставим значение -1 - "на всегда" (учетная запись должна быть повторно включаться вручную).
[root@router ~]# pdbedit -P "lockout duration"
account policy "lockout duration" description: Lockout duration in minutes (default: 30, -1 => forever)
account policy "lockout duration" value is: 1
reset count minutes - сброс счетчика минут, блокировки учетной записи.
[root@router ~]# pdbedit -P "reset count minutes"
account policy "reset count minutes" description: Reset time after lockout in minutes (default: 30)
account policy "reset count minutes" value is: 30
bad lockout attempt - блокировка при неудачной попытке входа в домен.
[root@router ~]# pdbedit -P "bad lockout attempt"
account policy "bad lockout attempt" description: Lockout users after bad logon attempts (default: 0 => off)
account policy "bad lockout attempt" value is: 3
Пример, в данном случае после 3-х неудачных попыток ввода пароля пользователем, он блокируется.
[root@router ~]# pdbedit -P "bad lockout attempt" -C 3
account policy "bad lockout attempt" description: Lockout users after bad logon attempts (default: 0 => off)
account policy "bad lockout attempt" value was: 3
account policy "bad lockout attempt" value is now: 3
disconnect time - время до разъединения. Возможные значения: 0 - отключать пользователя, -1 - не отключать.
[root@router ~]# pdbedit -P "disconnect time"
account policy "disconnect time" description: Disconnect Users outside logon hours (default: -1 => off, 0 => on)
account policy "disconnect time" value is: 4294967295
refuse machine password change - отказываются менять пароль машины.
[root@router ~]# pdbedit -P "refuse machine password change"
account policy "refuse machine password change" description: Allow Machine Password changes (default: 0 => off)
account policy "refuse machine password change" value is: 0

понеділок, 19 березня 2012 р.

syslog-ng: принимаем сообщения syslog в сети

Для начала, поменяем rsyslog на syslog-ng, так как последним представляется более гибким и удобным (хотя на вкус, как и на цвет, все фломастеры разные).
$ sudo aptitude install syslog-ng
В принципе настройки по-умолчанию у него вполне вменяемые, но цель данной статьи показать возможность приёма сообщения syslog от устройств находящихся в сети.
Сама идеология syslog-ng достаточно простая. Главный конфигурационный файл логически разбит на секции:
  • опции запуска и работы демона (options);
  • источники сообщений syslog (source)
  • назначения для вывода журналов (destination);
  • описание фильтров (filter);
  • описание журналов (log).

С блоком options всё более-менее ясно, выглядит он примерно так:
options {
    long_hostnames(off);
    flush_lines(0);
    use_dns(no);
    use_fqdn(no);
    owner("root");
    group("adm");
    perm(0640);
    stats_freq(0);
    bad_hostname("^gconfd$");
    ts_format(rfc3164);
    create_dirs(yes);
    keep_hostname(yes);
};
В общем-то опции имеют вполне вменяемые названия и об их назначении можно легко догадаться. Скажем так, из опций которые я добавил к конфигурации по-умолчанию, идущей после установки пакета из репозитория, только три: ts_format, create_dirs и keep_hostname.

Двигаемся далее - source. Описание источника s_src оставляем как есть и добавляем слушатель к своему сетевому интерфейсу:
source s_net { udp(ip(172.16.0.1)); };
ip-адрес должен быть прописан на сетевом интерфейсе, s_net говорит о том,что слушать входящие сообщения необходимо на адресе 172.16.0.1 по порту udp/514.

Далее формируем фильтр для принимаемых syslog сообщений:
filter f_orion { netmask(10.254.103.38/32); };
Под действия этого фильтра попадают все сообщения пришедшие с ip-адреса 10.254.103.38. Маску сети можно задать как /30, /29 и т.д., таким образом можно расширить диапазон источников сообщений. Можно задать несколько сетей источников, например так:
filter f_orion { netmask(10.254.103.38/32) or netmask(172.16.0.0/27); };
Также можно отфильтровать некоторые нежелательные сообщения:
filter f_orion { netmask(10.254.103.38/32) and not match("%FAN-3-FAN_" value("MESSAGE")); };
Тут говорится о том, что все сообщения в которых будет встречено вхождение %FAN-3-FAN_ не будут включены в дальнейшую обработку (not).
Вместо netmask можно использовать host:
filter f_orion { host(10.254.103.38) and not match("%FAN-3-FAN_" value("MESSAGE")); };
но не каждому это подойдёт, например если источник из которого принимается syslog-сообщение не совпадает с устройством его генерирующим то в журнал, при использовании host, будет записан адрес устройства с которого принято сообщение, а не то устройство которое его сгенерировало. Это актуально при настройке syslog-сервера на пересылку сообщений на другой syslog-сервер. В случае когда источник syslog-сообщения и устройство на котором генерируется это сообщение совпадают то директивы netmask и host должны себя вести идентично.

Пришло время описать сам журнал, связав источник, фильтр и назначение в одно правило:
log { source(s_net); filter(f_orion); destination(d_orion); };

Отдельно хочется заметить, что в используемой сейчас нами версии Orion'а форвард syslog-сообщений работает несколько "криво", поэтом альтернативой был выбран не Forward, а Send, в котором и формируется более "вменяемое" сообщение, с нормально отрезолвленым названием узла сформировавшего исходное  сообщение, которое уже можно анализировать. Ну, а далее журналы по разным узлам разбираются примерно таким образом:
destination d_device_name { file("/var/log/noc-orion/orion.device_name.log"); };
filter f_device_name { netmask(10.254.103.38/32) and match("\\\[device_name\\\]" value("MESSAGE")) and not match("%FAN-3-FAN_" value("MESSAGE")); };
log { source(s_net); filter(f_device_name); destination(d_device_name); };

Syslog Server: поддерживаемые макросы

Нижеследующие макросы можно использовать при формировании сообщения к SysLog серверу, например, из монитора Solarwinds Orion:

  • ${HOSTNAME}
  • ${IP}
  • ${FACILITY}
  • ${FACILITYNAME}
  • ${SEVERITY}
  • ${SEVERITYNAME}
  • ${MESSAGETIME}
  • ${TAG} or ${SYSLOGTAG}
  • ${DISCARD}
  • ${MESSAGE}
  • ${MESSAGETYPE}
  • ${NOW}
  • ${UTC}
  • ${DATETIME}
  • ${DATE}
  • ${LONGDATE}
  • ${MEDIUMDATE}
  • ${TIME}
  • ${LONGTIME}
  • ${MEDIUMTIME}
  • ${DOW}
  • ${DAY} or ${D}
  • ${DD}
  • ${ABREVIATEDDOW}
  • ${LOCALDOW}
  • ${MONTH} or ${M}
  • ${MM}
  • ${MMM}
  • ${MONTHNAME} or ${MMMM}
  • ${LOCALMONTHNAME}
  • ${DAYOFYEAR}
  • ${YEAR2}
  • ${YEAR4} or ${YEAR}
  • ${HOUR} or ${H}
  • ${HH}
  • ${N} or ${MINUTE}
  • ${S} or ${SECOND}
  • ${AMPM}
Более подробно о макросах можно почитать, например, в руководстве syslog-ng v2.0 reference manual.

середа, 7 березня 2012 р.

Как конвертировать Debian Wheezy (или более новую) систему в btrfs


Новый GRUB может обрабатывать /boot раздел в формате btrfs, так что теперь не нужно иметь отдельный раздел отформатированный в ext2/3/4.

Далее предполагаем, что вся ваша файловая система представлена одной партицией. Если же у вас под каждый раздел /usr/, /var и т.д. создана отдельная партиция то модифицируйте их по отдельности, согласно приведённой ниже инструкции.

Итак, приступим…

1. Сделайте бэкап раздела. Никто не несёт ответственности за возможную утерю данных кроме вас самих!
2. Скачайте и запишите на CD или флешке Debian Wheezy (или более новый).
3. Загрузитесь с созданного загрузочного образа.
4. fsck -f /dev/sdaX (где /dev/sdaX это root-партиция)
5. Проверьте доступен ли ваш любимый текстовый редактор (vim, ed, mine и т.д.) и btrfs-tools, если нет то установите их.
6. btrfs-convert /dev/sdX
7. mount /dev/sdX /mnt
8. Подмонтируйте в /mnt разделы /proc, /dev, /sys:
mount -o bind /dev /mnt/dev
mount -o bind /sys /mnt/sys
mount -o bind /proc /mnt/proc
9. chroot /mnt
10. Отредактируйте /etc/fstab, найдите строку для root-раздела (/) и смените UUID на прямое описание /dev/sdX, смените тип файловой системы с ext3/ext4 на btrfs, уберите «лишние» опции оставив просто defaults, замените последнюю цифру 1 на 0.
11. ls -la /boot
Вы должны увидеть файл вроде: initrd.img-3.1.0-1-686-pae.
Строка после 'initrd.img-' это версия ядра которую необходимо использовать далее.
12. mkinitramfs 3.1.0-1-686-pae -o /boot/initrd.img-3.1.0-1-686-pae
13. grub-install /dev/sdX
14. update-grub
15. exit (выходим из chroot окружения)
16. Размонтируем в /mnt разделы /proc, /dev, /sys и сам /mnt:
umount /mnt/proc
umount /mnt/dev
umount /mnt/sys
umount /mnt
17. Перегружаемся и молимся.
18. Через некоторое время система должна загрузиться, вводим 'mount' и убеждаемся, что она работает на btrfs.
19. Выполните:
update-initramfs -u -t -kall

Если всё прошло успешно то можно смело удалять бэкап /ext2_saved который был создан в процессе преобразования файловой системы. Делаем это так:
btrfs subvolume delete /ext2_saved


ps: Вольный перевод статьи.

понеділок, 5 березня 2012 р.

Samsung AllShare и Linux

Купили телевизор Samsung и обнаружили на нём AllShare, но совершенно не хочется ставить ради использования этой функции Windows? Тогда читаем ниже.

Что такое AllShare, при более близком рассмотрении, и с чем её едят? Ну у корейцев видимо всё не как у людей и оттого они обозвали то, что все называют DLNA по своему - AllShare, ну чтобы враги не догадались, а может оттого, что поддерживают DLNA коряво и не получили соответствующей сертификации, а использовать ой как хочется.

А что такое DLNA? DLNA (Digital Living Network Alliance) — стандарт, позволяющий совместимым устройствам передавать и принимать по домашней сети различный медиа-контент (изображения, музыку, видео), а также отображать его в режиме реального времени. Это технология для соединения домашних компьютеров, мобильных телефонов, ноутбуков и бытовой электроники в единую цифровую сеть. Устройства, которые поддерживают спецификацию DLNA, по желанию пользователя могут настраиваться и объединяться в домашнюю сеть в автоматическом режиме.
Средой передачи медиаконтента обычно является домашняя локальная сеть (IP-сеть). Подключение DLNA-совместимых устройств к домашней сети может быть как проводным (Ethernet), так и беспроводным (Wi-Fi).

Выбор DLNA сервера может показаться не тривиальной задачей, тем более, что выбор достаточно велик. У себя дома, под домашним Debian'ом решил поднять minidlna.

Итак, с чего же начать? Ну как всегда, с установки зависимостей, скачки исходников и их компиляции.

$ sudo aptitude install libavcodec-dev libavformat-dev libavutil-dev libflac-dev libvorbis-dev libogg-dev libid3tag0-dev libexif-dev libjpeg-dev
$ wget "http://downloads.sourceforge.net/project/minidlna/minidlna/1.0.24/minidlna_1.0.24_src.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fminidlna%2Ffiles%2Fminidlna%2F1.0.24%2F&ts=1330931715&use_mirror=ignum" -O minidlna_1.0.24_src.tar.gz
$ tar xzf minidlna_1.0.24_src.tar.gz
$ cd minidlna-1.0.24/
$ make && sudo make install && sudo cp minidlna.conf /etc/

Теперь, когда сервер DLNA скомпилирован и установлен, приступим к его настройке. В этом, собственно, тоже не должно возникнуть никаких сложностей.

$ sudo vim /etc/minidlna.conf

В network_interface прописываем через запятую интерфейсы на которых будет жить сервер DLNA.
Настройка media_dir может не ограничиваться лишь одним ресурсом, этих строк может быть много. media_dir может включать либо просто имя каталога, либо начинаться с A, V или P, что означает, соответственно, назначение ресурса - аудио, видео, картинки.
friendly_name описывает имя которое будет светиться в списке источников для DLNA ресурсов.
notify_interval этот параметр описывает интервал через который происходит уведомление о вновь появившихся ресурсах на DLNA сервере. Значение по-умолчанию в 900 секунд наверное всё-таки слишком велико.
db_dir это директория где DLNA сервер будет хранить свой кеш о представляемых объектах.
log_dir - директория где будет вестись журнал DLNA сервера.

Теперь настало время произвести первый запуск нашего DLNA сервера и посмотреть, что при этом происходит:

minidlna -d -f /etc/minidlna.conf

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

На этом можно было бы и закончить, но ведь наверняка будет очень лениво каждый раз запускать сервер в ручную, а оттого создаём  стартап-скрипт и помещаем его в /etc/init.d:
#! /bin/sh
### BEGIN INIT INFO
# Provides: minidlna
# Required-Start: $local_fs $remote_fs $syslog $network
# Should-Start:
# Required-Stop: $local_fs $remote_fs $syslog $network
# Should-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Minidlna
# Description: DLNA Media Server
### END INIT INFO

## EDIT FROM HERE

# Installation details
MINIDLNA="/usr/sbin/minidlna"
ARGS="/etc/minidlna.conf"

# Where to keep a log file
MINIDLNA_LOG="/var/log/minidlna.log"

# Where the PID lives
PID_FILE="/var/run/minidlna.pid"

## STOP EDITING HERE

# The path that is to be used for the script
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

set -e

# Only start if we can find the minidlna.conf.
test -x $MINIDLNA || exit 0

# Parse command line parameters.
case $1 in
  start)
 echo -n "Starting MiniDLNA: "
 $MINIDLNA -f $ARGS -P $PID_FILE  >> $MINIDLNA_LOG 2>&1
 echo "ok"
 ;;
  stop) 
  echo -n "Stopping MiniDLNA: "
    for pidf in `/bin/ls $PID_FILE 2>/dev/null`; do
            if [ -s $pidf ]; then
                kill `cat $pidf` >/dev/null 2>&1
            fi
   rm -rf $PIF_FILE
    done 
 echo "ok"
 ;;
  restart|reload|force-reload)
 echo "Restarting MiniDLNA: "
 
        $0 stop
 sleep 2
 $0 start
 
 ;;
  *)
 # Print help
 echo "Usage: /etc/init.d/minidlna {start|stop|restart|reload|force-reload}"
 exit 1
 ;;
esac

exit 0

Содержимое скрипта было позаимствовано (зачем изобретать велосипед?), единственно, что были добавлены заголовки для нормального выполнения update-rc.d:

$ sudo update-rc.d minidlna defaults

Уровни выполнения актуальны для Debian, Ubuntu и, наверное, производных дистрибутивов. В принципе поменяв уровни выполнения этот скрипт можно использовать и в других дистрибутивах поддерживающих LSB заголовки.

Собственно на этом с настройкой сервера покончено. Ну, а на телевизоре сначала разрешаем AllShare, затем находим все DLNA сервера в широковещательном домене, добавляем их, видим их в Source и наслаждаемся их присутствием, и просмотром медиаконтента.

ps: Справедливости ради отмечу, что в репозитории Debian'а есть пакет mediatomb и тем кому лень возиться со сборкой minidlna могут установить и настроить его:

$ sudo aptitude install mediatomb

вівторок, 28 лютого 2012 р.

Perl: какие модули установлены?

Как узнать какие дополнительные модули для Perl установлены?
Для начала, если не установлен, ставим perl-modules:
sudo aptitude install perl-modules
Затем рисуем небольшой скрипт:
#!/usr/bin/perl -w
use strict;
use ExtUtils::Installed;

my $instmod = ExtUtils::Installed->new();
foreach my $module ($instmod->modules()) {
    my $version = $instmod->version($module) || "-"; print "$module --> $version \r\n";
}
запускаем его и получаем результат примерно такого вида:
CGI::FastTemplate --> 1.09 
Convert::ASN1 --> 0.22 
Convert::ASN1::asn1c --> 0.07 
Cope --> - 
Data::Dumper --> 2.128 
Env::Path --> 0.18 
ExtUtils::CBuilder --> 0.2703 
ExtUtils::ParseXS --> 2.2206 
File::Slurp --> 9999.19 
File::Which --> 1.09 
IO::Tty --> 1.10 
IPC::Run --> 0.90 
IPC::Run3 --> 0.044 
Lingua::RU::PhTranslit --> 0.4 
Net::CSTA --> 0.04 
Net::CSTAv3::Client --> 0.05 
Net::SMTP::Server --> 1.1 
Net::SNMP --> v6.0.0 
Perl --> 5.10.0 
Probe::Perl --> 0.01 
Test::Harness --> 3.22 
Test::Script --> 1.07 
Test::Simple --> 0.98 
Thread::Synchronized --> 0.03 
YAML --> 0.71 

середа, 8 лютого 2012 р.

Perl: как сменить позицию курсора в окне терминала?

Используем Term::Cap (описание) и POSIX (описаниеPOSIX::Termios).
#!/usr/bin/perl -w

use strict;
use Term::Cap;

my $ospeed = 9600;

eval {
    # Получиь скорость вывода на терминал
    require POSIX;
    my $termios = new POSIX::Termios;
    $termios->getattr;
    $ospeed = $termios->getospeed;
};

# Инициализация терминала
my $terminal = Term::Cap->Tgetent({ TERM => undef, OSPEED => $ospeed });
$terminal->Trequire(qw/cm cl rc sc/);

# Запомнить позицию курсора
print $terminal->Tputs('sc', 1);

# Очистить экран
print $terminal->Tputs('cl', 1);

foreach my $x (1..10) {
    foreach my $y (1..10) {
        # Переместить курсор в нужную позицию
        my $goto = $terminal->Tgoto('cm', $x * 5, $y);
        print $goto, $x * $y;
    }
}

# Вернуть позицию курсора
print $terminal->Tputs('rc', 1);

неділя, 5 лютого 2012 р.

Запуск windows-приложений под linux'ом.

Wine это хорошо, но c PlayOnLinux ещё лучше. Больше о проекте можно почитать тут, но вкратце:
PlayOnLinux - это программа, которая позволяет легко устанавливать и использовать большое количество игр и приложений, разработанных для Microsoft®'s Windows®.
На данный момент очень мало игр совместимо с GNU/Linux, что, конечно, сильно мешает переходу на эту систему. PlayOnLinux предоставляет доступное и эффективное решение этой проблемы, бесплатное и уважающее свободное ПО.
Не теряем времени зря и приступаем к установке.
$ sudo wget http://deb.playonlinux.com/playonlinux_squeeze.list -O /etc/apt/sources.list.d/playonlinux.list
$ wget http://deb.playonlinux.com/public.gpg -O -  | sudo apt-key add -
$ sudo aptitude update
$ sudo aptitude install playonlinux
все необходимые зависимости, как водится, подтянутся автоматически.
Запускаем:
$ /usr/bin/playonlinux
После этого программа попросит подтвердить установку шрифтов от MS и ещё каких-то компонентов - не мешаем ей работать. Это будет проделано один раз.

четвер, 2 лютого 2012 р.

geoip своими руками

Формируем текстовый файл:
$ wget http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
$ unzip GeoIPCountryCSV.zip
$ cut -d, -f3-5 < GeoIPCountryWhois.csv|sed 's/"//g' > geoip.txt
Итоговый файл представляет из себя набор данных, разделённых запятыми, оформленных в три колонки:
  1. начальный ip-адрес диапазона, в десятичной нотации;
  2. конечный ip-адрес диапазона, в десятичной нотации;
  3. мнемонический код страны.
Перевод ip-адреса в десятичную нотацию и обратно:
my $in = "212.90.160.40";
my @a = split (/\./,$in);

my $decip = (($a[0]<<24)+($a[1]<<16)+($a[2]<<8)+$a[3]);
my $dotip = join ".",unpack("CCCC",pack("N",$decip));

print $decip," = ",$dotip,"\n";
Организовать простой поиск ip в организованной выше базе адресов можно, например, так:
#!/usr/bin/perl -w
use strict;

my $geoipdb = "./geoip.txt";
my $in = <>; chomp($in);

if ($in =~ m!\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b!) {
  my @a = split(/\./,$in);
  my $decip = (($a[0]<<24)+($a[1]<<16)+($a[2]<<8)+$a[3]);
  open FGEOIP, "<$geoipdb" || die "Can't open $geoipdb: $!\n";
  while (<FGEOIP>) {
    chomp;
    my ($bip,$eip,$c) = split(",");
    if ($decip>=$bip && $decip<=$eip) {
      print $in," is ",$c, "\n";
      last;
    }
  }
  close FGEOIP;
} else {
  print STDERR "Not IP on STDIN\n";
}
и использовать подобным образом:
$ echo 212.90.160.40 | fgeoip
212.90.160.40 is UA

середа, 1 лютого 2012 р.

GNOME3 - индикация раскладки клавиатуры флагами

Подготавливаем иконки флажков:
# mkdir -p /usr/share/pixmaps/flags
# cd /tmp
# wget http://www.famfamfam.com/lab/icons/flags/famfamfam_flag_icons.zip
# unzip famfamfam_flag_icons.zip
# cd png/
# cp us.png /usr/share/pixmaps/flags/us-symbolic.png
# cp ru.png /usr/share/pixmaps/flags/ru-symbolic.png
# cp ua.png /usr/share/pixmaps/flags/ua-symbolic.png
# chmod -x /usr/share/pixmaps/flags/*-symbolic.png

Из под пользователя устанавливаем ключ индикации раскладки флагом, а не надписью:
$ dconf write /org/gnome/libgnomekbd/indicator/show-flags true

четвер, 26 січня 2012 р.

Как прочитать код сетевой ошибки в Windows?

Во время настройки одного из заданий для планировщика, в момент сохранения, появилась ошибка. Ошибка имела следующий код 2147944309. Абсолютно не информативно.

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

0775(HEX)=1909(DEC)

Теперь нам понадобится командная строка.

Ввожу:
net helpmsg 1909

Получаю ответ:

Учётная запись пользователя заблокирована и не может быть использована для входа в сеть.

Безликий код стал более читаемой ошибкой.

© Как прочитать код ошибки. / Microsoft / Блоги SysAdminz.Ru
© Как прочитать код ошибки? | IT-Бложек

вівторок, 10 січня 2012 р.

Отслеживание загрузки сетевого интерфейса в реальном времени

Тут могут помочь две утилиты - iftop и slurm. Установим их:
$ sudo aptitude install iftop slurm
Для запуска используется следующий синтаксис:

$ slurm -i eth0
$ sudo iftop -ni vlan7
Как видим для общего мониторинга загрузки сетевого интерфейса, без расшифровки по ip, можно использовать slurm и при этом не задумываться о привилегиях пользователя. iftop для своей работы требует особые привилегии, но при этом можно посмотреть расшифровку по ip кто именно и насколько "грузит" канал.

MySQL - размер БД

Узнать размер БД средствами MySQL:
MariaDB [(none)]> SELECT table_schema "database_name", sum( data_length + index_length )/1048576 "Database size in MB" FROM information_schema. TABLES GROUP BY table_schema;
+--------------------+---------------------+
| database_name      | Database size in MB |
+--------------------+---------------------+
| information_schema |              0.1250 |
| mail               |              0.1250 |
| mysql              |              0.6053 |
| openfire           |              0.2624 |
| sveta              |              0.0031 |
+--------------------+---------------------+
5 rows in set (0.24 sec)

Конвертируем образ из VirtualBox в KVM

Преобразуем vdi в raw:
VBoxManage clonehd --format RAW .VirtualBox/HardDisks/WinXP.vdi WinXP.img
Преобразуем raw в qcow2:
qemu-img convert -f raw WinXP.img -O qcow2 WinXP
Хотя… сомнительна сама идея, что windows поднимется в новой конфигурации.
Но, что касается linux'а то думаю, что он переживёт транспортировку на новую платворму достаточно легко.

KVM и маршрутизируемая сеть

Чтобы в KVM появилась возможность добавлять маршрутизируемые сети, а не сплошь и рядом описанные bgidge-интерфейсы и NAT рисуем xml-файл, называем например vms.xml, следующего содержания:
<network>
  <name>vms</name>
  <forward mode='route'/>
  <bridge name='virbr1' />
  <ip address='192.168.200.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.200.2' end='192.168.200.254' />
    </dhcp>
  </ip>
</network>
затем объявляем его в virsh:
# virsh net-define vms.xml
После того как сделали объявление, стартуем и добавляем в это объявление в автозагрузку:
# virsh net-start vms
# virsh net-autostart vms
После этого в системе появится новый интерфейс и маршрут, например:
# ip a s virbr1
7: virbr1:  mtu 1500 qdisc noqueue state UNKNOWN 
    link/ether 1a:9d:ce:dd:09:8a brd ff:ff:ff:ff:ff:ff
    inet 192.168.200.1/24 brd 192.168.200.255 scope global virbr1
# ip r s 192.168.200.0/24
192.168.200.0/24 dev virbr1  proto kernel  scope link  src 192.168.200.1
Не забываем включить форвард net.ipv4.ip_forward и добавить соответствующие правила в iptables.

В virt-manager наша маршрутизируемая сеть так же будет отображаться. Более того, теперь через virt-manager при желании можно объявить и другие маршрутизируемые сети.