Оглавление Оглавление 1

Вид материалаДокументы

Содержание


Настройка маршрутизатора
Настройка маршрутизатора
Блокирование сканирования портов с помощью PortSentry
Установка Portsentry
Настройка portsentry
Стартовый сценарий Portsentry
Использование Portsentry
Фильтрация сетевых пакетов Введение
Настройка ядра
Маршрутизация и фильтрация
Отслеживание соединений
Другие соединения
Сложные протоколы
Команда iptables Формат команды iptables: iptables [-t table] command [match] [target/jump] Таблицы
Поиск совпадений
Основные опции для поиска совпадений
Опции TCP
Опции UDP
Опции ICMP
Ограничение интенсивности поступления пакетов
...
Полное содержание
Подобный материал:
1   ...   17   18   19   20   21   22   23   24   ...   29

Настройка маршрутизатора

              1. Ключевые файлы, термины и утилиты

/proc/sys/net/ipv4
/etc/services
ipchains
iptables
routed
      1. Настройка маршрутизатора

Введение


Чтобы сконфигурировать маршрутизатор для такой небезопасной сети, как Интернет, необходимо предпринять множество шагов.

Прежде всего, определите, какие сервисы вам нужны и заблокируйте все остальное! Это минимизирует вероятность обнаружения уязвимости в вашей системе. Хорошей идеей будет регистрировать все отброшенные и отклоненные пакеты в журнале (и ограничить интенсивность этого процесса во избежание создания журнальных файлов слишком большого размера).

Блокирование сканирования портов с помощью PortSentry


Большинство сканирований портов может быть обнаружено с помощью утилиты portsentry компании Psionic Technologies (теперь Cisco).


Демон portsentry прослушивает несколько известных портов и может заблокировать IP-адрес в случае обнаружения сканирования.


Установка Portsentry:


Скачайте архив с исходным кодом с web-сайта и установите утилиту вручную:

[root@test root]# tar zxvf portsentry-1.2.tar.gz -C /usr/local/src/

portsentry_beta/

portsentry_beta/portsentry.c

portsentry_beta/portsentry.h

portsentry_beta/portsentry_io.c

portsentry_beta/portsentry_io.h


...

[SNIP]

...


portsentry_beta/ignore.csh

[root@test root]# cd /usr/local/src/portsentry_beta/

[root@test portsentry_beta]# make linux

SYSTYPE=linux

Making

cc -O -Wall -DLINUX -DSUPPORT_STEALTH -o ./portsentry ./portsentry.c \

./portsentry_io.c ./portsentry_util.c

[root@test portsentry_beta]#

[root@test portsentry_beta]# make install

Creating psionic directory /usr/local/psionic

Setting directory permissions

Creating portsentry directory /usr/local/psionic/portsentry

Setting directory permissions

chmod 700 /usr/local/psionic/portsentry

Copying files

cp ./portsentry.conf /usr/local/psionic/portsentry

cp ./portsentry.ignore /usr/local/psionic/portsentry

cp ./portsentry /usr/local/psionic/portsentry

Setting permissions

chmod 600 /usr/local/psionic/portsentry/portsentry.ignore

chmod 600 /usr/local/psionic/portsentry/portsentry.conf

chmod 700 /usr/local/psionic/portsentry/portsentry


Edit /usr/local/psionic/portsentry/portsentry.conf and change

your settings if you haven't already. (route, etc)


WARNING: This version and above now use a new

directory structure for storing the program

and config files (/usr/local/psionic/portsentry).

Please make sure you delete the old files when

the testing of this install is complete.


[root@test portsentry_beta]#


Настройка portsentry :


Конфигурационный файл утилиты:

/usr/local/psionic/portsentry/portsentry.conf.


Укажите порты, на которых вы хотите запустить утилиту portsentry:

TCP_PORTS="1,11,15,79,111,119,143,540,635,1080,1524,2000,5742,6667,12345,12346,20034,27665,31337,32771,32772,32773,32774,40421,49724,54320"

UDP_PORTS="1,7,9,69,161,162,513,635,640,641,700,37444,34555,31335,32770,32771,32772,32773,32774,31337,54321"


