
Задача:
имеется хост в локалке. необходимо обеспечить пропуск в "мир" исходящих запросов и пропуск входящих на заданные порты. Всё остальное - рубить нещадно.
Пример скриптика, взводящего нужные правила на шлюзе:
eth0 - локалка, eth1 - наружу
IP1 - внутренний IP хоста, IP2 - внешний адрес хоста (у меня - не совпадающий с внешним адресом шлюза)
#!/bin/sh
I='/usr/sbin/iptables'
IP1='192.168.0.2'
IP2='a.b.c.d'
# создаем дополнительный чейн
$I -N chain1 2>/dev/null
$I -F chain1
# кидаем входящие-исходящие пакеты хоста в новый чейн для проверок
# помещаем в начало (-I) форвард чейна - но это от последовательности запуска скриптов зависит
$I -I FORWARD -s $IP1 -j chain1
$I -I FORWARD -d $IP1 -j chain1
# нат
$I -t nat -A POSTROUTING -s $IP1 -o eth1 -j SNAT --to-source $IP2
$I -t nat -A PREROUTING -d $IP2 -i eth1 -j DNAT --to-destination $IP1
# Исходящие пакеты - пропускаем все
$I -A chain1 -s $IP1 -o eth1 -j ACCEPT
# Входящие
# принимать SYN пакеты на входе на порт 80 (делаем защищенный веб сервер)
$I -A chain1 -p tcp --dport 80 -d $IP1 -i eth1 --tcp-flags SYN,ACK,FIN SYN -j ACCEPT
# принимаем пакеты установленных соединений
# необходимо (в т.ч.) для работы исходящих запросов
$I -A chain1 -d $IP1 -i eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
# принимаем все локальные пакеты (с внутреннего eth0)
$I -I chain1 -d $IP1 -i eth0 -j ACCEPT
# блокируем всё остальное
$I -A chain1 -j DROP
Скрипт модифицировать под собственные нужды
"No! Try not! Do. Or do not. There is no try." -- Yoda