2015-02-15

Простой portknock средствами iptables

Подробно описывать что такое portknock и зачем он нужен не стану, благо на просторах интернета много информации по этой теме, приведу лишь пример моего конфига для SSH. В тех же интренетах в основном описывают использование отдельного процесса knockd для этих целей, что в некоторых дистрибах(Centos 6/7 например) затруднительно, да и в целом оказалось избыточно. Для этих целей нам понадобится добавить всего два правила к типовой конфигурации фаервола:

-A INPUT -p icmp -m string --string knock --algo bm -m recent --name SSH --set -j LOG 

тут мы ловим icmp пакет с некоторым ключом(в данном случае это строка "knock") и  выставляем флаг, если его поймали,

-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -m recent --rcheck --name SSH --seconds 60 -j ACCEPT

а тут мы проверяем флаг и если за последние 60 секунд он установлен для данного адреса, разрешаем соединение.

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

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -m string --string knock --algo bm -m recent --name SSH --set -j LOG
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -m recent --rcheck --name SSH --seconds 60 -j ACCEPT

-A INPUT -j DROP

Отлично, конфиг готов, как же теперь этим пользоваться? А все просто, достаточно выполнить

$ ping -p 6b6e6f636b -c 1 example.com

и мы получаем открытый 22й порт на 60 секунд, далее ssh example.com и все дела.

Чуть подробнее о магической последовательности ping -p 6b6e6f636b -c 1 example.com, это обычный ping(icmp пакет) в теле которого ключ knock задан в виде hex последовательности 6b6e6f636b. Получить нужный hex из строки можно например так:

$ python -c "import sys;h=sys.argv[1];print('%s %s'%(h,''.join(x.encode('hex') for x in h)))" knock
knock 6b6e6f636b

2012-07-12

Онлайн бэкап OpenVZ ploop контейнеров

Ploop устройства тема достаточно новая и на данный момент еще до конца не раскрытая, вот и я, начал таки понемножечку с ней разбираться. Подробнее про "что это такое" и для чего нужно лучше почитать в оригинальной документации Ploop , а я же опишу процесс бэкапа контейнеров на основе ploop.

Необходимые действия над ploop устройтвами:

1. Онлайн снэпшот контейнера

# ploop snapshot -d /dev/ploop1 ploop1-delta1.imag

В результате создастся delta-фаил, в который будут записываться все дальнейшие изменения в блочном устройстве ploop1

2. Объединение

# ploop merge -d /dev/ploop1 -l 0..1

В результате этого действия, все изменения из delta-файла будут перенесены в основной образ.

Подробнее можно прочесть в оригинальном мануале Getting_started

Итак, при старте  OVZ контейнера создается новое устройство /dev/ploopX , где X некоторый порядковый номер, никак не связаный с id OVZ контейнера. Файл образа находится в private директории OVZ  контейнера, в папчке root.hdd:

# ls -1 /vz/private/ploop/1000/root.hdd/
DiskDescriptor.xml
DiskDescriptor.xml.lck
root.hdd
root.hdd.mnt

там же находится и файл с метаданными описания image-файла( DiskDescriptor.xml ).

Установить связь между контейнером OpenVZ и ploop устройством можно:
  • В версии ploop=<1.5

    # ls -al /dev/ploop
    ::vz:private:ploop:1000:root.hdd:root.hdd -> ploop0
    ::vz:private:ploop:1010:root.hdd:root.hdd -> ploop1

    При старте каждого контейнера в этой директории создается особого вида симлинк, по которому можно сопоставить ploop устройство с файлом образа.
  • В версии ploop>1.5

    # ploop list
    ploop52058 /vz/private/ploop/1000/root.hdd/root.hdd
    ploop28895 /vz/private/ploop/1010/root.hdd/root.hdd



Пример моего бэкап скрипта:
 
#!/bin/bash

BACKUP_DIR=$(echo "$1" | sed -e "s/\/*$//")

[[ -z "$BACKUP_DIR" ]] && {
        echo "Plz specify backup dir" 1>&2
        exit 1
}


[[ ! -d $BACKUP_DIR ]] && {
        echo "Backup dir does not exists: $BACKUP_DIR"  1>&2
        exit 1
}

function backup_ploop_ct {
        if [[ -z $1 || -z $2 ]];then 
                echo "Wrong backup params: '$1', '$2'"  1>&2
                return 1
        fi;

        if [[ ! -b $1 ]];then 
                echo "Ploop device doesn't exists: '$1'"  1>&2
                return 1
        fi;

        if [[ ! -f $2 ]];then 
                echo "Image file doesn't exists: '$2'"  1>&2
                return 1
        fi;

        fname_delta="$2.delta"

        if [[ -f $fname_delta ]];then
                echo "Somethings wrong, delta image exists: $fname_delta"  1>&2
                return 1
        fi;

        echo "Take snapshot for $1 with delta image $fname_delta" 
        ploop snapshot -d $1 $fname_delta 

        if [ $? -ne 0 ];then
                echo "Snapshot faild for $1 with delta image $fname_delta"  1>&2
                return 1
        fi;

        echo -n "Copy "
        # get backup filename from original path and copy original file to backup dir
        cp -v $2 $BACKUP_DIR/$(date +%F).$(echo $2 | sed -e 's/.*ploop\///' -e 's/\/.*\//./')

        echo "Merge delta to original image"
        ploop merge -d $1 -l 0..1
        if [ $? -ne 0 ];then
                echo "Merge snapshot faild for device $1" 1>&2
                return 1
        fi;

        rm -f $fname_delta
}

