Хроники Knowledge Base Slackware FAQ Tools Акела Озеро Селигер Путешествия Рецепты Обои Фоторедактор Сертификаты Контакты
Linux

Создано: 29 Мая 2008г.   11:28
Модифицировано: 25 Сентября 2012г.   13:58

[ Назад ]

IPTables


Скрипт ipt.sh
Скрипт помогает автоматизировать действия по работе с firewall, удобно редактировать правила. Содержит стандартные правила для основных сервисов. Внутри есть readme, встроенная справка и подробные комментарии. Написан для RedHat&CentOS&Fedora

Для включения форвардинга:
/etc/sysctl
net.ipv4.ip_forward=1

iptables [-t table] -[команда] [цепочка] [критерии отбора] [-j действие]
-t таблица (filter, nat, mangle, если не указано - filter)

Основные команды:
-A ЦЕПОЧКА добавить в конец цепочки
-I ЦЕПОЧКА вставить в начало
-I ЦЕПОЧКА N вставить номером N
-L ЦЕПОЧКА вывести правила цепочки
-L вывести все правила таблицы
-L --line-numbers вывести с номерами правил
-L -v выести полнее (с именами интерфейсов)
-L -x Для всех чисел в выходных данных выводятся их точные значения без округления и использования множителей K, M, G
-F удалить все правила таблицы
-F ЦЕПОЧКА удалить правила цепочки
-D ЦЕПОЧКА N удалить правило с номером N из цепочки
-D ЦЕПОЧКА удалить правило по указанию всех критериев отбора
-R ЦЕПОЧКА N заменяет одно правило другим
-P ЦЕПОЧКА политика по умолчанию для цепочки
-Z сбросить счетчики в текущей таблице
-Z ЦЕПОЧКА сбросить счетчики в цепочке
-N name создать цепочку в текущей таблице
-X name удалить пустую цепочку пользователя

Просмотр полной информации по всем правилам:
service iptables status
или
iptables -L -v -n --line-numbers
iptables -t nat -L -v -n --line-numbers
iptables -t mangle -L -v -n --line-numbers

Опции:
-v выводить доп. информацию (значения счетчиков, имена интерфейсов)
-x выводить точные значения счетчиков
-n выводить IP а не именя машин
--line-numbers выводить номера правил

Цепочки: INPUT, FORWARD, OUTPUT, PREROUTING, POSTROUTING, или цепочка пользователя

Критерии отбора пакетов
Общие критерии (не зависят от типа протокола и не требуют загрузки модулей)
можно указывать знак ! для инверсии
-p протокол (tcp, udp, icmp и т.д. (/etc/protocols) или ALL или !потокол)
-s ip_источника (машины или сети)
-d ip_назначения (машины или сети)
-i входной интерфейс (допускается только в цепочках INPUT, FORWARD и PREROUTING, eth+ любой начинающийся на eth)
-o выходной интерфейс (допускается только в цепочках OUTPUT, FORWARD и POSTROUTING)
-f все фрагменты фрагментированного пакета, кроме первого (! -f)

Неявные критерии (зависят от конкретного протокола и требуют его предварительного указания -p протокол)
TCP критерии
-p tcp --sport порт (или диапазон порт_1:порт_n или службу (/etc/services))
-p tcp --dport порт (--''--)
-p tcp --tcp-flags список_флагов список_флагов_со_значением_1 (или ALL или NONE)
-p tcp --syn (запрос на соединение. аналог --tcp-flags SYN,ACK,FIN SYN)

UDP критерии (Если они потеряны, они не вызывают передачу ICMP сообщения об ошибке)
-p udp --sport порт (или диапазон порт_1:порт_n или службу (/etc/services))
-p udp --dport (--''--)

ICMP критерии
-p icmp --icmp-type тип (iptables -p icmp --help)

Явные критерии (перед использованием должны быть загружены явно, с помощью ключа -m)
-m limit
Ограничивает кол-во срабатываний правила. Подразумевает наличие ключей --limit и --limit-burst. Если не указать эти ключи, они принимают значение по-умолчанию. Применяется при защите от syn flood атак и при отсылке пакетов в syslog.
-m limit --limit n/num Сколько раз в единицу времени будет срабатывать правило (скорость, с которой счетчик burst limit "откручивается назад"), где n - число, num - /second /minute /hour /day или /s /m /h /d. ! недопустимо.
--limit-burst n максимальное значение счетчика пакетов, при котором срабатывает ограничение

Например:
iptables -I INPUT -p icmp --icmp-type echo-request -m limit --limit 3/minute --limit-burst 5 -j ACCEPT
принимает 5 пакетов ping потом по одному пакету 3 раза в минуту (если дальше идет DROP).

iptables -A INPUT -p tcp --dport 80 -m limit --limit 1/s --limit-burst 4 -j ACCEPT
4 пакета tcp направленные на порт 80 будут приниматься 1 раз в секунду

