Это только заготовка! Вам самим прийдется добавлять в функции init() правила, разрешающие хождения пакетов.
===================================================================
#!/bin/bash=============================================================
IPT=/usr/sbin/iptables
IPTR=/usr/sbin/iptables-restore
IPTS=/usr/sbin/iptables-save
OUT=eth0
start()
{
echo -n "Starting firewall... "
$IPT -F
$IPT -t nat -F
$IPT -t mangle -F
$IPTR -c /etc/iptables
echo "Done"
}
stop()
{
echo -n "Stop firewall... "
$IPTS -c > /etc/iptables
echo "Done"
}
init()
{
echo -n "Init firewall... "
reset
# DNS ENABLE ========== Просто как пример
$IPT -A INPUT -p tcp --dport 53 -j ACCEPT
$IPT -A INPUT -p udp --dport 53 -j ACCEPT
# Свои правила писать тут
# SAVE rules in file ==
$IPTS -c > /etc/iptables
echo "Done"
}
reset()
{
$IPT -F
$IPT -t nat -F
$IPT -t mangle -F
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
#===================
# STATE RULES ====== ОБЯЗАТЕЛЬНО!
$IPT -A INPUT -m state --state INVALID -j DROP
$IPT -A FORWARD -m state --state INVALID -j DROP
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# LOCALHOST =========== ОБЯЗАТЕЛЬНО!
$IPT -A FORWARD -i $OUT -s 127.0.0.1 -j DROP
$IPT -A INPUT -i $OUT -s 127.0.0.1 -j DROP
$IPT -A FORWARD -i $OUT -d 127.0.0.1 -j DROP
$IPT -A INPUT -i $OUT -d 127.0.0.1 -j DROP
$IPT -A INPUT -d 127.0.0.1 -j ACCEPT
$IPT -A INPUT -s 127.0.0.1 -j ACCEPT
# ICMP ENABLED = потому что так надо!
$IPT -A INPUT -p icmp -j ACCEPT
# SSH enable + защита от подбора паролей
$IPT -A INPUT -p tcp -i eth0 -m state --state NEW --dport 22 -m recent --update --seconds 20 -j DROP
$IPT -A INPUT -p tcp -i eth0 -m state --state NEW --dport 22 -m recent --set -j ACCEPT
}
case $1 in
start)
start ;;
stop)
stop ;;
init)
init ;;
reset)
reset ;;
*)
echo "Usage ./rc.fw start|stop|init|reset"
exit 88
esac
Маленькое описание.
start() - запускает firewall. Данные читает из /etc/iptables.
stop() - останавливает firewall, сохраняя текущие правила и счетчики в /etc/iptables.
init() - первоначальная инициализация firewall. Тут надо писать правила. После изменения ОБЯЗАТЕЛЬНО запускайте ./rc.fw init. Заодно сохранит текущие правила в /etc/iptables.
reset() - используйте в том случае, когда изменяете правила на машине удаленно и не имеете к ней доступа. Добавьте rc.fw reset в crontab на время настройки. Если случайно закроете удаленный вход, rc.fw reset очистит правила и разрешит вход по ssh. После завершения редактирования, НЕ ЗАБУДЬТЕ УБРАТЬ ЕЕ ИЗ CRONTAB!
Да Да Да. С этого мы и начинали =)
ОтветитьУдалитьby TuLiss
А обязательно было со словом сase так извращаться ?, скрипт-то не очень рабочий =)
ОтветитьУдалитьНе понял? Что значит извращаться и что значит не рабочий?
ОтветитьУдалитьУ меня работает, что я делаю не так?
Да нет, всё вроде так, только в первом слове case у вас судя по всему буква "c" написана в кириллице. Я специально скопировал ещё раз ваш конфиг в файл и сделал ему init, вот лог
ОтветитьУдалить=============================
unix:~ # sh fw.rc start
fw.rc: line 68: сase: command not found
fw.rc: line 69: syntax error near unexpected token `)'
fw.rc: line 69: ` start)'
=============================
После перебивания буквы с на латинскую, всё ОК :)
Ок, поправил.
ОтветитьУдалитьХотя странно, я этот скрипт методом копи-пэйст записывал.
Спасибо! Очень помогло!
ОтветитьУдалить