Логика и правила iptables

Материал из Gentoo Linux Wiki

Перейти к: навигация, поиск
Вернуться в раздел руководства

Содержание

[править] Введение

Алексей Лесовский aka Daevy предоставил материал для опубликования с благодарностью Чернову Андрею, как наставнику и помощнику

[править] Что должно быть в наличии

  1. Настроенная сеть
  2. Настройки в ядре

для начала чтобы установить iptables необходимо чтоб в ядре присутствовали следующие опции

Linux Kernel Configuration:
Networking Options --->
    IP: advanced router (работа в качестве маршрутизатора)
    IP: policy routing (дополнительные функции маршрутизации)
    Network packet filtering framework (Netfilter) --->
         Network packet filtering debugging (подробный вывод фильтрации пакетов)
         Core Netfilter Configuration --->
	Netfilter connection tracking support (необходимо для NAT и маскарадинга)
	Netfilter Xtables support (обязательна для iptables)
	"********" target support (поддержка функций действия над пакетом)
	(MARK - нанесение меток на пакеты)
	(NFLOG - журналирование пакетов)
	"*********" match support (поддержка дополнительных функций)
	(ESP - поддержка ESP)
	(limit - позволяет устанавливать лимиты на количество проходимых пакетов в промежуток времени)
	(mac - позволяет работать с mac-адресами в заголовках пакетов)
	(mark - позволяет работать с метками)
	(IPSec policy - позволяет работать с пакетами ipsec)
	(Multiple port - поддержка указания диапазонов адресов в наборах правил)
          Netfilter Configuration
	IPtables support
	IP range match support
	Packet filtering
	REJECT target suport
	LOG target support
	ULOG target support
	Packet mangling (изменение служебных битов в пакетах TTL,TOS,ECN)
	ARP tables support (можно к нему добавить packet filtering, payload mangling)

Эти опции добавлены в моем ядре, в таком случае мы получим iptables, который сможет фильтровать пакеты, наносить на них метки, ограничивать частоту поступления пакетов, заносить в журналы, работать с пакетами по поределенным mac-адресам, изменять биты TOS,TTL.

[править] Установленный iptables

установка Iptables, просмотр зависимостей

emerge -pv iptables

далее если необходимы какие то дополнительные фичи, то используем файл /etc/portage/package.use

echo "net-firewall/iptables ipv6 static" >> /etc/portage/package.use Такое выставление USE флагов для единственного пакета позволит обновится до следующей версии iptables с прежними значениями USE для данного пакета.

[править] Логика работы

Пока компилится iptables рассмотрим что происходит с пакетами когда они попадают на интерфейс роутера.

Бывает три маршрута:

  1. пакет предназначен локальному процессу (локальному приложению),
  2. пакет предназначен другой машине (проходит транзитом),
  3. пакет исходит от локального процесса и идет куда то дальше (от локального приложения).

И еще раскажу о таком понятии как mangle, это обычное изменение заголовков пакета, тут может быть

  • установка TOS (типы обслуживания пакетов),
  • TTL (время жизни пакета).
  • PREROUTING - изменение адреса назначения в пакете.
  • POSTROUTING - изменение адреса источника в пакете.
  • PREROUTING используется как правило для входящих пакетов, чтобы перенаправить определенные запросы на какойто сервис в подконтрольной сети, например на фтп.
  • POSTROUTING - использутеся для исходящих пакетов, очень полезен в таблице nat, когда в подконтрольной сети 200 машин и все хотят в инет, а внешний адрес всего один, т.е. проходя через такую обработку из интернета это выглядит так как будто все 200 разных запросов идут с одного адреса.

Сценарии обработки:

  • Для первого маршрута: пакет попадает на интерфейс далее идет в таблицу mangle PREROUTING, затем в nat PREROUTING, mangle INPUT, filter INPUT и наконец локальному приложению
  • Для второго маршрута: сеть -> mangle PREROUTING -> nat PREROUTING -> mangle FORWARD -> filter FORWARD -> mangle POSTROUTING -> nat POSTROUTING -> сеть
  • Для третьего маршрута: локальный процесс -> mangle OUTPUT -> nat OUTPUT -> filter OUTPUT -> mangle POSTROUTING -> nat POSTROUTING -> сеть