Заблокируйте сканирование UDP и TCP:

BLOCK_UDP="1"

BLOCK_TCP="1"


Перенаправьте атакующий хост на null-маршрут:

KILL_ROUTE="/sbin/route add $TARGET$ 192.168.66.66


или

KILL_ROUTE="/sbin/route add -host $TARGET$ reject


или

KILL_ROUTE="/usr/local/bin/iptables -I INPUT -s $TARGET$ -j DROP


Также можно запустить какой-нибудь скрипт в ответ на атаку. Однако такая конфигурация не рекомендуется.


Хорошей идеей будет настроить игнорирование IP-адресов ваших DNS серверов и маршрутизаторов. Эти IP адреса должны быть помещены в файл /usr/local/psionic/portsentry/portsentry.ignore.


Стартовый сценарий Portsentry:


Данный скрипт называется /etc/init.d/portsentry :

/!/bin/bash

#

# portsentry Start the portsentry portscan detector

#

# Authors: Craig Rowland , Tim Powers

# and Matthias Saou

#

# chkconfig: 345 98 05

# description: PortSentry Port Scan Detector is part of the Abacus Project \

# suite of tools. The Abacus Project is an initiative to release \

# low-maintenance, generic, and reliable host based intrusion \

# detection software to the Internet community.

# processname: portsentry

# configfile: /etc/portsentry/portsentry.conf

# pidfile: /var/run/portsentry.pid


# Source function library.

. /etc/init.d/functions


# Source networking configuration.

. /etc/sysconfig/network


# Check that networking is up.

[ ${NETWORKING} = "no" ] && exit 0


# For this script to work on non english systems

export LANG=C


RETVAL=0


start () {

# Set up the ignore file

SENTRYDIR=/usr/local/psionic/portsentry

FINALIGNORE=$SENTRYDIR/portsentry.ignore

TMPFILE=$SENTRYDIR/portsentry.ignore.tmp

# Testline is used to see if the initscript has already been run

if [ -f $FINALIGNORE ] ; then

cp -f $FINALIGNORE $TMPFILE

testline=`grep -n "Do NOT edit below this" $TMPFILE | cut --delimiter=":" -f1`

if [ -z "$testline" ] ; then

echo > /dev/null # Do nothing

else

let headline=$testline-2

head -$headline $FINALIGNORE > $TMPFILE

fi

fi

echo '#########################################' >> $TMPFILE

echo '# Do NOT edit below this line, if you #' >> $TMPFILE

echo '# do, your changes will be lost when #' >> $TMPFILE

echo '# portsentry is restarted via the #' >> $TMPFILE

echo '# initscript. Make all changes above #' >> $TMPFILE

echo '# this box. #' >> $TMPFILE

echo '#########################################' >> $TMPFILE


echo '' >> $TMPFILE

echo '# Exclude all local interfaces' >> $TMPFILE

for i in `/sbin/ifconfig -a | grep inet | awk '{print $2}' | sed 's/addr://'` ; do

echo $i >> $TMPFILE

done


echo '' >> $TMPFILE

echo '# Exclude the default gateway(s)' >> $TMPFILE

for i in `/sbin/route -n | grep 0.0.0.0 | awk '{print $2}'` ; do

echo $i >> $TMPFILE

done


echo '' >> $TMPFILE

echo '# Exclude the nameservers' >> $TMPFILE

for i in `/bin/cat /etc/resolv.conf | grep nameserver | awk '{print $2}'` ; do

echo $i >> $TMPFILE

done


echo '' >> $TMPFILE

echo '# And last but not least...' >> $TMPFILE

echo '0.0.0.0' >> $TMPFILE

echo '' >> $TMPFILE


cp -f $TMPFILE $SENTRYDIR/portsentry.ignore

rm -f $TMPFILE


# Check for modes defined in the config file

if [ -s $SENTRYDIR/portsentry.modes ] ; then

modes=`cut -d "#" -f 1 $SENTRYDIR/portsentry.modes`

else

modes="tcp udp"

fi

for i in $modes ; do

action $"Starting portsentry -$i: " /usr/local/psionic/portsentry/portsentry -$i

RETVAL=$?

done

[ $RETVAL -eq 0 ] && touch /var/lock/subsys/portsentry

return $RETVAL

}


