Showing posts with label linux. Show all posts
Showing posts with label linux. Show all posts

2007/06/12

Знакомство с Linux-VServer

Статья "Зонная Защита Solaris 10" замечательно описывает подход и возможности виртуализации на уровне операционной системы на примере зон в Solaris. Она также содержит ссылки на подобные решения в Linux-среде - Linux-Vserver, OpenVZ. Так как я использую преимущественно Debian (а он уже содержит в себе поддержку linux-vserver), то вопрос выбора для меня стоял недолго, хотя желание ознакомиться с OpenVZ не пропало.
Linux-vserver - это отличное решение для хостинга и тестирования в различных окружениях - на одном физическом сервере используется одно для нескольких виртуальных серверов Linux-ядро. Главный (MAIN) сервер используется для контроля за виртуальными серверами, каждый из которых находится в закрытой адресной среде, не видя остальных. Разработчики указывают около 3-4% падения производительности системы при использовании VServer, но это настолько маленькие цифры, что их можно не учитывать - система работает как обычно - шустро.
В репозитарии Debian 4.0 уже есть пропатченное linux-ядро, готовое к работе. Минусом является отсутствие отдельного патча linux-vserver, чтобы иметь возможность наложить его на собранное своими руками ядрышко.
Установка и использование linux-vserver очень проста.

# apt-get install linux-image-2.6.18-X-vserver-686 util-vserver vserver-debiantools debootstrap
Пример команды для создания виртуального сервера
# newvserver --vsroot /var/lib/vservers/ --hostname srv002 --domain domain.ru --ip 192.168.1.102/24 --dist etch --mirror http://ftp.at.debian.org/debian --interface eth0
# uname -a
Linux srvmain 2.6.18-4-vserver-686 #1 SMP Thu May 10 01:37:59 UTC 2007 i686 GNU/Linux
Стартуем виртуальный хост
# vserver srv002 start
Входим в виртуальный хост
# vserver srv002 enter
# uname -a
Linux srv002 2.6.18-4-vserver-686 #1 SMP Thu May 10 01:37:59 UTC 2007 i686 GNU/Linux
Сейчас можно настроить виртуальный хост для требуемых нужд, установить все необходимое/дополнительное. Всё, как на обычном хосте.
Выходим из виртуального хоста
# vserver srv002 stop
Возможные проблемы могут возникнуть с Apache, если на main-хосте уже запущен Apache и не привязан к конкретному ip-адресу. В этом случае, пытаясь запустить apache на виртуальном хосте, в error.log можно встреить ошибку:
[crit] (98)Address already in use: make_sock: could not bind to port 80
Решение: привязать main-сервер к конкретному ip-адресу.

Проблема с Bind 9 решается не так просто:
cd /usr/src
apt-get build-dep bind9
apt-get source bind9
cd bind9-x.x.x
vi debian/rules
...
--disable-linux-caps \
--disable-threads \
...
dpkg-buildpackage
...
cd ..
dpkg -i *.deb
echo "bind9 hold" | dpkg --set-selections # чтобы заморощить автоматическое обновление
На официальном сайте есть отдел, посвященный "проблемному" soft'у. Проблем с OpenLDAP, Exim, Proftpd не наблюдалось - всё работает как обычно - как часы.

Для автозапуска виртуального сервера при перезагрузке необходимо выполнить следующее:
echo "default" > /etc/vservers/SERVERNAME/apps/init/mark
Чтобы сделать копию уже сконфигурированного виртуального хоста srv002 (например web-сервера).
vserver srv003 build --hostname srv003 --interface eth0:192.168.1.103/24 -m rsync -- -s /var/lib/vservers/srv002/
Если необходимо ограничить ресурсы (процессор, память) виртуальных хостов, linux-vserver и тут не подведет.
Пример (взят из FAQ) того, как избежать ситуации "Out of memory"
1. Проверить размер страниц (pagesize) в памяти (обычно 4Кб)
2. Создать директорию rlimits
mkdir /etc/vservers/srv002/rlimits
3. Установить значения максимума для резидентной памяти (rss) и максимума для всего объема виртуальной памяти (as). Хранимые значения указывают на число страниц памяти - например, чтобы установить предел в 200Мб при размере страницы 4Кб, нужно указать значение 50000.
echo 50000 > /etc/vserver//rlimits/rss # 200Mb
echo 100000 > /etc/vserver//rlimits/as # 400Mb
4. Чтобы изменения вступили в силу, необходимо перезапустить виртуальный хост.