может показаться немного запутанным прохождение пакета по таблицам, но рассмотрев скрипт вcе встанет на свои места

[править] Управление правилами

Далее приведу скрипт, но по ходу там даны комментарии. если его использовать, то комментарии можно подрезать:-)

Скрипт /etc/init.d/firewall так то я его использую сразу как хранилище всех правил и при необходимости исправляю или добваляю новые. Образно его можно разбить на несколько частей

  • определение переменных
  • создание общих цепочек применимых во всех таблицах (INPUT FORWARD OUTPUT)
  • создание цепочек под конкретные таблицы (входящий транзитный исходящий трафики)
  • дополнительные навороты (часто можно увидеть защиту от флуда по ssh, определение сканеров портов)

Здесь и начинается прохождение пакетов, при соответствии определенному правилу, к пакету применяется решение либо разрешить либо дропнуть или что то другое.

  • цепочка mangle, nat PREROUTING (таблица nat для проходящих, во внутренние сети, пакетов)
  • цепочка filter INPUT (таблица для входящих пакетов предназначенных для локальных процессов)
  • цепочка filter FORWARD (для проходящих пакетов, предназначенных для других систем)
  • цепочка filter OUTPUT (исходящие пакеты от локальных процессов)
  • цепочка mangle, nat POSTROUTING (таблица nat для исходящих пакетов с внутренних сетей)

Особо хочется отметить таблицы nat PRE- и POSTROUTING в этих цепочках при прохождении пакетов изменяются определенные поля в заголовках пакетов, а именно source address и destination address делается это для определенных целей, далее по ходу скрипта это будет объясняться.

Также немного о командах и параметрах используемых в построении цепочек, и небольшие примеры. Команды:

  • -N создать новую цепочку
  • -F очистить все правила в цепочке
  • -A добавить правило в цепочку
  • -D удалить правило из цепочки
  • -R заменить правило в цепочке на другое
  • -I вставить правило в цепочку
  • -L вывод списка правил

Пример:

iptables -N new_chain		#создаем цепочку new_chain
iptables -F new_chain		#очищаем ее
iptables -A new_chain -p tcp -j ACCEPT	#добавляем в нее правило "-p tcp -j ACCEPT"

Параметры или критерии:

  • -p протокол, может принимать значения icmp,tcp,udp
  • -s адрес источника
  • -d адрес назначения
  • -i интерфейс на который пришел пакет
  • -o интерфейс с которого уйдет пакет

неявные критерии:

  • --sport порт источника (для любых протоколов)
  • --dport порт назначения (для любых протоколов)
  • --tcp-flags флаги в заголовке tcp-пакета (только для -p tcp)
  • --icmp-type тип icmp-пакета (только для -p icmp)

Примеры:

iptables -A FORWARD -s 192.168.1.0/24 -d www.ru -p tcp --dport 80 -j ACCEPT

если по-русски, то пакеты идущие с сети 192.168.1.0/24 на адрес www.ru по протоколу tcp с портом назначения 80, разрешить

iptables -A INPUT -i eth0 -p udp --sport 10024 -j ACCEPT

пакеты приходящие на интерфейс eth0 по протоколу udp и портом источника 10024 разрешить

Сетевые протоколы
Прикладной уровень HTTP, SMTP, SSH, SNMP, FTP, NNTP, NTP, LDAP, ...
Сеансовый уровень TLS, SSL, RPC, WSP...
Транспортный уровень TCP, UDP, SCTP, ICMP, OSPF, RSVP, VRRP, RTP, DCCP ...
Сетевой уровень IPv4, IPv6, ARP, RARP, MPLS, IPX ...
Канальный уровень Ethernet, 802.11, xDSL, Fibre Channel, FDDI, ATM, ISDN ...
Таблица протоколов для ориентации







