пятница, января 11, 2013

CentOS: ipset

### OS

Используемая ОС: centos 5.8 x32 на виртуальной машине.

shell> uname -a
Linux localhost.localdomain 2.6.18-308.el5 #1 SMP Tue Feb 21 20:05:41 EST 2012 i686 i686 i386 GNU/Linux

Система обновлена до последней версии. Стоит отметить, что когда я было начинал настройку на x64 то пакет ipset был в стандартном репозитории. А в x32 в стандартном репозитории ipset нет. По этому пришлось установить репозиторий centalt. В силу обстоятельств мне нужно было именно заставить работать ipset на x32.

### INSTALL AND RUN

Все манипуляции проводились от пользователя root.

shell> yum install ipset kmod-ipset
shell> modprobe ip_set

В файле /etc/sysconfig/iptables-config в параметр IPTABLES_MODULES надо добавить ip_set.

### UPDATE IPTABLES

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

shell> iptables -m set
iptables v1.3.5: Couldn't load match `set':/lib/iptables/libipt_set.so: cannot open shared object file: No such file or directory

Проблема в том что в стандартном репозитории лежит более новая версия. А в репозиторий centalt версия старая версия пакета iptables (с поддержкой ipset). Через yum не поставить, будет предложена последняя версия. Можно конечно отключить стандартные репозитории. Но мне не хотелось ставить старую версию iptables. Тем более после обновления нужная библиотека будет утеряна. Но нам нужна всего одна библиотека libipt_set.so. Потому надо вытащить из rpm из репозитория centalt нужный нам файл.

shell> cd /tmp/
shell> wget http://centos.alt.ru/repository/centos/5/i386/iptables-1.3.5-5.6.1.el5.i386.rpm
shell> rpm2cpio iptables-1.3.5-5.6.1.el5.i386.rpm |cpio -idmv
shell> cp /tmp/lib/iptables/libipt_set.so /lib/iptables/
shell> iptables -m set
iptables v1.3.5: You must specify `--set' with proper arguments
Try `iptables -h' or 'iptables --help' for more information.

Видим что ipset теперь работает без проблем. Судя по исходникам там уже давно ничего не менялось. Думаю должно работать как надо.

### TEST/USAGE

shell> ipset -N test iphash
shell> ipset -A test 192.168.40.153
shell> ipset -A test 192.168.42.4
shell> ipset -L
Name: test
Type: iphash
References: 0
Header: hashsize: 1024 probes: 8 resize: 50
Members:
192.168.42.4
192.168.40.153
shell> iptables -A INPUT -m set --set test src -j DROP

Ключик -N создает новую таблицу, далее указываем как эта таблица будет называться и способ хеширования. Далее добавляем ip. С ключом -L можно посмотреть какие в памяти есть таблицы. В правиле iptables указано, что те ip которые в таблице test, являются источниками и все что с этих адресов поступает надо блокировать.

### END

После успешного тестирования библиотека была скопирована на действующий шлюз. По понятным причинам мне совершенно не хотелось экспериментировать на рабочей машине. И по тем же причинам мне не хотелось устанавливать из исходников одну из последних версий iptables.

Вот сама библиотека: libipt_set.so.

В очередной раз задумался о переходе на centos 6.3. Уже не первый раз когда нужных, новых пакетов нет под 5.8.

среда, января 09, 2013

CentOS: когда мало памяти...

Проявляется следующим образом: при установки системы версии 6.3 (ранее использовал 5.8, проблем не было) не запускается графический интерфейс установки, только текстовый, который довольно сильно урезан. Установка проводилась в виртуальной машине с памятью 512МБ. Погугле тему оказалось что виноват в этим именно установщик, написанный на python. Он загружает в память образ установки. Когда памяти мало для экономии выбирается текстовый режим установки.

Но проблему можно решить. На просторах интернета нашел вот это. В моем случае было достаточно изменить функцию within_available_memory. И там уже не 15МБ, а все 32 было. Работает.

So the procedure is as follows:

1. Boot to 32-bit CentOS LiveCD (CentOS-6.0-i386-LiveCD.iso) in
graphical mode (if you have at least 256MB RAM) or text mode (if you
have less than 256MB RAM).

2. Login as root.

3. Edit a file /usr/sbin/anaconda - using vim in text mode or gedit in
graphical mode - search for "within" and modify function
"within_available_memory" adding a line "return True" like this:
def within_available_memory(needed_ram):
return True
# kernel binary code estimate that is
# not reported in MemTotal by /proc/meminfo
epsilon = 15360 # 15 MB
return needed_ram < (iutil.memInstalled() + epsilon)
This would get rid of artificial hard-coded memory requirement.
PS Экспериментальным образом было выявлено, что для нормальной работы требуется ровно 632 МБ памяти.

вторник, января 08, 2013

Mac OS: Проверка орфографии в Sublime Text 2


В Sublime Text 2 присутствуем возможность проверки орфографии, но изначально есть только два словаря: английский и немецкий. Словари удобно брать из OpenOffice, только надо произвести некоторые махинации.

Стоит отметить, что "качество работы" со словарем в sublime не очень хорошее. Например нельзя одновременно проверять несколько языков, нельзя добавить свое слово (разве что напрямую редактировать словарь) и нет возможности увидеть правильный вариант слова. Если слово неверное вас просто ставят перед фактом, как написать правильно не сообщается. Это объясняется в основном потому, что этот редактор завоевал успех именно как простоя IDE ко множеству языков программирования, а не как замена MS Word...

Итак, словари скачать по ссылке. Как видим выбор большой:


Загружайте нужный словарь. Скачанный файл будет расширения .oxt. Надо просто переименовать в .rar или .zip. Распаковать. В папке из под архива нам нужно два файла с расширением .aff и .dic. Открываем эти два файла в Sublime Text 2. Скорее всего русский текст в непонятном виде. Значит кодировка файла "неправильная". В файле с расширением .aff самая первая строчка будет иметь что-то типа: SET KOI8-R. Идем в меню file - reopen with encoding и выбираем кодировку указанную выше.  В файле меняем KOI8-R на UTF-8. Далее сохраняем в новой кодировке: в file - save with encoding надо выбрать UTF-8. Со вторым файлом надо надо поступить так же (открыть с нужной кодировкой и сохранить в новой).

Теперь надо эти файлы положить в каталог где лежат словари. Есть папка ~/Library/Application Support/Sublime Text 2/Packages/Language - English/ ее можно переименовать в просто Language. В эту папку скопировать два нужных файла. Сдлать это можно так: откройте консоль и введите команду:

shell> open ~/Library/Application\ Support/Sublime\ Text\ 2/Packages/Language/

В открывшуюся папку перетащите нужные файлы. После этого надо закрыть (cmd + q) Sublime Text 2 и открыть заново. А далее в меню выбрать нужный словарь и нажать F6:


четверг, января 03, 2013

Использование hosts.deny и hosts.allow

С помощью файлов hosts.{deny,allow} можно закрывать и открывать нужным хостам/подсетям доступ к сервису. Обычно это делают с помощью iptables. Но с помощью этих файлов можно произвести какие-то дополнительные действия. Например можно записать лог файл, отправить письмо, сообщить клиенту почему ему запрещен доступ к хосту. И такое можно применить к любому сервису. Если же использовать эти файлы как firewall, то это плохая идея. Iptables справится с этим лучше.

Простой пример как запретить доступ ко всем сервисам:

file hosts.deny
ALL : ALL

file hosts.allow
<must be empty>

Если надо открыть доступ только для ssh (для всех):

file hosts.allow
sshd : ALL

Или если надо открыть доступ к ssh только для подсети:

file hosts.allow
sshd : 192.168.1.

Или только для хоста:

file hosts.allow
sshd : 192.168.1.41
Т.е. в начале читается файл hosts.allow, если есть совпадение правил поиск прекращается, доступ разрешается. Если совпадений нет, поиск производится уже в hosts.deny.

Как видно синтаксис прост:

daemon_list : client_list : option : option ...
daemon_list - список сервисов через пробел
client_list - список клиентов через пробел
option - ALLOW, DENY, spawn, twist, severity
Вот spawn, twist уже куда интересней. Хотя severity тож интересно. Итак надо писать лог-файл когда кто-то заходит по ssh. Напишем скрипт который будет писать лог-файл:

file /root/test
#!/bin/bash
echo `date`" $1" >> /root/log

file hosts.deny
ALL : ALL

file hosts.allow
sshd : 192.168.1.41 : spawn (/root/test "%d(%p) client_ip=%a usename=%u access=allow")
В результате получим файл /root/log:

Thu Jan 3 02:55:43 MSK 2013 sshd(2448) client_ip=192.168.1.41 usename=unknown access=allow
Да, да sshd сам пишет лог. Но это, так сказать, для себя, просто понятней. Это простой пример как можно использовать свой скрипт. При помощи этого инструмента можно поменять PATH для пользователя. Или отправить письмо или еще какие действия в системе сотворить. В общем применение широкое.

Теперь давайте сообщать пользователю почему ему запрещен доступ к сервису.

file /root/test
#!/bin/bash
echo `date`" $1" >> /root/log

file hosts.deny
ALL : ALL spawn (/root/test "%d(%p) client_ip=%a usename=%u access=deny") : twist /bin/echo "You are not welcome to use %d from %h."

file hosts.allow
sshd : ALL EXCEPT 192.168.1.41
Смысл такой - разшеить всем доступ к сервису, запретить только для хоста 192.168.1.41. Чтоб увидеть сообщение надо запустить ssh с ключом -v:

debug1: ssh_exchange_identification: You are not welcome to use sshd from 192.168.1.41.
А в лог-файле будет:

Thu Jan 3 03:14:50 MSK 2013 sshd(2494) client_ip=192.168.1.41 usename=unknown access=deny
В общем широкое применение. Дополнительно надо читать:

man 5 hosts_options
man 5 hosts_access
man tcpd

среда, января 02, 2013

Установка python3 из исходников в CentOS6.3

Имеем абсолютно чистый CentOS6.3 x64. Я устанавливаю систему из образа minimal. Задача: поставить python 3.

Так как у нас, будем считать, только что поставленная система, то нам надо настроить сеть. Отредактировать в файле /etc/sysconfig/network-scripts/ifcfg-eth0 параметр ONBOOT с no на yes. А далее так (предполагается что у вас уже настроен DHCP в сети):

shell> searvice network restart
shell> yum update
shell> yum install gcc-c++ wget make
shell> wget http://www.python.org/ftp/python/3.3.0/Python-3.3.0.tar.bz2
shell> bzip2 -cd Python-3.3.0.tar.bz2 |tar xf -
shell> cd Python-3.3.0
shell> ./configure --prefix=/opt/python3.3
shell> make && make install
shell> ln -s /opt/python3.3/bin/python3.3 /usr/bin/python3.3

Устанавливаем в каталог для того, чтоб избежать возможных конфликтов с установкой python через yum.