В комплекте пакета util-vserver идут замечательные утилиты для наблюдения за виртуальными хостами. Вот как это выглядит:
# vserver-stat
CTX PROC VSZ RSS userTIME sysTIME UPTIME NAME
0 59 197.9M 43.7M 36m51s32 9m37s35 5d22h45 root server
49166 9 137M 20.2M 0m02s98 0m03s40 4d00h03 srv008
49169 9 137M 20.2M 0m39s41 0m06s62 3d23h59 srv009
49170 13 174.3M 102.6M 16m30s91 1m03s46 3d20h57 srv002
49171 3 21.1M 4.6M 0m00s40 0m00s10 3h22m13 srv001
49176 9 137M 20.2M 0m00s80 0m00s20 1h28m18 srv007
#
#
# vps ax
PID CONTEXT TTY STAT TIME COMMAND
1 0 MAIN ? Ss 0:01 init [2]
...
1045 0 MAIN ? S< 0:12 [md1_raid1]
1049 0 MAIN ? S< 0:00 [md2_raid1]
1126 0 MAIN ? S< 0:00 [kjournald]
1611 0 MAIN ? S< 0:00 [kedac]
1662 0 MAIN ? S< 0:00 [kpsmoused]
1922 0 MAIN ? S< 0:00 [kmirrord]
1970 0 MAIN ? S< 0:00 [kjournald]
1972 0 MAIN ? S< 0:15 [kjournald]
2259 0 MAIN ? Ss 0:02 /sbin/syslogd
2265 0 MAIN ? Ss 0:00 /sbin/klogd -x
2617 0 MAIN ? Ss 0:00 /usr/sbin/inetd
2632 0 MAIN ? Ss 0:00 /usr/sbin/sshd
2874 0 MAIN ? Ss 0:00 /sbin/mdadm
2905 0 MAIN ? Ss 0:00 /usr/sbin/cron
2922 0 MAIN ? Ss 0:00 /usr/sbin/apache
2949 0 MAIN tty1 Ss+ 0:00 /sbin/getty 38400 tty1
2950 0 MAIN tty2 Ss+ 0:00 /sbin/getty 38400 tty2
2951 0 MAIN tty3 Ss+ 0:00 /sbin/getty 38400 tty3
2952 0 MAIN tty4 Ss+ 0:00 /sbin/getty 38400 tty4
2953 0 MAIN tty5 Ss+ 0:00 /sbin/getty 38400 tty5
2954 0 MAIN tty6 Ss+ 0:00 /sbin/getty 38400 tty6
22845 0 MAIN ? Ss 0:00 /usr/sbin/exim4 -bd -q30m
26097 0 MAIN ? S 0:00 /usr/sbin/apache
26098 0 MAIN ? S 0:00 /usr/sbin/apache
26099 0 MAIN ? S 0:00 /usr/sbin/apache
26100 0 MAIN ? S 0:00 /usr/sbin/apache
26101 0 MAIN ? S 0:00 /usr/sbin/apache
15571 49166 srv008 ? Ss 0:00 /sbin/syslogd
15590 49166 srv008 ? Ss 0:00 proftpd: (accepting connections)
15596 49166 srv008 ? Ss 0:00 /usr/sbin/cron
15606 49166 srv008 ? Ss 0:00 /usr/sbin/apache
16397 49169 srv009 ? Ss 0:00 /sbin/syslogd
16416 49169 srv009 ? Ss 0:00 proftpd: (accepting connections)
16422 49169 srv009 ? Ss 0:00 /usr/sbin/cron
16432 49169 srv009 ? Ss 0:00 /usr/sbin/apache
17970 49170 srv002 ? Ss 0:08 /sbin/syslogd
17982 49170 srv002 ? Ss 0:00 /usr/sbin/named -u bind
17989 49170 srv002 ? Ss 0:00 /usr/sbin/lwresd
18005 49170 srv002 ? Ss 15:58 /usr/sbin/clamd
18088 49170 srv002 ? Ss 0:00 /usr/bin/freshclam -d --quiet
18233 49170 srv002 ? Ss 0:06 /usr/sbin/exim4 -bd -q30m
18259 49170 srv002 ? Ss 0:00 /usr/sbin/cron
6387 49169 srv009 ? S 0:00 /usr/sbin/apache
6388 49169 srv009 ? S 0:00 /usr/sbin/apache
6389 49169 srv009 ? S 0:00 /usr/sbin/apache
6390 49169 srv009 ? S 0:00 /usr/sbin/apache
17469 0 MAIN ? Ss 0:00 sshd: root@pts/0
17471 0 MAIN pts/0 Ss+ 0:00 -bash
18505 49171 srv001 ? Ss 0:00 /sbin/syslogd
18515 49171 srv001 ? Ssl 0:00 /usr/sbin/slapd -g openldap -u openldap
18531 49171 srv001 ? Ss 0:00 /usr/sbin/cron
19505 0 MAIN ? Ss 0:00 sshd: root@pts/2
19507 0 MAIN pts/2 Ss 0:00 -bash
20434 0 MAIN pts/2 S+ 0:00 mc
20436 0 MAIN pts/3 Ss 0:00 bash -rcfile .bashrc
21026 49176 srv007 ? Ss 0:00 /sbin/syslogd
21045 49176 srv007 ? Ss 0:00 proftpd: (accepting connections)
21051 49176 srv007 ? Ss 0:00 /usr/sbin/cron
21061 49176 srv007 ? Ss 0:00 /usr/sbin/apache
21083 49176 srv007 ? S 0:00 /usr/sbin/apache
21084 49176 srv007 ? S 0:00 /usr/sbin/apache
21846 49170 srv002 ? S 0:00 /usr/sbin/exim4 -bd -q30m
21847 1 ALL_PROC pts/3 S+ 0:00 vps ax
21848 1 ALL_PROC pts/3 R+ 0:00 ps ax
Ссылки:
  1. Installing Linux-VServer
  2. Howtos Linux-Vserver Debian Sarge
  3. Problematic Programs - Linux-VServer
  4. Vserver DRBD - Linux-VServer
  5. The /etc/vservers directory
  6. "Системный администратор" (октябрь 2006)