Еще хочется сказать про явные критерии limit, mark, mac, multiport, state др. Помните в начале указывались параметры ядра, так вот match support включает дополнительные критерии. добавляются буквой "m" выглядят следующим образом:

  • -m state - определение состояния (возможные значения, --state NEW,ESTABLISHED,RELATED,INVALID)
  • -m limit - включение лимита (--limit цифра/second /minute /hour /day)
  • -m mark - маркировка (--mark цифра)
  • -m multiport - диапазон портов (--sport 22,25,53 или --dport 1024:10000)
  • -m mac - критерий проверки mac-адреса (--mac-source 00:00:00:00:00:FE)

Пример:

iptables -A INPUT -p tcp -m multiport --dport 22,53,80,110 -j ACCEPT

пакеты по протоколу tcp с портами назначения 22,53,80,110 разрешить

iptables -A INPUT -p tcp -m mark --mark 1 -j ACCEPT

пакеты tcp маркированные "единичкой" пропустить

Вобщем каждое правило - это строка, содержащая в себе критерии определяющие, подпадает ли пакет под заданное правило, и действие, которое необходимо выполнить в случае выполнения критерия. В общем виде правила записываются примерно так:

iptables [-t табличка] команда [match] [target/jump]

Нигде не утверждается, что описание действия (target/jump) должно стоять последним в строке, но так правило читается удобнее.

[править] Правила с объяснениями

Теперь сам скрипт. Работал он у меня в таком случае: было 2 сети внешняя и внутренняя, клиентам внутренней сети необходимо было лазить в интернете, получать почту, общаться по аське, мне самому надо было юзать ssh, и также была необходимость в пингах:), сам шлюз должен был также иметь инет, так как на нем крутились squid(проксяк), кэширующий dns(bind). таким образом разрешены:

  • входящие icmp,ssh,dns,запросы для squid'а (порт 3128)
  • транзитные icmp,smtp,pop3,ssh,aol
  • исходящие icmp,dns,http,https,ssh
  • также все запросы по протоколам icmp,smtp,pop3,ssh,aol натятся во внешний адрес. Одно замечание по поводу snat, это всего лишь надстройка, чтобы он заработал необходимо разрешить транзит этих же протоколов в таблице FORWARD.
Файл: /etc/init.d/firewall
################################BEGIN OF FILE###################################
#!/sbin/runscript
# Copyright 1999-2005 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/net-firewall/iptables/files/iptables-1.3.2.init,v 1.4 2006/11/11 08:25:00 vapier Exp $

opts="save reload panic"

#######################################################################################################
# Настройки IPTABLES ----- Iptables Settings
# здесь определяются переменные используемые в процедурах старта, перезапуска, останова и т.д.
#######################################################################################################

IPTABLES_NAME="iptables"
IPTABLES="/sbin/iptables"
SAVE_RESTORE_OPTIONS="/etc/firewall.rules"
IPTABLES_SAVE="/sbin/iptables-save"
IPTABLES_RESTORE="/sbin/iptables-restore"
IPTABLES_PROC="/proc/net/ip_tables_names"
FIREWALL="/etc/firewall.rules"
POLICY="DROP"

#######################################################################################################
# Настройки интерфейсов ----- Interfaces Settings
#######################################################################################################

WAN1_IF="eth0"		# внешний интерфейс
WAN1_IP="10.1.0.5"	# адрес на внешнем интерфейсе
WAN1_GW="10.1.0.1"	# шлюз провайдера

LAN="192.168.1.0/24"	# внутренняя сеть
LAN1_IF="eth1"		# внутренний интерфейс
LAN1_IP="192.168.1.1"	# адрес на внутреннем интерфейсе

LO_IF="lo"		# loopback-интерфейс
LO_IP="127.0.0.1"		# loopback-адрес
LOOPBACK="127.0.0.0/8"	# loopback-петля

DNS="196.196.80.235"	# DNS-провайдера

echo 1 > /proc/sys/net/ipv4/ip_forward	#ядро должно знать что оно может продвигать пакеты

depend() {
        before net
        use logger
}