# get ploop mounts
ploop list | while read line
do 
        # split string to variables
        IFS=" " set -- $line 
        backup_ploop_ct /dev/$1 $2
done 

# and backup all metadata
# /vz/private/ploop/*/root.hdd/DiskDescriptor.xml
echo "Backup all metadata"
echo /vz/private/ploop/*/root.hdd/DiskDescriptor.xml | sed 's/\/vz\/private\/ploop\///g' \
| xargs tar -czf $BACKUP_DIR/$(date +%F).meta.tar.gz -C /vz/private/ploop/



UPD Скрипт адаптирован для использования с версией ploop>1.5 , для ранних версий необходимо заменить кусок кода на приведенный ниже
 
# get ploop mounts
stat /dev/ploop/* | grep File | sed -e 's/.*`\/dev\/ploop\/::\(.*\)'\'' -> `\(.*\)'\''/\/dev\/\2 \/\1/' -e 's/:/\//g' \
| while read line
do 
        # split string to variables
        IFS=" " set -- $line 
        backup_ploop_ct $1 $2
done 

2012-02-10

Смена аккаунта в android

Смена google-аккаунта в android задача более сложная, чем может показаться по началу, но вполне осуществимая. Прежде всего необходим root, поэтому самое время этим озаботится, если ранее этого не сделали.

Аккаунты пользователей хранятся в формате sqlite в файле  /data/system/accounts.db .

Простой способ: удалить файл, содержащий информацию об аккаунтах. (последствия для установленного ПО не проверял)

Более правильный:

Отредактировать при помощи утилиты sqlite3. Сделать это можно как непосредственно в терминале устройства, так и на стационарном ПК, предварительно скопировав файл с данными на флешку.

$su -
#sqlite3 /data/system/accounts.db

Нас интересует таблица accounts , посмотреть которую можно следующим образом:

sqlite> select * from accounts;

Структура данных _id|name|type|password , где:
_id - целое число
name - имя учетной записи google
type - тип учетной записи, для аккаунтов @gmail.com это "com.google"
password - пароль


Обновляем данные:

sqlite> update accounts set name="Your_New_Name@gmail.com", type="com.google",password="" where _id=1;

При этом необязательно указывать where, если запись всего одна, а так же обновлять type, если текущий соответствует новой учетной записи.

Простейший случай:


sqlite> update accounts set name="Your_New_Name@gmail.com", password="";


На этом все. Заливаем файл на устройство, если он редактировался на ПК. Перезагружаем устройство.


2012-01-17

Черезмерная "говорливость" ядра в консоль

В некоторых дистрибах(например CentOS), при поумолчательных настройках,  ядро очень говорливо в консоль, особенно раздражают бесконечно валящиеся логи iptables. Причина такого поведения не очень очевидна и кроется она за параметром ядра kernel.printk.

Умолчательные параметры в CentOS:


#sysctl kernel.printk
kernel.printk = 6    4    1    7


Где числа означают:
  1. Сonsole loglevel
  2. Default level for messages without a warning (DEFAULT_MESSAGE_LOGLEVEL)
  3. Minimum allowed (MINIMUM_CONSOLE_LOGLEVEL)
  4. Boottime default loglevel.
Нас, в данном случае, интересует только первое, Сonsole loglevel . Сообщения ядра с уровнем равным  Сonsole loglevel и менее выводятся на консоль.

Возможные варианты:
  • KERN_EMERG 1
  • KERN_ALERT 2
  • KERN_CRIT 3
  • KERN_ERR 4
  • KERN_WARNING 5
  • KERN_NOTICE 6
  • KERN_INFO 7
  • KERN_DEBUG 8

Уменьшаем текущий уровень Сonsole loglevel:


sysctl kernel.printk='4  4  1  7'


Радуемся полученому результату. Для большей перманентности, можно добавить эту строку в /etc/sysctl.conf , что восстановит необходимые значения при загрузке системы.

2011-12-05

Android: CPU governor

  • Interactive: Available in newer Kernel’s, and becoming the default scaling option in some official Android kernels. The interactive governor is functionally similar to the on demand governor with an even greater focus on responsiveness.
  • Smoothass: The same as the Smartass “governor” But MUCH more aggressive & across the board this one has a better battery life that is about a third better than stock KERNEL.
  • Conservative: Available in some  kernels. It is similar to the on-demand governor, but will scale the CPU up more gradually to better fit demand. Conservative provides a less responsive experience than on-demand, but can save battery.
  • Ondemand: Available in most Kernel’s, and the default “governor” in most Kernel’s. When the CPU load reaches a certain point (see “up threshold” in Advanced Settings), on-demand will rapidly scale the CPU up to meet demand, then gradually scale the CPU down when it isn’t needed.
  • Userspace: A method for controlling the CPU speed that isn’t currently used by SetCPU. For best results, do not use the userspace governor.
  • Powersave: Available in some Kernel’s. It will keep the CPU running at the “min” set value at all times.
  • Performance: Available in most kernels. It will keep the CPU running at the “max” set value at all times. This is a bit more efficient than simply setting “max” and “min” to the same value and using on-demand because the system will not waste resources scanning for CPU load.
  • Smartass: Included in some custom Kernel’s. The smartass governor effectively gives the phone an automatic Screen Off profile, keeping speeds at a minimum when the phone is idle.
  • Always Max: The Performance “governor”, called “Always Max” on previous versions of SetCPU, allows your phone to run at maximum speed, ignoring all power saving functions.

2009-11-16

О чем это все?

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