Логика и правила iptables
Материал из Gentoo Linux Wiki
- Вернуться в раздел руководства
Содержание |
[править] Введение
Алексей Лесовский aka Daevy предоставил материал для опубликования с благодарностью Чернову Андрею, как наставнику и помощнику
[править] Что должно быть в наличии
- Настроенная сеть
- Настройки в ядре
для начала чтобы установить 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 рассмотрим что происходит с пакетами когда они попадают на интерфейс роутера.
Бывает три маршрута:
- пакет предназначен локальному процессу (локальному приложению),
- пакет предназначен другой машине (проходит транзитом),
- пакет исходит от локального процесса и идет куда то дальше (от локального приложения).
И еще раскажу о таком понятии как 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 соответственно
