Меня регулярно просят выложить заготовку скрипта для организации 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!