# Установка политики по умолчанию (переменная $POLICY установлена в DROP, т.е. пакеты будут дропаться)
rules() {
ebegin "Setting default policy to $POLICY"
    $IPTABLES -P INPUT $POLICY
    $IPTABLES -P FORWARD $POLICY
    $IPTABLES -P OUTPUT $POLICY

#########################################################################
# Общие Правила - COMMON RULES
# Здесь мы создаем различные цепочки, которые висят в памяти ядра, далее в таблицах при определенных 
# условиях мы будем направлять пакеты в эти цепочки.
#########################################################################
ebegin "Сreating user-defined chains"
# Разрешаем прохождение statefull-пакетов. Эта цепочка обязательная она разрешает прохождение пакетов в
# уже установленных соединениях(ESTABLISHED), и на установление новых соединений от уже установленных
# (RELATED) 
    einfo "Creating states chain"
  $IPTABLES -N allowed	
  $IPTABLES -F allowed	
  # "allowed" это просто имя, можно использовать что нибудь и другое:)
  # Разрешаем прохождение statefull трафика. Далее идет собственно сам список правил
  $IPTABLES -A allowed -m state --state ESTABLISHED,RELATED -j ACCEPT
  # Журналируем все обращение к этому серверу от WAN-сетей :) Мы не ждем гостей !
  $IPTABLES -A allowed -i $WAN1_IF -m limit --limit 1/second -j ULOG --ulog-prefix "Bad packet from $WAN1_IF"
  $IPTABLES -A allowed -j $POLICY

# Цепочка общего разрешения использовать аккуратно!
# Эту цепочку я использую когда необходимо разрешить прохождение пакетов, с определенных портов или адресов
   einfo "Creating common accepting chain"
   $IPTABLES -N com-allow
   $IPTABLES -F com-allow
   $IPTABLES -A com-allow -p tcp -j ACCEPT
   $IPTABLES -A com-allow -p udp -j ACCEPT

#----------------------------------------------------------------------------------------------------------
# Правила для входящего трафика
#----------------------------------------------------------------------------------------------------------
# 1. Создаем цепочку для входящих ICMP.
# 2. Создаем цепочку для входящего SSH трафика.

# 1. Разрешаем ICMP
einfo "Creating incoming icmp traffic chain"
  $IPTABLES -N icmp_in
  $IPTABLES -F icmp_in
# здесь можно увидеть применения модуля "state" т.е. состояние. пропускаются пакеты со статусом NEW, 
# остальные нам не нужны
  $IPTABLES -A icmp_in -m state --state NEW -p icmp --icmp-type echo-request -j ACCEPT
  $IPTABLES -A icmp_in -m state --state NEW -p icmp --icmp-type time-exceeded -j ACCEPT
  $IPTABLES -A icmp_in -m state --state NEW -p icmp --icmp-type destination-unreachable -j ACCEPT
# Журналируем ICMP-пакеты, нам не нужны эти пакеты.
  $IPTABLES -A icmp_in -p icmp -j ULOG --ulog-prefix "Bad ICMP"

# 2. Входящий SSH трафик
  einfo "Creating incoming ssh traffic chain"
  $IPTABLES -N ssh-in
  $IPTABLES -F ssh-in
  $IPTABLES -A ssh-in -p tcp --dport 22 -j ACCEPT
# Защита о флуда по SSH
  $IPTABLES -A ssh-in -m limit --limit 1/second -p tcp --tcp-flags ALL RST --dport ssh -j ACCEPT
  $IPTABLES -A ssh-in -m limit --limit 1/second -p tcp --tcp-flags ALL FIN --dport ssh -j ACCEPT
  $IPTABLES -A ssh-in -m limit --limit 1/second -p tcp --tcp-flags ALL SYN --dport ssh -j ACCEPT
  $IPTABLES -A ssh-in -m state --state RELATED,ESTABLISHED -p tcp --dport ssh -j ACCEPT

#----------------------------------------------------------------------------------------------------------
# Правила для исходящего трафика
#----------------------------------------------------------------------------------------------------------
# 1. Разрешаем исходящий ICMP трафик (функции диагностики)

# 1. Необходимо чтобы мы пинговали всех.
  einfo "Creating outgoing icmp traffic chain"
  $IPTABLES -N icmp_out
  $IPTABLES -F icmp_out
  # Разрешаем icmp-reply во все сети в ответ на icmp-request'ы с сетей
  $IPTABLES -A icmp_out -p icmp --icmp-type 8 -j ACCEPT
  $IPTABLES -A icmp_out -m state --state NEW -p icmp --icmp-type time-exceeded -j ACCEPT
  $IPTABLES -A icmp_out -m state --state NEW -p icmp --icmp-type destination-unreachable -j ACCEPT

# Проверка флагов. Обнаружение сканеров потров. Взято из руководства по Iptables 1.1.19
  einfo "Creating portscan detection chain"
  $IPTABLES -N check_tcp
  $IPTABLES -F check_tcp
# Отбрасываем невалидные пакты
  $IPTABLES -A allowed -m state --state INVALID  -m limit --limit 3/minute -j ULOG --ulog-prefix "INVALID"
  $IPTABLES -A allowed -m state --state INVALID -j DROP
  $IPTABLES -A check_tcp -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset
  $IPTABLES -A check_tcp -p tcp ! --syn -m state --state NEW -j ULOG --ulog-prefix "NEW not --syn"
  $IPTABLES -A check_tcp -p tcp ! --syn -m state --state NEW -j DROP
$IPTABLES -A check_tcp -p tcp --tcp-flags ALL FIN,URG,PSH -m limit --limit 5/minute -j ULOG --ulog-prefix "NMAP-XMAS"
  $IPTABLES -A check_tcp -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
  $IPTABLES -A check_tcp -p tcp --tcp-flags ALL ALL -m limit --limit 5/minute -j ULOG --ulog-prefix "XMAS"
  $IPTABLES -A check_tcp -p tcp --tcp-flags ALL ALL -j DROP
  $IPTABLES -A check_tcp -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -m limit --limit 5/minute -j ULOG --ulog-prefix "XMAS-PSH"
  $IPTABLES -A check_tcp -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
  $IPTABLES -A check_tcp -p tcp --tcp-flags ALL NONE -m limit --limit 5/minute -j ULOG --ulog-prefix "NULL_SCAN"
  $IPTABLES -A check_tcp -p tcp --tcp-flags ALL NONE -j DROP
  $IPTABLES -A check_tcp -p tcp --tcp-flags SYN,RST SYN,RST -m limit --limit 5/minute -j ULOG --ulog-prefix "SYN/RST"
  $IPTABLES -A check_tcp -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
  $IPTABLES -A check_tcp -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit --limit 5/minute -j ULOG --ulog-prefix "SYN/FIN"
  $IPTABLES -A check_tcp -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

#----------------------------------------------------------------------------------------------------------
# Цепочка t mangle PREROUTING (необходима для изменения битов TOS, QOS)
#----------------------------------------------------------------------------------------------------------

# Пример использования таблицы mangle, маркируем esp-трафик для дальнейших манипуляций в ядре
# Можно неиспользовать в простых роутерах такая функция применяется редко
$IPTABLES -t mangle -A PREROUTING -p esp -j MARK --set-mark 1

#----------------------------------------------------------------------------------------------------------
# Цепочка t nat PREROUTING (необходима для изменения поля dst в заголовке пакета, можно использовать  
# для проброса порта на сервер во внутренней сети )
#----------------------------------------------------------------------------------------------------------

# перебрасываем все запросы на 80 порт, приходящие на внешний интерфейс на внутренний веб-сервер
$IPTABLES -t nat PREROUTING -i $WAN1_IF -p tcp --dport 80 -j DNAT --to-destination 192.168.1.20

#----------------------------------------------------------------------------------------------------------
# Цепочка INPUT
# Здесь создаем правила для входящего трафика, конкретно для SSH, DNS, ICMP и служебных обращений на петле
# также включена проверка на плохие пакеты и в конце правила для остального трафика (см. цепочку allowed).
#----------------------------------------------------------------------------------------------------------
einfo "Applying chains to INPUT"

# Проверяем пакеты.
  $IPTABLES -A INPUT -p tcp -j check_tcp
# Разрешаем входящие по SSH
  $IPTABLES -A INPUT -p tcp --dport 22 -j ssh-in
# Разрешаем входящие соединения к прокси-серверу SQUID
  $IPTABLES -A INPUT -s $LAN -p tcp --dport 3128 -j com-allow
# Разрешаем входящие по DNS
  $IPTABLES -A INPUT -s $LAN -p udp --dport domain -j com-allow
# Разрешаем входящие по icmp
  $IPTABLES -A INPUT -p icmp -j icmp_in
# Разрешаем входящие на петлю, при его включении заметно улучшение отклика при ssh-авторизации
  $IPTABLES -A INPUT -i $LO_IF -d $LOOPBACK -j ACCEPT
# Ну, и разрешаем statefull-пекеты.
  $IPTABLES -A INPUT -j allowed

#----------------------------------------------------------------------------------------------------------
# Цепочка FORWARD
# Здесь создаются правила для транзитного трафика, для случая если необходимо пользоваться какими либо
# внешними сервисами (почта, веб, аська). В конце правило для остального трафика (цепочка allowed).
#----------------------------------------------------------------------------------------------------------
  einfo "Applying chains to FORWARD"

# Отбрасываем плохие пакеты
  $IPTABLES -A FORWARD -j check_tcp
# Разрешаем SSH
  $IPTABLES -A FORWARD -s $LAN -p tcp --dport 22 -j com-allow
# Разрешаем прохождение icmp-пакетов
  $IPTABLES -A FORWARD -p icmp -j icmp_in
# Разрешаем прохождение асечных пакетов
  $IPTABLES -A FORWARD -i $LAN1_IF -s $LAN -p tcp --dport 5190 -j com-allow
# Разрешаем веб-трафик, если у нас не стоит прокси сервер, можно раскоментить эту строку
# Здесь же показано применения модуля "multiport"
#  $IPTABLES -A FORWARD -i $LAN1_IF -s $LAN -p tcp -m multiport --dport 80,443,1080,3128,8080 -j com-allow
# Разрешаем прохождение почтовых пакетиков от POP и SMTP
  $IPTABLES -A FORWARD -i $LAN1_IF -s $LAN -p tcp -m multiport --dport 25,110 -j com-allow

# Несовсем понятно практическая функция этого правила:)
#  $IPTABLES -A FORWARD -o $LO_IF -d $LOOPBACK -j ACCEPT

# Разрешаем входящие пакеты, являющиеся частью установленного соединения
  $IPTABLES -A FORWARD -j allowed

#----------------------------------------------------------------------------------------------------------
# Цепочка OUTPUT
# Здесь создаются правила для исходящего трафика, конкретно для SSH, ICMP, DNS, WWW а также разрешены
# исходящие соединения с внутреннего интерфейса. В конце правила для остального трафика (цепочка allowed).
#----------------------------------------------------------------------------------------------------------
einfo "Applying chains to OUTPUT"

  $IPTABLES -A OUTPUT -j check_tcp
  $IPTABLES -A OUTPUT -o $LAN1_IF -j ACCEPT
  $IPTABLES -A OUTPUT -p icmp -j icmp_out
  $IPTABLES -A OUTPUT -o $LO_IF -j ACCEPT
  $IPTABLES -A OUTPUT -p tcp --dport 22 -j com-allow
  $IPTABLES -A OUTPUT -p udp --dport domain -j com-allow
  $IPTABLES -A OUTPUT -p tcp -m multiport --dport http,https -j com-allow
  $IPTABLES -A OUTPUT -j allowed

#------------------------------------------------------------------------------------------------------------------------
# Цепочка t NAT POSTROUTING
# Изменяем поле адрес источника, а пакете, 
#------------------------------------------------------------------------------------------------------------------------
ebegin "Applying NAT chains"

$IPTABLES -t nat -A POSTROUTING -s $LAN -o $WAN1_IF -p tcp --dport 22 -j SNAT --to-source $WAN_IP
#$IPTABLES -t nat -A POSTROUTING -s $LAN -o $WAN1_IF -p tcp -m multiport --dport 80,443,1080,3128,8080 -j SNAT --to-source $WAN_IP
$IPTABLES -t nat -A POSTROUTING -s $LAN -o $WAN1_IF -p tcp -m multiport --dport 25,110 -j SNAT --to-source $WAN_IP
$IPTABLES -t nat -A POSTROUTING -s $LAN -o $WAN1_IF -p tcp --dport 5190 -j SNAT --to-source $WAN_IP
$IPTABLES -t nat -A POSTROUTING -s $LAN -o $WAN1_IF -p icmp -j SNAT --to-source $WAN_IP

}
# Все правила для пакетов заканчиваются, если пакет не подошел ни к одному условию, его ждет судьба по 
# умолчанию, а нашем случае DROP.
#########################################################################################################################
#########################################################################################################################
# здесь начинаются процедуры останова старта перезапуска и т.д.
# при установке они уже находятся в скрипте, только в начале необходимо указать переменные
# этот раздел скрипта можно пропустить