stop() {

echo -n $"Stopping portsentry: "

killproc portsentry

RETVAL=$?

echo

[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/portsentry

return $RETVAL

}


# See how we were called.

case $1 in

start)

start

;;

stop)

stop

;;

status)

status portsentry

RETVAL=$?

;;

restart)

stop

start

RETVAL=$?

;;

condrestart)

if [ -f /var/lock/subsys/portsentry ]; then

stop

start

RETVAL=$?

fi

;;

*)

echo $"Usage: portsentry {start|stop|restart|condrestart|status}"

exit 1

esac


exit $RETVAL


Использование Portsentry :


portsentry может быть запущен с различными параметрами:

-tcp :прослушивать порты из списка TCP_PORTS

-udp :прослушивать порты из списка UDP_PORTS

-stcp :режим «стелс»: прослушивать порты из списка TCP_PORTS, но не отвечать на соединения.

-sudp :режим «стелс»: прослушивать порты из списка UDP_PORTS, но не отвечать на соединения.

-atcp : Расширенный механизм обнаружения сканирования TCP портов: используется для мониторинга более 1024-х портов

-audp : Расширенный механизм обнаружения сканирования UDP портов: используется для мониторинга более 1024-х портов


[root@test root]# /etc/init.d/portsentry start

Starting portsentry -tcp: [ OK ]

Starting portsentry -udp: [ OK ]

[root@test root]#


Чтобы протестировать конфигурацию, запустите сканирование с другого хоста:

[root@test root]# nmap -sS -v -O 192.168.0.42


Starting nmap 3.50 ( ure.org/nmap/ ) at 2004-08-18 13:37 CEST

Host test (192.168.0.42) appears to be up ... good.

Initiating SYN Stealth Scan against test (192.168.0.42) at 13:37

Adding open port 80/tcp

Adding open port 824/tcp

Adding open port 6000/tcp


...

[пропущено]

...


Nmap run completed -- 1 IP address (1 host up) scanned in 6.834 seconds

[root@test root]#

Регистрация событий в журнале:


Журналы утилиты portsentry можно просматривать в файле

/var/log/syslog :

Aug 18 13:32:58 test portsentry[5019]: attackalert: TCP SYN/Normal scan from host: 192.168.0.165/192.168.0.165 to TCP port: 72

Aug 18 13:32:58 test portsentry[5019]: attackalert: Host 192.168.0.165 has been blocked via wrappers with string: "ALL: 192.168.0.165"

Aug 18 13:32:58 test kernel: ip_tables: (C) 2000-2002 Netfilter core team

Aug 18 13:32:58 test portsentry[5019]: attackalert: Host 192.168.0.165 has been blocked via dropped route using command: "/sbin/iptables -I INPUT -s 192.168.0.165 -j DROP"

Aug 18 13:32:58 test portsentry[5019]: attackalert: TCP SYN/Normal scan from host: 192.168.0.165/192.168.0.165 to TCP port: 23

Aug 18 13:32:58 test portsentry[5019]: attackalert: Host: 192.168.0.165/192.168.0.165 is already blocked Ignoring

Aug 18 13:32:58 test portsentry[5019]: attackalert: TCP SYN/Normal scan from host: 192.168.0.165/192.168.0.165 to TCP port: 386


а также в /usr/local/psionic/portsentry/portsentry.history :

1092828778 - 08/18/2004 13:32:58 Host: 192.168.0.165/192.168.0.165 Port: 72 TCP Blocked


Если выставить опции KILL_ROUTE значение iptables, portsentry добавит правило iptables, блокирующее хост, запустивший сканирование портов:

[root@test root]# iptables -L

Chain INPUT (policy ACCEPT)

target prot opt source destination

DROP all -- 192.168.0.165 anywhere


Chain FORWARD (policy ACCEPT)

target prot opt source destination


Chain OUTPUT (policy ACCEPT)

target prot opt source destination

[root@test root]#

Фильтрация сетевых пакетов

Введение


Пакетный фильтр анализирует сетевые пакеты и принимает решение о том, какие пакеты принять, а какие - нет. По сути это то, что делает межсетевой экран (брандмауэр)5.


Для операционной системы Linux в данный момент используется межсетевой экран Netfilter / Iptables . Брандмауэр состоит из двух частей: Netfilter - это часть ядра, принимающая и посылающая пакеты. Вторая часть, iptables, - это пользовательская утилита, применяемая для настройки правил фильтрации. Netfilter / Iptables входят в состав ядра версии 2.4:


  • ядро 2.0.x ipfwadm
  • ядро 2.2.x ipchains
  • ядро 2.4.x, 2.6.x iptables



Диаграмма прохождения пакета:





INPUT, FORWARD и OUTPUT - это так называемые цепочки правил. В случае, если адрес назначения пакета совпадает с адресом межсетевого экрана, применяются правила из цепочки INPUT. Когда пакет посылается с адреса брандмауэра куда-то наружу, применяются правила цепочки OUTPUT. Если пакет должен быть передан межсетевым экраном куда-то дальше (т.е. он поступил на его адрес, но на самом деле предназначается для другого хоста), применяются правила цепочки FORWARD.



Настройка ядра


Чтобы заставить работать iptables, необходимо настроить ядро. Опции могут быть вкомпилированы в ядро или составлять отдельный модуль.
  • CONFIG_PACKET
  • CONFIG_NETFILTER
  • CONFIG_IP_NF_CONNTRACK
  • CONFIG_IP_NF_FTP
  • CONFIG_IP_NF_IPTABLES
  • CONFIG_IP_NF_MATCH_LIMIT
  • CONFIG_IP_NF_MATCH_MAC
  • CONFIG_IP_NF_MATCH_MARK
  • CONFIG_IP_NF_MATCH_TOS
  • CONFIG_IP_NF_MATCH_TCPMSS
  • CONFIG_IP_NF_MATCH_STATE
  • CONFIG_IP_NF_MATCH_UNCLEAN
  • CONFIG_IP_NF_MATCH_OWNER
  • CONFIG_IP_NF_FILTER
  • CONFIG_IP_NF_TARGET_REJECT
  • CONFIG_IP_NF_TARGET_MIRROR
  • CONFIG_IP_NF_NAT
  • CONFIG_IP_NF_TARGET_MASQUERADE
  • CONFIG_IP_NF_TARGET_REDIRECT
  • CONFIG_IP_NF_TARGET_LOG
  • CONFIG_IP_NF_TARGET_TCPMSS



Маршрутизация и фильтрация


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

Стадии обработки пакета:





Межсетевой экран / маршрутизатор использует цепочку FORWARD для защиты локальной сети. Для защиты самого хоста используется цепочка правил INPUT.



Отслеживание соединений


Netfilter хранит сведения о состоянии тех соединений, для которых это понятие имеет смысл. Данная техника реализуется с помощью анализа пакетов в цепочках PREROUTING и OUTPUT.

Типичное соединение может иметь следующие состояния:
  • NEW
  • ESTABLISHED
  • RELATED
  • INVALID



Таблица соединений ядра может быть выведена на экран следующим образом:

[root@test root]# cat /proc/net/ip_conntrack |more

tcp 6 96 SYN_SENT src=127.0.0.1 dst=192.168.0.42 sport=50295 dport=307 [UNREPLIED] src=192.168.0.42 dst=127.0.0.1 spor

t=307 dport=50295 use=1

...

[root@test root]#


Здесь, первое значение – это имя протокола (tcp), второе – номер протокола (6) и третье – таймаут, сбрасываемый в значение по умолчанию с каждым переданным пакетом.

Таймауты


Состояние

Таймаут

NONE

30 минут

ESTABLISHED

5 дней

SYN_SENT

2 минуты

SYN_RECV

60 секунд

FIN_WAIT

2 минуты

TIME_WAIT

2 минуты

CLOSE

10 секунд

CLOSE_WAIT

12 часов

LAST_ACK

30 секунд

LISTEN

2 минуты


TCP


Соединения протокола TCP устанавливаются в три приема:

Клиент Сервер

SYN ===>

<=== SYN/ACK

ACK ===>


Следующие пакеты используются для корректного закрытия соединения TCP:

Клиент Сервер

FIN ===>

<=== FIN/ACK

ACK ===>


  • Отослан пакет SYN /proc/net/ip_conntrack :

tcp 6 117 SYN_SENT src=192.168.1.5 dst=192.168.1.35 sport=1031 dport=23 [UNREPLIED] src=192.168.1.35 dst=192.168.1.5 sport=23 dport=1031 use=1


  • Получен SYN/ACK /proc/net/ip_conntrack :

tcp 6 57 SYN_RECV src=192.168.1.5 dst=192.168.1.35 sport=1031 dport=23 src=192.168.1.35 dst=192.168.1.5 sport=23 dport=1031 use=1


  • Финальный пакет ACK /proc/net/ip_conntrack :

tcp 6 431999 ESTABLISHED src=192.168.1.5 dst=192.168.1.35 sport=1031 dport=23 src=192.168.1.35 dst=192.168.1.5 sport=23 dport=1031 use=1

После обмена еще несколькими пакетами соединение перейдет в состояние ASSURED.


  • Когда TCP соединение закрывается, оно переходит в состояние TIME_WAIT /proc/net/ip_conntrack :

tcp 6 114 TIME_WAIT src=192.168.10.2 dst=192.168.8.4 sport=35054 dport=5223 src=192.168.8.4 dst=192.168.10.2 sport=5223 dport=35054 [ASSURED] use=1


  • Соединение может быть переведено в состояние CLOSE пакетом RST.

UDP


Обмен данными по протоколу UDP осуществляется без установления соединения, что означает, что в инициировании или закрытии соединения нет необходимости.
  • Первый пакет /proc/net/ip_conntrack :

udp 17 20 src=192.168.1.2 dst=192.168.1.5 sport=137 dport=1025 [UNREPLIED] src=192.168.1.5 dst=192.168.1.2 sport=1025 dport=137 use=1


  • Ответ /proc/net/ip_conntrack :

udp 17 170 src=192.168.1.2 dst=192.168.1.5 sport=137 dport=1025 src=192.168.1.5 dst=192.168.1.2 sport=1025 dport=137 use=1

После этого соединение рассматривается как установленное, поскольку были отмечены пакеты обоих хостов. Однако оно не будет помечено как ESTABLISHED поскольку формально в UDP не существует понятия установленного соединения.


  • Еще несколько пакетов /proc/net/ip_conntrack :

udp 17 175 src=192.168.1.5 dst=195.22.79.2 sport=1025 dport=53 src=195.22.79.2 dst=192.168.1.5 sport=53 dport=1025 [ASSURED] use=1

ICMP


Пакеты ICMP используются для контроля и не устанавливают соединений. Существует несколько типов ICMP-пакетов, но только четыре из них приводят к генерации ответного пакета.
  • ping

Клиент Сервер

ICMP Echo Request ===>

<=== ICMP Echo Reply


/proc/net/ip_conntrack:

icmp 1 25 src=192.168.1.6 dst=192.168.1.10 type=8 code=0 id=33029 [UNREPLIED] src=192.168.1.10 dst=192.168.1.6 type=0 code=0 id=33029 use=1


Поскольку после ответа трафика больше нет, информация об ICMP-соединении удаляется сразу же после получения ответа.


Таймаут ICMP может быть задан в файле:

/proc/sys/net/ipv4/netfilter/ip_ct_icmp_timeout

По умолчанию его значение равно 30 секунд, что должно быть достаточно в большинстве случаев.


  • Контроль соединения

Клиент Маршрутизатор Сервер

SYN ===============>

<=== ICMP Net unreachable


Маршрутизатор рассматривает соединение как новое (состояние NEW), поскольку прошел пакет SYN. Пакет ошибки ICMP будет распознан как имеющий отношение к соединению и оно будет удалено из списка отслеживаемых. Нечто подобное происходит и с UDP соединениями:

Клиент Маршрутизатор Сервер

UDP пакет ===============>

<=== ICMP Net prohibited

Другие соединения


Соединения таких протоколов как NETBLT, MUX, EGP обрабатываются также, как и UDP. Первый пакет переводит соединение в состояние NEW, а дальнейший обмен пакетами приводит к состоянию ESTABLISHED.

Сложные протоколы


Некоторые протоколы обмениваются такой информацией, как IP-адреса и номера портов, помещая ее в данные своих пакетов. Примеры таких протоколов: ICQ, IRC, FTP, Oracle, ntalk или H.323. В этом случае ядро не может так легко отслеживать соединение, поскольку информация о нем находится не в заголовке пакета. Чтобы такие протоколы работали, ядро вынуждено соответствующим образом анализировать трафик и отслеживать пакеты, имеющие отношение к соединению.

Например, протокол FTP обычно использует два соединения. Первое из них – контрольная сессия на порту 21. Когда мы загружаем файл, клиент посылает номер порта на сервер и последний инициирует новое соединение со своего собственного 20-го порта (второе соединение - для данных) на указанный порт и передает данные.


Клиент Маршрутизатор Сервер

<=== RELATED === SYN

SYN/ACK === ESTABLISHED ===>


В пассивном режиме FTP-сервер сообщает клиенту, с каким портом нужно соединиться. Клиент соединяется со своего 20-го порта с указанным портом на сервере и получает запрошенные данные.


Клиент Маршрутизатор Сервер

SYN === RELATED ===>

<=== ESTABLISHED === SYN/ACK




Команда iptables


Формат команды iptables:

iptables [-t table] command [match] [target/jump]

Таблицы


У Netfilter есть три главных таблицы. Если ни одна из таблиц не указана опцией -t, то по умолчанию будет использоваться таблица filter.

Чтобы отобразить все правила какой-либо таблицы, используется опция -L:

[root@test root]# iptables -t mangle -L


Таблица filter

Эта таблица осуществляет основную работу по фильтрации. Например, с помощью опции -j и целей ACCEPT и DROP пакеты могут быть приняты или отброшены соответственно. Таблица filter позволяет использовать почти все доступные цели. Правила могут содержать цели: DROP, LOG, ACCEPT, REJECT, ... . Набор доступных целей зависит от конфигурации ядра.

[root@test root]# iptables -A INPUT -p tcp -j ACCEPT


Таблица mangle

Эта таблица правил позволяет модифицировать некоторые поля пакета данных, например, TTL (Time To Live – время жизни пакета), TOS (Type Of Service – тип сервиса), MARK. Поле TTL может использоваться для, сокрытия подсети. TOS и MARK в основном используются пользовательскими программами, такими как iproute2.


Таблица nat

Эта таблица используется для трансляции сетевых адресов (NAT). Адреса отправителя и получателя, указанные в пакете, могут быть изменены в этой таблице. В этой таблице не допускается фильтрация.

Только первый пакет из потока данных попадет в эту цепочку правил. Остальные пакеты будут изменяться тем же способом автоматически.
  • DNAT
  • SNAT
  • MASQUERADE

Команды


В iptables, правила могут быть добавлены, модифицированы и удалены.


  • Добавление

[root@test root]# iptables -A INPUT -p tcp --dport 80 -j DROP


  • Удаление

[root@test root]# iptables -D INPUT -p tcp --dport 80 -j DROP


[root@test root]# iptables -D 1


  • Замена

[root@test root]# iptables -R INPUT 1 -s 192.168.0.1 -j DROP


  • Вставка

[root@test root]# iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT


  • Перечисление

[root@test root]# iptables -L

[root@test root]# iptables -L INPUT -v

[root@test root]# iptables -L -n

[root@test root]# iptables -L -t nat


  • Сброс

[root@test root]# iptables -F INPUT


  • Политика по умолчанию для всей цепочки

[root@test root]# iptables -P FORWARD DROP


  • Обнуление

[root@test root]# iptables -Z INPUT


  • Новая цепочка

[root@test root]# iptables -N tcp_traffic


  • Удаление цепочки

[root@test root]# iptables -X tcp_traffic


  • Переименование цепочки

[root@test root]# iptables -X tcp_traffic udp_traffic


Поиск совпадений


Ядро Linux ищет подходящее правило в таблицах netfilter для каждого пакета. Если правило подходит, действие, указанное в нем, выполняется.

Неявные совпадения указываются опциями, заданными напрямую команде iptables. Для явных совпадений используется аргумент -m .

Основные опции для поиска совпадений

  • Протокол: -p

[root@test root]# iptables -A INPUT -p tcp ...

[root@test root]# iptables -A INPUT -p udp ...

[root@test root]# iptables -A INPUT -p icmp ...


  • Адрес отправителя: -s

[root@test root]# iptables -A INPUT -s 192.168.0.1 ...

[root@test root]# iptables -A INPUT -s 192.168.0.0/24 ...

[root@test root]# iptables -A INPUT -s ! 192.168.0.0/255.255.255.0 ...


  • Адрес получателя: -d

[root@test root]# iptables -A INPUT -d 192.168.0.1 ...

[root@test root]# iptables -A INPUT -d 192.168.0.0/24 ...

[root@test root]# iptables -A INPUT -d ! 192.168.0.0/255.255.255.0 ...


Опции TCP


Для того, чтобы правило совпадало с определенными TCP пакетами, протокол TCP должен быть указан в правиле: -p tcp.
  • Порт отправителя

[root@test root]# iptables -A INPUT -p tcp --sport ssh

[root@test root]# iptables -A INPUT -p tcp --sport 22:80

[root@test root]# iptables -A INPUT -p tcp --sport ! :1024


  • Порт получателя

[root@test root]# iptables -A INPUT -p tcp --dport ssh


  • Флаги TCP

[root@test root]# iptables -A FORWARD -p tcp --tcp-flags SYN,FIN,ACK SYN

[root@test root]# iptables -A FORWARD -p tcp --syn

[root@test root]# iptables -A FORWARD -p tcp --tcp-flags SYN,RST,ACK SYN

[root@test root]# iptables -A FORWARD -p tcp --tcp-flags ! FIN FIN

Опции UDP


Чтобы правило совпадало с UDP пакетами в нем должна быть указана опция: -p udp.


  • Порт отправителя

[root@test root]# iptables -A INPUT -p udp --sport 53


  • Порт получателя

[root@test root]# iptables -A INPUT -p udp --dport dns




Опции ICMP


Пакеты ICMP отфильтровываются правилом, в котором указана опция -p icmp.

[root@test root]# iptables -A INPUT -p icmp --icmp-type echo-request

[root@test root]# iptables -A INPUT -p icmp --icmp-type echo-reply

Чтобы вывести полный список возможных опций фильтрации ICMP пакетов, выполните команду:

[root@test root]# iptables -p icmp --help

Ограничение интенсивности поступления пакетов


Опция ограничения интенсивности может ограничить скорость поступления пакетов в единицу времени. Эта функция реализуется с помощью счетчика. Начальное значение счетчика уменьшается с каждым поступающим пакетом. Если счетчик достиг нуля, все последующие пакеты будут отбрасываться. Каждую секунду (например) значение счетчика увеличивается на единицу, позволяя таким образом пройти еще одному пакету. Опция используется для снижения негативного эффекта от атак затопления syn/ping пакетами (Syn/Ping Flood).

Правило из следующего примера принимает пакеты с интенсивностью не более 5 штук в секунду.

[root@test root]# iptables -A INPUT -m limit --limit 5/s


Фильтрация по состоянию соединения


Опция фильтрации по состоянию соединения используется для выделения состояний соединений, отслеживаемых ядром. Возможные состояния: NEW, ESTABLISHED, RELATED, INVALID. Такая фильтрация используется для того, чтобы пропускать новые соединения только в одну сторону, а в обратную сторону пропускать только трафик возвращаемый в ответ на эти соединения (ESTABLISHED;RELATED).

[root@test root]# iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED

Цели и переходы


Цель в правиле указывает на то, что нужно сделать с удовлетворяющим ему пакетом. Целью может быть таблица, заданная пользователем или стандартная цель ядра, например ACCEPT или DROP, принимающая пакет (позволяющая пакету пройти дальше) или отбрасывающая пакет (останавливающая обработку пакета) соответственно.


Цель ACCEPT


Пакет принимается и остальные правила цепочки текущей таблицы не будут к нему не применяются.

Цель DROP


Пакет отбрасывается и более не обрабатывается.

Цель REJECT


Цель REJECT работает подобно цели DROP, с тем отличием, что отправитель пакета получит ICMP сообщение сигнализирующее об ошибке.

Цель REJECT можно использовать только в цепочках INPUT, FORWARD и OUTPUT.

Цель DNAT


DNAT (Destination Network Address Translation – трансляция адреса получателя) используется для изменения IP-адреса получателя пакета.

Цель DNAT может использоваться только в цепочках PREROUTING и OUTPUT таблицы nat.

[root@test root]# iptables -t nat -A PREROUTING -p tcp -j DNAT --to-destination 192.168.1.111


Адрес отправителя в поступающих обратно пакетах автоматически транслируется в оригинальный.



Цель SNAT


SNAT (Source Network Address Translation – трансляция адреса отправителя) используется для изменения IP-адреса отправителя пакета.

Цель SNAT может использоваться только с цепочкой POSTROUTING таблицы nat.

[root@test root]# iptables -t nat -A POSTROUTING -p tcp -j SNAT --to-source 192.168.1.1


Получаемые обратно пакеты будут автоматически оттранслированы в оригинальный адрес.

Цель MASQUERADE


Поведение цели masquerade подобно SNAT, однако в этом случае Netfilter самостоятельно решает, какой адрес отправителя нужно использовать, основываясь на маршруте по умолчанию. Такое поведение позволяет реализовывать NAT с динамическими IP-адресами, получаемыми от Интернет-провайдера или DHCP-сервера.

Цель MASQUERADE доступна только в цепочке POSTROUTING таблицы nat.

[root@test root]# iptables -t nat -A POSTROUTING -j MASQUERADE


Цель MASQUERADE очищает информацию обо всех отслеживаемых соединениях в случае деактивации сетевого интерфейса.

Цель REDIRECT


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

[root@test root]# iptables -A INPUT -j REDIRECT --to-port 3128

Цель MIRROR


Это в чистом виде экспериментальная цель. С ее помощью можно менять местами адреса отправителя и получателя. Используйте с осторожностью :-)



Цель RETURN


Проход пакета по цепочке правил прекратится, как только пакет достигнет правила с этой целью.

Цель QUEUE


Пакеты будут попадать в очередь для обработки пользовательскими программами.

Цель MARK


С помощью этой цели можно поставить метку на пакет с целью его дальнейшей обработки. Как Netfilter, так и пользовательские программы могут выявлять пакеты, помеченные таким образом, для выполнения с ними специальных действий.

iptables -A INPUT -j MARK --set-mark 1

Цель LOG


С помощью этой цели пакет попадает в журнал syslog.

[root@test root]# iptables -A INPUT -j LOG --log-prefix " Dropped INPUT: "

Цель ULOG


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



Пример межсетевого экрна


Сценарий, настраивающий правила iptables.

Пример:

#!/bin/bash

echo 1 > /proc/sys/net/ipv4/ip_forward


DMZ=10.0.0.0/24

IPTABLES="/sbin/iptables"


$IPTABLES -F

$IPTABLES -F -t nat


$IPTABLES -P INPUT DROP

$IPTABLES -P FORWARD DROP


echo "accept localhost internal traffic"

$IPTABLES -A INPUT -i lo -s localhost -j ACCEPT


...

echo "accept ssh from $DMZ on eth1"

$IPTABLES -A INPUT -s $DMZ -i eth1 -p tcp --dport 22 -j ACCEPT

...

iptables -L -v -n

iptables -L -v -n -t nat