База знаний

www. IT-Mehanika .ru --  журнал доброго админа

Bash скрипт для конфигурирования фаервола на основе Iptables

Хочу Вам предоставить небольшой скрипт, реализации гибкого фаервола, на основе Iptables, для начинающих системных администраторов. Хотя я сам только учусь, хочу поделиться своими знаниями. Была у меня мысль создать скрипт, который бы задавал вопросы, а я отвечал на ответы, и в конце мне выдавалось правило Iptables, которое я бы мог применить в системе, и у меня получился бы фаервол.

Этот скрипт испытывал на системе Ubuntu 8.04 / 8.10

Если вы найдете какие-нибудь недостатки, извиняйте.

Скрипту необходимо дать права доступа на запуск, и производить запуск от root.

Сам скрипт.

Код:

#!/bin/bash
clear
echo  "*****************************Добропожаловать******************************"
echo  "\       /\       /  -----  |      -----    ------    -   - -   -     -----"
echo  " \     /  \     /  |       |     |        |      |  |     \/    |   |"
echo  "  \   /    \   /   |----   |     |        |      |  |     ||    |   |----"
echo  "   \ /      \ /    |       |     |        |      |  |           |   |"
echo  "    |        |     |____   |____ |_____   |______|  |           |   |_____"
echo  "Нажмите Enter для Продолжения..."
read temp
checkstatus ()
{
clear
opt_checkstatus=1
while [ $opt_checkstatus != 9 ]
do
clear
echo  "\n\tУведомление:Сохраните ваши правила Iptables перед остановкой/перезапуском сервисов iptables\n"
echo  "1. Сохранение iptables\n
2. Статус Iptables\n
3. Запуск сервисов iptables\n
4. Остановка сервисов iptables\n
5. Перезапуск сервисов iptables\n
6. Сброс iptables (**Эту функцию используйте осторожно_ она удаляет все правила из iptables**)\n
7. Создание бекапа установленных правил\n
8. Восстановление правил из бекапа\n
9. Возврат в Главное Меню"
read opt_checkstatus
case $opt_checkstatus in
1) clear
echo  "*******************************************************\n"
/etc/init.d/iptables save
echo  "\n*******************************************************\n"
echo  "Нажмите Enter для Продолжения..."
read temp;;
2) clear
echo  "*******************************************************\n"
/etc/init.d/iptables status
echo  "*******************************************************"
echo  "Нажмите Enter для Продолжения..."
read temp;;
3) clear
echo  "*******************************************************\n"
/etc/init.d/iptables start
echo  "*******************************************************\n"
echo  "Нажмите Enter для Продолжения..."
read temp;;
4) clear
echo  "*******************************************************\n"
/etc/init.d/iptables stop
echo  "*******************************************************\n"
echo  "Нажмите Enter для Продолжения..."
read temp;;
5) clear
echo  "*******************************************************\n"
/etc/init.d/iptables restart
echo  "*******************************************************\n"
echo  "Нажмите Enter для Продолжения..."
read temp;;
6) clear
iptables -F
echo  "****************************************************************************"
echo  "Все правила Iptables сброшены !!!"
echo  "****************************************************************************\n"
echo  "Нажмите Enter для Продолжения..."
read temp;;
7) clear
iptables-save > /root/working.iptables.rules
echo "*****************************************************************************"
echo "Создан бекап Ваших правил iptables в файл /root/working.iptables.rules"
echo "*****************************************************************************\n"
echo  "Нажмите Enter для Продолжения..."
read temp;;
8) clear
iptables-restore < /root/working.iptables.rules
echo "*****************************************************************************"
echo "Ваши правила iptables были восстановлены с файла /root/working.iptables.rules"
echo "*****************************************************************************\n"
echo  "Нажмите Enter для Продолжения..."
read temp;;
9)clear
main;;
*) clear
echo  "Неправильный выбор опции!!!"
echo  "Нажмите Enter для Продолжения..."
read temp
esac
done
}
###############################Создание фаервола##############################
buildfirewall ()
{
clear
###############Начало цепи############
echo  "Использование цепи таблицы по-умолчанию FILTER?\n
1. Входящие/получаемые пакеты INPUT
2. Исходящие/отправляемые пакеты OUTPUT
3. Проходящие (пересылаемые) пакеты Forward"
read opt_ch
case $opt_ch in
1) chain="INPUT" ;;
2) chain="OUTPUT" ;;
3) chain="FORWARD" ;;
*) clear
echo  "Неверный выбор опции!!!"
echo  "Нажмите Enter для Продолжения..."
read temp
esac

#########Получаем Ip адресс источника##########
clear
echo  "
1. В Фаерволе используется Одиночный Исходящий IP (Source IP)\n
2. В Фаерволе используется Исходящая подсеть (Source subnet)\n
3. В Фаервол используются Все Исходящие сети (All Source Networks)\n"
read opt_ip
case $opt_ip in
1) clear
echo  "\nПожалуйста введите IP адресс источника (Ip-address source)"
read ip_source ;;
2) clear
echo  "\nПожалуйста введите исходящую подсеть (Source subnet) (например 192.168.10.0/24)"
read ip_source ;;
3) clear
ip_source="0/0" ;;
#4) ip_source = "NULL" ;;
*) clear
echo  "Неверный выбор опции"
echo  "Нажмите Enter для Продолжения..."
read temp
esac
#########Получаем IP адресс назначения##########
clear
echo  "
1. В Фаерволе используется Одиночный IP адресс назначения (Single IP-address destination)\n
2. В Фаерволе используется Подсеть назначения (Destination subnet)\n
3. В Фаерволе используется Все сети назначения (All destination Networks)\n"
read opt_ip
case $opt_ip in
1) clear
echo  "\nПожалуйста введите IP адресс назначения"
read ip_dest ;;
2) clear
echo  "\nПожалуйста введите подсеть назначения (например 192.168.10.0/24)"
read ip_dest ;;
3) clear
ip_dest="0/0" ;;
#4) ip_dest = "NULL" ;;
*) clear
echo  "Неверный выбор опции"
echo  "Нажмите Enter для Продолжения..."
read temp
esac
###############Получение данных о протоколе#############
echo  "
1. Блокировать весь трафик по TCP
2. Блокирование определенных TCP служб
3. Блокирование определенного порта
4. Использование без составления протокола"
read proto_ch
case $proto_ch in
1) proto=TCP ;;
2) echo  "Введите имя TCP службы: (ПРОПИСНЫМИ БУКВАМИ!!!)"
read proto ;;
3) echo  "Введите имя порта: (ПРОПИСНЫМИ БУКВАМИ!!!)"
read proto ;;
4) proto="NULL" ;;
*) echo  "Неверный выбор опции!!!"
echo  "Нажмите Enter для Продолжения..."
read temp
esac

#############Правила#############
echo  "Что сделать с правилом?
1. Принять пакет (Accept the Packet)
2. Отклонить пакет (Reject the Packet)
3. Выбросить пакет (Drop the Packet)
4. Создать журнал (Create Log)"
read rule_ch
case $rule_ch in
1) rule="ACCEPT" ;;
2) rule="REJECT" ;;
3) rule="DROP" ;;
4) rule="LOG" ;;
esac
###################Генерирование правил####################
echo  "\n\tНажмите Enter для генерирования конечного правила!!!"
read temp
echo  "Сгенерированно правило \n"
if [ $proto == "NULL" ]; then
echo  "\niptables -A $chain -s $ip_source -d $ip_dest -j $rule\n"
gen=1
else
echo  "\niptables -A $chain -s $ip_source -d $ip_dest -p $proto -j $rule\n"
gen=2
fi
echo  "\n\tВы хотите ввести и применить это правило Iptables? Да=1 , Нет=2"
read yesno
if [ $yesno == 1 ] && [ $gen == 1 ]; then
iptables -A $chain -s $ip_source -d $ip_dest -j $rule
else if [ $yesno == 1 ] && [ $gen == 2 ]; then
iptables -A $chain -s $ip_source -d $ip_dest -p $proto -j $rule

else if [ $yesno == 2 ]; then

main
fi
fi
fi
}

main ()
{
ROOT_UID = 0
if [ $UID == $ROOT_UID ];
then
clear
opt_main=1
while [ $opt_main != 4 ]
do
clear
echo  "***************************************************************"
#############Проверка установлен ли iptables или нет############
echo "\t*****Главное Меню*****\n
1. Проверка пакета Iptables\n
2. Службы Iptables\n
3. Создание Вашего фаервола на основе Iptables\n
4. Выход"
echo "****************************************************************"
read opt_main
case $opt_main in
1) clear
echo  "*********************************************************"
dpkg -s iptables
echo  "*********************************************************"
echo  "Нажмите Enter для Продолжения..."
read temp;;
2) checkstatus ;;
3) buildfirewall ;;
4) exit 0 ;;
*) echo  "Неверный выбор опции!!!"
esac
done
else
echo  "Вы должны быть пользователем ROOT для запуска скрипта!!!"
fi
}
main
exit 0