set_table_policy() {
        local chains table=$1 policy=$2
        case ${table} in
                nat)    chains="PREROUTING POSTROUTING OUTPUT";;
                mangle) chains="PREROUTING INPUT FORWARD OUTPUT POSTROUTING";;
                filter) chains="INPUT FORWARD OUTPUT";;
                *)      chains="";;
        esac
        local chain
        for chain in ${chains} ; do
                ${IPTABLES} -t ${table} -P ${chain} ${policy}
        done
}

checkkernel() {
        if [[ ! -e ${IPTABLES_PROC} ]] ; then
                eerror "Your kernel lacks ${IPTABLES_NAME} support, please load"
                eerror "appropriate modules and try again."
                return 1
        fi
        return 0
}
checkconfig() {
        if [[ ! -f ${IPTABLES_SAVE} ]] ; then
                eerror "Not starting ${IPTABLES_NAME}.  First create some rules then run:"
                eerror "/etc/init.d/${IPTABLES_NAME} save"
                return 1
        fi
        return 0
}

start() {
  ebegin "Starting firewall"
  if [ -e "${FIREWALL}" ]; then
    restore
  else
    einfo "${FIREWALL} does not exists. Using default rules."
      rules
    fi
eend $?
}

stop() {
        if [[ ${SAVE_ON_STOP} == "yes" ]] ; then
                save || return 1
        fi
        checkkernel || return 1
        ebegin "Stopping firewall"
        for a in $(<${IPTABLES_PROC}) ; do
            set_table_policy $a ACCEPT
                ${IPTABLES} -F -t $a
                ${IPTABLES} -X -t $a
        done
        eend $?
}

reload() {
        checkkernel || return 1
        ebegin "Flushing firewall"
        for a in $(<${IPTABLES_PROC}) ; do
                ${IPTABLES} -F -t $a
                ${IPTABLES} -X -t $a
        done
        eend $?

        start
}

save() {
        ebegin "Saving ${IPTABLES_NAME} state"
        touch "${IPTABLES_SAVE}"
        chmod 0600 "${IPTABLES_SAVE}"
        ${IPTABLES}-restore ${SAVE_RESTORE_OPTIONS} > "${IPTABLES_SAVE}"
        eend $?
}

panic() {
        checkkernel || return 1
        [[ -e ${svcdir}/started/${IPTABLES_NAME} ]] && svc_stop

        ebegin "Dropping all packets"
        for a in $(<${IPTABLES_PROC}) ; do
                ${IPTABLES} -F -t $a
                ${IPTABLES} -X -t $a

                set_table_policy $a DROP
        done
        eend $?
}
#################################END OF FILE###################################

[править] Использование

далее этот скрипт должен находится в дире /etc/init.d

добавить к нему бит исполнения chmod 755 /etc/init.d/firewall

теперь его можно запускать /etc/init.d/firewall start

остановка и перезапуск stop и restart соответственно

Личные инструменты