Хочу Вам предоставить небольшой скрипт, реализации гибкого фаервола, на основе 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