|
Пишем скрипт инициализации в Ubuntu на примере скрипта фаерволла iptables. |
|
|
|
|
Автор: t0x1n
|
|
17.03.2008 00:22 |
Иногда появляется необходимость написать какой нибудь скрипт, который бы запускался автоматически при загрузки, выключении или перезагрузки системы. Upstart в 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 # завершения скрипта при перезагрузки
Вот и все ;-)
На последок, если вы не хотите заморачиваться с утилитой ln создавая при этом по одной символическую ссылку, можно вопользоваться утилитой uptade-rc.d либо более удобной sysv-rc-conf.
Внешний вид утилиты sysv-rc-conf:

Ссылки:
http://upstart.ubuntu.com/ Оффициальный сайт утилиты upstart
|
|
Обновлено ( 26.06.2008 21:14 )
|
Комментарии
sudo update-rc.d имя_скрипта defaults Ответить | Ответить с цитатой | Цитировать
Я описал более подробно о создании скрипта инициализации при загрузки и выключении системы. Ответить | Ответить с цитатой | Цитировать