понедельник, 15 сентября 2008 г.

iptables + ipset

IPSET позволяет сократить количество правил в iptables.
Если у вас используются одинаковые правила, но для разных критериев (IP, PORT, MAC, ...) вы можете объединить их в одно правило с помощью ipset.

Пример:

-A FORWARD -s 192.168.0.200 -m tcp -p tcp --dport 25 -j ACCEPT
-A FORWARD -s 192.168.0.201 -m tcp -p tcp --dport 25 -j ACCEPT
-A FORWARD -s 192.168.0.210 -m tcp -p tcp --dport 25 -j ACCEPT
...
-A FORWARD -s 192.168.0.225 -m tcp -p tcp --dport 25 -j ACCEPT

можно заменить одним правилом:

-A FORWARD -m set --set accept_email src,src -j ACCEPT


Компиляция ipset.

Для начала качаем исходник ядра и ipset (ipset-2.3.3a.tar.bz2)
Конфигурируем ядро как обычно + включаем xtables в "Y" ("*")
Качаем последний patch-o-matic-ng, патчим ядро с параметром set

cd patch-o-matic-ng-yyyymmdd
./runme set

Далее, возвращаемся в папку с исходником ядра и собираем его с поддержкой ipset:

cd /usr/src/linux/
make config

все что касается ipset можно оставить по умолчанию.

make && make modules && make install && make modules_install


Далее распаковываем и ставил ipset, сейчас мы только добавили поддержку ipset в ядро и iptables. Не забываем пересобрать iptables.

Пример использования

ipset -N accept_email iphash --resize 0 #Создаем новый set с именем foo
ipset -A accept_email 192.168.0.200 #Добавляем данные в Set
ipset -A accept_email 192.168.0.201
...
ipset -A accept_email 192.168.0.225

#И наконец, само правило:
iptables -t filter -A FORWARD -m set --set accept_email src,src -j ACCEPT


Более подробно можно прочитать на офф сайте.

Linux, Создание разделов размером более 2TB

Creating a Partition Size Larger than 2TB
Обычно на десктопах пользователи используют малые диски, но для серверов это не подходит. Вы не сможете создать раздел размером 4TB (RAID-массив) используя fdisk.

Для решения этой проблемы используется утилита parted. Вам необходимо включить поддержку больших разделов в ядре (GPT), если этого не сделать, вы не сможете примонтировать раздел. Для активации GPT включите CONFIG_EFI_PARTITION=Y

File Systems
Partition Types
[*] Advanced partition selection
[*] EFI GUID Partition support (NEW)


Создание больших разделов с помощью parted.
У меня есть массив RAID 5 из 6 дисков, каждый из которых по 1TB, общий объем получается 4.55TB

parted /dev/sdf
GNU Parted 1.8.8
Using /dev/sdf
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print devices
...
/dev/sdf (5000GB)
...
(parted)


Так мы узнали размер массива, который виден системой.
Далее 3 не сложные команды.

mklabel gpt
mkpart primary 0 5000G
quit


радел создан, теперь его не плохо было бы отформатировать.
mkfs.xfs /dev/sdf1 -L LABEL_OF_YOUR_DISK

пятница, 12 сентября 2008 г.

Установка CP1251 locale в Linux.

День программиста потихоньку заканчивается, сегодня одному пареньку пришлось доказывать что в Linux тоже можно поставить локаль CP1251.

На самом деле в i18n уже определено множество локалей, да, даже CP1251, нужно просто сгенерить для нее LC.

localedef -c -i ru_RU -f CP1251 ru_RU.CP1251

усе, должна создаться директория ru_RU.cp1251:
/usr/share/locale/ru_RU.cp1251 или в /usr/lib/locale/ru_RU.cp1251

Теперь необходимо переименовать ru_RU.cp1251 в ru_RU.CP1251
и проверить наличие в системе:

locale -a | grep -i ru_RU

Пути могут меняться в зависимости от типа Linux.

День программиста

День программиста - неофициальный праздник программистов, отмечаемый на 256-й день года. Число 256 (два в восьмой степени) выбрано потому, что это количество чисел, которые можно выразить с помощью одного байта. В високосные годы этот праздник попадает на 12 сентября, в невисокосные - на 13 сентября.

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

Мы ежечасно сталкиваемся с плодами трудов того, что сделал программист. Смотрим ли мы телевизор, слушаем ли радио, разговариваем ли по телефону - мы пользуемся тем, что создал программист. Пожалуй, ни одна профессия не охватывает столь широко сферы нашей жизни.

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

Поздравляю всех коллег с праздником.

четверг, 11 сентября 2008 г.

Linux роутер своими руками.

Начнемс,
В этой статье я расскажу, как постоить небольшой и не сложный роутер с поддержкой NAT на базе Linux.
NAT (Network Address Translation — «преобразование сетевых адресов») — это механизм в сетях TCP/IP, позволяющий преобразовывать IP-адреса транзитных пакетов. Также имеет названия IP Masquerading, Network Masquerading и Native Address Translation.

Преобразование адресов методом NAT может производиться почти любым маршрутизирующим устройством — маршрутизатором, сервером доступа, межсетевым экраном. Суть механизма состоит в замене адреса источника (source) при прохождении пакета в одну сторону и обратной замене адреса назначения (destination) в ответном пакете. Наряду с адресами source/destination могут также заменяться номера портов source/destination.

Помимо source NAT (предоставления пользователям локальной сети с внутренними адресами доступа к Интернету) часто применяется также destination NAT, когда, например, обращения извне сетевым экраном транслируются на сервер в локальной сети, имеющий внутренний адрес и потому недоступный извне сети непосредственно (без NAT).

NAT выполняет две важных функции.

1. Позволяет сэкономить IP-адреса, транслируя несколько внутренних IP-адресов в один внешний публичный IP-адрес (или в несколько, но меньшим количеством, чем внутренних).
2. Позволяет предотвратить или ограничить обращение снаружи ко внутренним хостам, оставляя возможность обращения изнутри наружу. При инициации соединения изнутри сети создаётся трансляция. Ответные пакеты, поступающие снаружи, соответствуют созданной трансляции и поэтому пропускаются. Если для пакетов, поступающих снаружи, соответствующей трансляции не существует (а она может быть созданной при инициации соединения или статической), они не пропускаются.


У нас есть машинка с установленным Linux, я пользуюсь Gentoo.
Также у нас есть 2 сетевых интерфейса (eth0, eth1).
eth0 - Внешний интерфейс, "смотрит" в интернет, также это может быть ppp0 или что-то еще. (IP - динамически, полученный от провайдера или статический, как вам угодно.)
eth1 - внутренний интерфейс, "смотрит" в нашу домашнюю сеть, имеет IP: 192.168.0.1

Для начала нам необходимо включить форвард пакетов в системе, делается это просто:
в файл /etc/sysctl.conf добавляем или исправляем строку
net.ipv4.ip_forward = 1
применяем изменения
sysctl -p /etc/sysctl.conf

далее, в iptables добавляем правило для маршрутизации наших пакетов.
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

в этом правиле мы говорим, что все пакеты приходящие с адресов 192.168.0.1 - 192.168.0.255 должны отправляться через интерфейс eth0(ppp0, ...) и к ним должен применяться адрес источника этого же интерфейса.

сохраняем правила, в Gentoo это делается так:
/etc/init.d/iptables save

среда, 10 сентября 2008 г.

Настройка PPTP соединения в Gentoo Linux

Благо в Gentoo все делается черезвычайно просто.
Для начала надо проверить не установлены ли у нас следующие пакеты:
# emerge -pv ppp pptpclient
Если нет, установим.
# USE="mppe-mppc dhcp" emerge ppp pptpclient

Откроем файл /etc/conf.d/net

добавим следующие строки:

=====================================================
config_ppp0=("ppp")
link_ppp0="pty '/usr/sbin/pptp XXX.XXX.XXX.XXX --loglevel 2 --nolaunchpppd'"
username_ppp0="USER_NAME"
password_ppp0="USER_PASS"

pppd_ppp0=(
"nomppe"
"nomppc"
"nodeflate"
"debug"
"usepeerdns"
"defaultroute"
)
routes_ppp0=("default via ppp0")
=====================================================

Вот и все.
XXX.XXX.XXX.XXX - IP PPTP сервера
В pppd_ppp0 можно передать дополнительные параметры, которые не указаны в /etc/ppp/options.pptp

Этот метод не отменяет все что связано с /etc/ppp/ip-up, /etc/ppp/ip-down.
Вы по прежнему можете указывать там все что необходимо.

Можно также дополнительно установить размер MTU:
mtu_ppp0=("1400")
Если MTU ниже 1500 и этот компьютер используется в качестве роутера, то необходимо добавить одно интересное правило в iptables
iptables -I FORWARD 1 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

И на последок создадим ссылку на скрипт запуска:
ln -s /etc/init.d/net.lo /etc/init.d/net.ppp0
и добавим в автозагрузку
rc-update add net.ppp0 default

В написании этого поста помог less /etc/conf.d/net.example

Перезагрузка Linux машины через SysRQ

Иногда возникает ситуация, когда удаленно, по ssh например, нужно перезагрузить linux сервер.
Команды reboot, shutdown не работают так как нужно, то есть просто висят в процессах, но машина не уходит в перезагрузку.

Такое часто бывает, когда отказывает диск, или начинаются проблемы с RAID массивом.
Для форсирования перезагрузки сервера нам подойдет sysrq.

Для начала включаем sysrq через proc:

echo 1 > /proc/sys/kernel/sysrq

Далее посылаем нужную команду в sysrq триггер:

echo b > /proc/sysrq-trigger

Как показывает практика, машина мгновенно уходит в reboot.

Все команды совпадают с сочетаниями клавиш:
"ALT + SysReq + r" - перевести клавиатуру в Raw режим.
"ALT + SysReq + s" - сбросить буферы FS на диск (может занять много времени, если система сильно загружена).
"ALT + SysReq + e" - отправить сигнал завершения работы процессам.
"ALT + SysReq + i" - принудительно убить процессы не желающие завершить работу по сигналу KILL.
'ALT + SysReq + u' - отмонтировать дисковые разделы.
'ALT + SysReq + b' - перезагрузить машину.

Установка MTU в Windows системах.

Set Default MTU

В компьютерных сетях термин Maximum Transmission Unit (MTU) используется для определения максимального размера блока (в байтах), который может быть передан на канальном уровне коммуникационного протокола.


Значения MTU зависят от коммуникационного интерфейса (Сетевая плата, последовательный порт, и т. д.).


Значение MTU может быть определено стандартом (например для Ethernet), либо может выбираться в момент установки соединения (обычно в случае прямых подключений точка-точка). Чем выше значение MTU тем выше пропускная способность сети. Однако, большие пакеты могут блокировать медленные интерфейсы на некоторое время, увеличивая время ожидания для других пакетов.

Для принудительной установки MTU на Вашей Windows системе необходимо выполнить следующее:
1. Пуск - Выполнить - regedit

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

добавить параметр

DWORD: MTU = 1492

Создание бекапов баз данных и таблиц в MySQL.

Данный способ предназначен для создания бекапов нужных нам баз данных MySQL с сохранением данных о каждой таблице в отдельном файле.
Посмотрим код:

=========================================================
#!/bin/bash
DBS="some_db, some_db1, ..."
DUMP_OPTS="--add-drop-table --add-locks --disable-keys "
DB_USER="db_user"
DB_PASS="db_pass"

DATE=`date +%Y%m%d`
STAMP=`date +%Y%m%d%H%M`

[ ! -d $DATE ] && mkdir $DATE

for db in $DBS ; do
for i in `mysqlshow -u$DB_USER -p$DB_PASS $db | grep -v Tables | grep -v '-' | grep -v Database: | awk '{print $2}'`; do
echo Dumping table $db.$i
mysqldump $DUMP_OPTS -u$DB_USER -p$DB_PASS $db $i > $DATE/$db.$i.sql
done

echo Compressing data for $db database
tar -czpf $DATE/$db.backup.$STAMP.tar.gz $DATE/$db.*.sql
rm $DATE/$db.*.sql
done
============================================================

Рассмотрим переменные, которые можно изменить по своему вкусу.

DBS="some_db, some_db1, ..." #Перечислим базы данных, которые необходимо забекапить
DUMP_OPTS="--add-drop-table --add-locks --disable-keys " #Дополнительные опции для mysqldump
DB_USER="db_user" #Имя пользователя
DB_PASS="db_pass" #пароль


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

Поместив скрипт в /etc/cron.daily можно выполнять ежедневный бекап баз данных MySql

Введение.

В этом блоге я буду рассказывать о многих новинках IT индустрии, програмировании и администрировании Linux систем, а так-же о многои другом.
Я надеюсь что вам интересно читать нас.