2007/03/07

Сборка ядра Linux

Статья "Некоторые замечания о сборке ядер Линукс" заставила в очередной раз обратить внимание на Linux ядро, его сборку, конфигурирование и для меня, наконец, этот процесс стал более прозрачным и понятным.

Если используется Debian-ориентированная система, то для установки всего необходимого можно воспользоваться менеджером пакетов, он установит все необходимые промежуточные зависимости:

# apt-get install linux-source-2.x.x libncurses5-dev kernel-package
# cd /usr/src
# tar xfj kernel-source-2.x.x.tar.bz2
# cd kernel-source-2.x.x
# make menuconfig
...
(конфигурирование параметров ядра)
...
# make-kpkg --append-to-version=.cramfsasmodule --revision=1.0 kernel_image
dpkg -i kernel-image-(2.x.x)(--append-to-version)_(--revision)_(architecture).deb
  • append-to-version - опция для указания версии ядра (можно использовать символы '+' и '.', нельзя использовать '_')
  • revision - опция для указания версии пакета в Debian-репозитарии (можно использовать символы '+' и '.', нельзя использовать '_'). По умолчанию используется "10.00.Custom"
  • kernel_image - сделать debian-пакет ядра

Либо всё делать вручную: скачать ядро с сайта www.kernel.org в /usr/src

# cd /usr/src
# tar xfj kernel-source-2.x.x.tar.bz2
# cd kernel-source-2.x.x
# make clean
# make menuconfig
...
(конфигурирование параметров ядра)
...
# make bzImage modules # Сборка ядра и модулей
# make modules_install install # установка модулей и ядра
# update-grub # Обновление меню загрузчика GRUB

Чтобы установить версию ядра в ручном методе, в файл /usr/src/Makefile необходимо внести поправку:

EXTRAVERSION = 20070304withusb

Статья "Ставим ядро 2.6, или Ядерная физика для домохозяйки" очень может помочь в процессе выбора необходимых опций на этапе конфигурации.

Чтобы не использовать initrd должны быть монолитно собраны драйвера корневой файловой системы (например ext3) и следущие опции:

Device Drivers -> Block devices

[*] RAM disk support
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support

Также должен присутствовать в виде модуля (или монолитно)

File systems -> Miscellaneous filesystems

[*/M] Compressed ROM file system support (cramfs)

Ссылки:

  1. Некоторые замечания о сборке ядер Линукс.
  2. Ставим ядро 2.6, или Ядерная физика для домохозяйки.
  3. How To Roll A Kernel the Ubuntu/Debian Way
  4. Creating custom kernels with Debian's kernel-package system

2006/09/20

SYN flood

Очень популярная DoS атака заключается в посылке большого числа SYN
пакетов на ваш сервер. При этом установка TCP связи не доводится до
конца. Очередь полуоткрытых запросов соединений быстро заполняется,
что мешает установке нормальных соединений. Так как соединение не
должно быть обязательно завершено, такая атака не требует больших
ресурсов от атакующей машины, поэтому её легко реализовать и
контролировать.

Если параметр tcp_syncookies установлен (доступен только когда ядро
собрано с CONFIG_SYNCOOKIES), тогда ядро обрабатывает SYN пакеты TCP в
обычном режиме до тех пор, пока очередь не заполнится. После
заполнения очереди включается механизм SYN cookies.

SYN cookies вообще не использует очередь SYN. Вместо этого ядро
отвечает на каждый SYN пакет, как обычно SYN|ACK, но туда будет
включено специально сгенерированное число на основе IP адресов и
портов источника и получателя, а также времени посылки пакета.
Атакующий никогда не получит эти пакеты, а поэтому и не ответит на
них. При нормальном соединении, будет послан третий пакет, содержащий
число, а сервер проверит был ли это ответ на SYN cookie и, если да, то
разрешит соединение даже в том случае, если в очереди SYN нет
соответствующей записи.

Включение механизма SYN cookies является очень простым способом борьбы
против атаки SYN флудом. При этом немного больше загружается процессор
из-за необходимости создавать и сверять cookie. Так как альтернативным
решением является отклонять все запросы на соединение, SYN cookies
являются хорошим выбором.
(скопировано с

Защита - включить tcp_syncookies

echo "1" > /proc/sys/net/ipv4/tcp_syncookies

Ядро 2.2 не имеет данной возможности, поэтому единственный выход - переходить на 2.4 или выше.


Литература:

  1. Обзор файлов /proc имеющих отношение к работе Firewall в Linux
  2. SYN cookies
  3. Enable tcp_syncookies by default
  4. CERT® Advisory CA-1996-21 TCP SYN Flooding and IP Spoofing Attacks

2006/09/13

Запуск скриптов в фоновом режиме в Linux/Windows

Linux:

# script &

Windows:

c:\start script.exe

Очень удобно запускать параллельно несколько скриптов из одного bat-файла, например так:

start script1.exe
start script2.exe
start script3.exe
start script4.exe