Пишем скрипт инициализации в Ubuntu на примере скрипта фаерволла iptables

Иногда появляется необходимость написать какой нибудь скрипт, который бы запускался автоматически при загрузки, выключении или перезагрузки системы. Upstart в Runtu (Ubuntu) Linux (замена стандартного inittab присутствующий в классических системах Linux) позволяет решать многие административные задачи.

Например вы никогда не задумывались, как же запускается демон kdm при загрузки системы? В данной статье я постараюсь ответить на этот вопрос и попробуем написать скрипт инициализации сами.
В Ubuntu Linux уровни исполнения находятся в директории /etc/initX.d. Где X номер уровня исполнения.
Ниже приведен полный список с описанием

/etc/rc0.d | уровень исполнения 0 | выполняет скрипт при выключении системы
/etc/rc1.d | уровень исполнения 1 | однопользовательский режим (single user mode) аналогичен Safe Mode в Windows.
/etc/rc2.d | уровень исполнения 2 | многопользовательский режим (multiuser mode)
/etc/rc3.d | уровень исполнения 3 | зарезервированно
/etc/rc4.d | уровень исполнения 4 | зарезервированно
/etc/rc5.d | уровень исполнения 5 | зарезервированно
/etc/rc6.d | уровень исполнения 6 | выполнение при при перезагрузки

Основной скрипт исполнения находится в директории /etc/init.d. Если посмотреть по ls -la одну из дирректорий (/etc/rcX.d) то можно увидеть что сами скрипты там не присутствуют, имеются только символический ссылки на них. Например директория /etc/rc0.d (выключение системы):

ali@server:~# sudo ls -la /etc/rc0.d
итого 20
drwxr-xr-x 2 root root 4096 2008-03-15 22:38 .
drwxr-xr-x 153 root root 12288 2008-03-16 22:41 ..
lrwxrwxrwx 1 root root 13 2007-11-01 18:35 K01kdm -> ../init.d/kdm
...

где:
K - "убить" процесс, 01 - порядковый номер исполнения (в данном случае демон kde при выключении системы завершается первым) далее идет имя скрипта.

Теперь посмотрим другую дирректорию rc2.d (multiuser mode):

ali@server:~# ls -la /etc/rc2.d
lrwxrwxrwx 1 root root 13 2007-11-01 18:35 S13kdm -> ../init.d/kdm

В данном случае скрипт kdm, который находится в дирректории /etc/init.d запускается 13-м, об этом свидетельствует наличия буквы S перед порядком исполнения скрипта (S - start).

В отличии от многих других классический Linux дистрибьютивов (Slackware), Ubuntu и Debian использует upstart для запуска скриптов инициализации. Поэтому не удивляйтесь, если в /etc/ не окажется файла inittab (его заменили скрипты upstart, которые находятся в /etc/event.d). Upstart это замена демону init, которая контролирует процессы и задачи во время загрузки, выключения системы и непосредственно во время работы.

Давайте попробуем написать простейший скрипт, который будет поднимать нам NAT защищать от syn flood атак и т.д. (фаерволл на iptables).
Для начала, создадим в /etc/ файл rc.firewall с правилами iptables:

#!/bin/bash

# Включаем IP форвардинг
echo "1" > /proc/sys/net/ipv4/ip_forward

# Защита от Syn flood атаки
echo "1" > /proc/sys/net/ipv4/tcp_syncookies
IPT="/sbin/iptables"
LO_INTERFACE="lo"
WAN_INTERFACE="eth0"
NAT_INTERFACE="eth1"

# чистим все правила
$IPT -t filter -F
$IPT -t filter -X
$IPT -t nat -F
$IPT -t nat -X
$IPT -t mangle -F
$IPT -t mangle -X

# безлимитный трафик для lo интерфейса
$IPT -t filter -A INPUT -i $LO_INTERFACE -j ACCEPT
$IPT -t filter -A OUTPUT -o $LO_INTERFACE -j ACCEPT

# Трансляция IP адресов (NAT)
$IPT -t nat -A POSTROUTING -o $NAT_INTERFACE -j MASQUERADE
$IPT -t nat -A POSTROUTING -o $WAN_INTERFACE -j MASQUERADE

