23 декабря 2005 г.

Настройка firewall в Slackware.

Меня регулярно просят выложить заготовку скрипта для организации firewall. Ну вот, выкладываю.

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

6 комментариев:

  1. Да Да Да. С этого мы и начинали =)

    by TuLiss

    ОтветитьУдалить
  2. А обязательно было со словом сase так извращаться ?, скрипт-то не очень рабочий =)

    ОтветитьУдалить
  3. Не понял? Что значит извращаться и что значит не рабочий?

    У меня работает, что я делаю не так?

    ОтветитьУдалить
  4. Да нет, всё вроде так, только в первом слове 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)'
    =============================

    После перебивания буквы с на латинскую, всё ОК :)

    ОтветитьУдалить
  5. Ок, поправил.

    Хотя странно, я этот скрипт методом копи-пэйст записывал.

    ОтветитьУдалить