-m mac
используется для проверки исходного MAC-адреса пакета. Имеет смысл только в цепочках PREROUTING, FORWARD и INPUT.
-m mac --mac-source 00:00:00:00:00:01

-m multiport
Позволяет указывать в тексте правила несколько портов и диапазонов портов. Нельзя использовать стандартную проверку портов и расширение -m multiport (например --sport 1024:63353 -m multiport --dport 21,23,80) одновременно.
используется совместно с -p tcp или -p udp.
-m multiport --source-port n,n,n,n
-m multiport --destination-port n,n,n,n,n
до 15 различных портов. Названия портов должны отделяться запятыми, пробелы не допустимы

-m mark
Предоставляет возможность "пометить" пакеты специальным образом
-m mark --mark n
производит проверку пакетов, которые были предварительно "помечены" действием MARK.

-m state
используется совместно с кодом трассировки соединений
-m state --state state
Проверяется признак состояния соединения (state). Можно указывать 4 состояния: INVALID, ESTABLISHED, NEW и RELATED

Действия
-j my_chain
перейти в пользовательскую цепочку. Она должна быть предварительно создана.
-j ACCEPT
-j DROP
-j REJECT
-j REJECT --reject-with message
Передать сообщение в ответ. tcp-reset для tcp для закрытия TCP соединений или icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable, icmp-proto-unreachable, icmp-net-prohibited и icmp-host-prohibited
-j RETURN
Возврат из пользовательской цепочки
-j LOG
передает информацию демону syslog
-j LOG --log-level level
-j LOG --log-prefix "prefix"
-j LOG --log-tcp-sequence
-j LOG --log-tcp-options
-j LOG --log-ip-options

-j MARK
Установка меток для определенных пакетов. Может выполняться только в пределах таблицы mangle. Установка меток обычно используется для нужд маршрутизации пакетов по различным маршрутам, для ограничения трафика и т.п.. -j MARK --set-mark n

-j TTL
используется для изменения содержимого поля Time To Live в IP заголовке. указывать только в таблице mangle
-j TTL --ttl-set 64
-j TTL --ttl-dec 1
-j TTL --ttl-inc 1
Можно использовать для сокрытия от провайдера факта того, что подключение к Интернету разделяется несколькими компьютерами. Для этого установить значение TTL ВО ВСЕХ исходящих пакетах в одно и то же значение.
iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-set 64

NAT преобразования
SNAT - замена IP адреса и/или порта источника
Используется для предоставления доступа к Internet для локальной сети.
-t nat -A POSTROUTING допускается выполнять только в таблице nat, в цепочке POSTROUTING.
необходимо включить пересылку пакетов (forwarding) в ядре
-j SNAT --to-source ip-ip:port-port
iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to-source x.x.x.x:30000-35000
-o eth0 внешний интерфейс на котором выполнять преобразование
-p tcp обязательно указать протокол

Маскарадинг
Частный случай SNAT. Используется при динамическом интернет IP адресе. Дает большую нагрузку на систему.
-t nat -A POSTROUTING Допускается указывать только в цепочке POSTROUTING таблицы nat
-j MASQUERADE
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

DNAT - замена IP адреса и/или порта назначения
Используется для организации доступа к внутренним ресурсам.
может выполняться только в цепочках PREROUTING и OUTPUT таблицы nat, и во вложенных под-цепочках.
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination x.x.x.x:port

REDIRECT - прозрачный прокси
Выполняет перенаправление пакетов и потоков на другой порт той же самой машины.
К примеру, можно пакеты, поступающие на HTTP порт перенаправить на порт HTTP proxy.
Действие REDIRECT очень удобно для выполнения "прозрачного" проксирования (transparent proxying), когда машины в локальной сети даже не подозревают о существовании прокси.
iptables -t nat -A PREROUTING -s x.x.x.x/24 -d ! y.y.y.y -p tcp -m tcp --dport 80 -j REDIRECT --to-port 3128

Active FTP:
При создании активного соединения клент передает FTP серверу номер порта и IP адрес для соединения. Затем клент открывает порт, сервер подключает к заданному порту клиента свой порт с номером 20 (известный как FTP-Data) и передает данные через установленное соединение.

Passive FTP:
Пассивный FTP действует противоположным образом. Клиент посылает запрос серверу на получение данных, а сервер возвращает клиенту IP адрес и номер порта для подключения. Клиент подключает свой 20-й порт (FTP-data) к указанному порту сервера и получает запрошенные данные.


Комментарии в правилах
-m comment --comment "My comment"

Примеры
Проброс порта
Make sure that the kernel ip forwarding is enabled
sysctl net.ipv4.ip_forward
If value eq '0'
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p
iptables -I FORWARD -d 172.16.173.46 -p tcp -m tcp --dport 8443 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A PREROUTING -p tcp -d 172.16.173.46 --dport 8443 -j DNAT --to-destination 172.16.173.46:8443
iptables -t nat -A POSTROUTING -p tcp -d 172.16.173.46 --dport 8443 -j SNAT --to-source 192.168.6.16
iptables -t nat -A OUTPUT -d 192.168.6.16 -p tcp --dport 8443 -j DNAT --to-destination 172.16.173.46
Redirect
Порты <1024 запрещены в OS к использованию непривилегированными пользователями. Настроить редирект.
iptables -t nat -I PREROUTING -p tcp --dport 25 -j REDIRECT --to-ports=10025 -m comment --comment "Redirect restricted port 25 to 10025"


Подсчет трафика
Принцип подсчета трафика:
  1. По таблице nat считать нельзя - только первый пакет из потока проходит через цепочки этой таблицы, трансляция адресов или маскировка применяются ко всем последующим пакетам в потоке автоматически
  2. В таблице filter в соответствующих цепочках INPUT, OUTPUT и FORWARD создаются новые цепочки для расчета траффика. По команде -j RETURN в цепочках для расчета траффика, пакет вернется на следующее правило которое следует за правилами для INPUT, OUTPUT и FORWARD.
  3. Эти правила должны стоять первыми в своих цепочках. Если над пакетом выполняется действие ACCEPT, то пакет прекращает движение по цепочке (и всем вызвавшим цепочкам, если текущая цепочка была вложенной) и считается ПРИНЯТЫМ (то бишь пропускается), тем не менее, пакет продолжит движение по цепочкам в других таблицах и может быть отвергнут там.
  4. Вывести трафик по нужной цепочке:
    /sbin/iptables -L count_all_in -vn | tail -1 | awk '{print $2}'
    То же но с ключем -x (в байтах)
    /sbin/iptables -L count_all_in -vnx | tail -1 | awk '{print $2}'
iptables traffic counter

Генерация трафика для теста
На компьютере ОТКУДА (192.168.0.1):
span class="code">cat /dev/urandom | nc -l -p 7777
На компьютере КУДА:
span class="code">nc 192.168.0.1 7777 > /dev/null

или использовать утилиту: iperf

Контроль трафика
iptraf
bwm-ng

vnstat
Ведет базу. Показывает как трафик в реальном времени так и статистику за различные периоды

MRTG (Multi Router Traffic Grapher)
Linux MRTG Configuration HOW-TO


Скрипт ipt_reset.sh добавлять в cron при удаленном доступе к машине по ssh
#
[root@server103 ~]# cat reset-firewall
#!/bin/bash
# Reset the firewall to a stateful beginning in support of RH253 and
# RH300 classes. This should match the ending of the iptables exercise
# done in each course.
# Blank the current rules
iptables -t filter -F
iptables -X
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
# Define new chain with default set of rules
iptables -N CLASS-RULES
iptables -A CLASS-RULES -i lo -j ACCEPT
iptables -A CLASS-RULES -p icmp -j ACCEPT
iptables -A CLASS-RULES -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A CLASS-RULES -p tcp --dport 22 -j ACCEPT
iptables -A CLASS-RULES -m state --state NEW -p udp --dport 514 -j ACCEPT
iptables -A CLASS-RULES -j LOG
iptables -A CLASS-RULES -j REJECT --reject-with icmp-host-prohibited
# Point the INPUT chain to the new custom chain
iptables -I INPUT 1 -j CLASS-RULES
# Save our work
service iptables save


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

Для настройки маршрутизации необходимо прописать маршруты на всех маршрутизаторах!
Например:
1) подсеть 192.168.100.0/24
Маршрутизатор 1: 192.168.100.1, 192.168.2.128
2) подсеть 192.168.100.2/24
Маршрутизатор 2: 192.168.2.1, xxx.xxx.xxx.xxx
3) Internet
Маршрутизатор 2 ничего не знает о сети 92.168.100.0/24, следовательно нужно прописать (для Windows):
route -p ADD 192.168.100.0 MASK 255.255.255.0 192.168.2.199

В случае, если на маршрутизаторе установлен брандмауэр не забыть создать правило! Например, для ISA Server:
Configuration - Networks - Internal - Addresses - Add ramge

Полезные статьи:

Руководство по iptables (Iptables Tutorial 1.1.19)
Скачать документ в виде tar.gz архива
Manpage of IPTABLES
Пакетные фильтры в Linux: iptables, ipchains
Огненная стена" или строим файрвол на базе iptables | Библиотека Линукс Портала
iptables traffic counter | Библиотека Линукс Портала
Настройка межсетевого экрана Iptables
Настройка маршрутизации с помощью iproute
Linux Advanced Routing & Traffic Control HOWTO
Артур Крюков. Настройка firewall. PDF: http://www.kryukov.biz/linux_curs_4_1.pdf
Артур Крюков. Настройка OpenVPN. PDF: http://www.kryukov.biz/linux_curs_7_1.pdf




[ Назад ]







Powered by Parser & MyCMS Дмитрий Ульянов, 2001-2024 (с)