В данном случае у нас имеются 2 сетевых интерфейса eth0 и eth1. eth0 у нас выходит в интернет, eth1 локалка.
Строчка echo "1" > /proc/sys/net/ipv4/tcp_syncookies включает syn cookies, что позволяет защитить от syn flood атаки (читайте документацию по sysctl). Сточка echo "1" > /proc/sys/net/ipv4/ip_forward включает IP форвардинг, без него нат работать не будет. И далее ниже, безлимитный трафик для loopback интерфейса (т.е. для нас). Еще ниже трансляция IP адресов (грубо говоря позволяем копьютерам подключенным к eth1 выходить в интернет).
Сохраняем скрипт и выходим. Обязательно нужно дать ему права на исполнения:
ali@server:~# sudo chmod +x /etc/rc.firewall

Пришло время писать основной скрипт, который будет запускать /etc/rc.firewall при включении компьютера.

Создадим такой скрипт в /etc/init.d:
ali@server:~# sudo vi /etc/init.d/iptables

#!/bin/bash
IPT="/sbin/iptables"
START="/bin/bash"
PATH="/sbin:/bin:/usr/sbin:/usr/bin"
NAME="$0"
N="/etc/init.d/$NAME"

if [ ! -f /etc/rc.firewall ]; then
echo "/etc/rc.firewall does not exist"
exit 0
fi

case "$1" in
start|restart)
echo -n "Starting up iptables firewall..."
$START /etc/rc.firewall
echo "done."
;;
stop)
$IPT -t filter -F
$IPT -t filter -X
$IPT -t nat -F
$IPT -t nat -X
$IPT -t mangle -F
$IPT -t mangle -X
echo "done."
exit 0;
;;
*)
echo "Usage: $N {start|restart|stop}" >&2
exit 1
;;
esac

exit 0

Думаю тут все понятно. Если параметры скрипту не указаны, он будет выводить сообщение Usage: $N {start|restart|stop}. При запуске скрипта с параметром start, iptables будет загружаться. При запуске с параметром stop все правила будут потираться.

Осталось отредактировать данный скрипт, чтобы он запускался при загрузки системы, а при перезагрузке или выключении системы, прекращал свою работу.

Для этого как говорилось выше достаточно создать символические ссылки на него в /etc/rc0.d (выключении), /etc/rc1.d /etc/rc2.d (однопользовательский режим и многопользовательский режим) и /etc/rc6.d (перезагрузка).

Создаем символические ссылки:
ali@server:~# sudo ln -s /etc/init.d/iptables /etc/rc0.d/K20iptables # завершение скрипта при выключении
ali@server:~# sudo ln -s /etc/init.d/iptables /etc/rc1.d/S20iptables # запуск при single user mode
ali@server:~# sudo ln -s /etc/init.d/iptables /etc/rc2.d/S20iptables # запуск при multi user mode
ali@server:~# sudo ln -s /etc/init.d/iptables /etc/rc6.d/K20iptables # завершения скрипта при перезагрузки

Вот и все Wink
На последок, если вы не хотите заморачиваться с утилитой ln создавая при этом по одной символическую ссылку, можно вопользоваться утилитой uptade-rc.d либо более удобной sysv-rc-conf.

Внешний вид утилиты sysv-rc-conf:
sysv-rc-conf.jpg

Ссылки:
]]>Официальный сайт утилиты upstart]]>

Автор: t0x1n

Комментарии

Re: Пишем скрипт инициализации в Ubuntu на примере скрипта ...

Спасибо за статью! Доходчиво и достаточно лаконично. Пригодилось:)

Здесь, если не ошибаюсь, небольшая неточность
В Ubuntu Linux уровни исполнения находятся в директории /etc/initX.d. Где X номер уровня исполнения.

Comment by Koshkin on Авг 26th, 2009 at 2:01 после полудня

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны HTML теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <img>
  • You can use BBCode tags in the text. URLs will automatically be converted to links.
  • Поисковые системы будут индексировать и переходить по ссылкам на разрешённые домены.

  • You may insert videos with [video:URL]
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>, <apt>, <c>, <cpp>, <drupal5>, <drupal6>, <java>, <javascript>, <pascal>, <php>, <python>, <ruby>, <sql>, <xml>. The supported tag styles are: <foo>, [foo].
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании