Итак, сегодня мы будем разбираться что же это за зверь такой этот IPTables и как с ним бороться, победить и обуздать? :)

IPTables - утилита командной строки, является стандартным интерфейсом управления работой межсетевого экрана (фаервола или брандмауэра) NETFilter для ядер Linux, начиная с версии 2.4. Для использования утилиты IPTables требуются привилегии суперпользователя (root).

Иногда под словом IPTables имеется в виду и сам межсетевой экран NETFilter. С его помощью можно достаточно гибко управлять (в данном случае - обработкой пакетов, поступающих к нам или же исходящих от нас).

Например, можно запретить одному компьютеру доступ в Интернет, другому разрешить доступ только к сайтам, третьему "пробросить" (назначить) заранее определенный порт, а "подозрительные" пакеты отправлять назад отправителю (пусть сам себя ломает). Можно подменять «на лету» служебную информацию IP пакетов (отправитель, получатель, TTL , пр.) и многое другое, чего сразу и не придумаешь.

Что, для начала, следует знать о файрволах, - они предназначены для защиты, поэтому нужно крепко запомнить, что последним правилом (policy ) должно быть «запрещать остальное». Второе, но все же, не менее важное - всегда осторожно редактируйте правила или Telnet.

Случаи когда производилась настройка правил по удаленке, а после применения правил невнимательный админ оказывался "отрезан" от сервера не единичны! И хорошо, если сервер в двух шагах, а что если он где-то в тридевятом царстве?


Принцип работы брандмауэра

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

Порядок следования пакета приведен в таблице ниже:

Шаг Таблица Цепочка Примечание
1 Кабель (т.е. Интернет)
2 Сетевой интерфейс (например, eth0)
3 mangle PREROUTING Обычно эта цепочка используется для внесения изменений в заголовок пакета, например для изменения битов TOS и пр.
4 nat PREROUTING Эта цепочка используется для трансляции сетевых адресов (Destination Network Address Translation). Source Network Address Translation выполняется позднее, в другой цепочке. Любого рода фильтрация в этой цепочке может производиться только в исключительных случаях
5 Принятие решения о дальнейшей маршрутизации, т.е. в этой точке решается куда пойдет пакет - локальному приложению или на другой узел сети.
6 mangle FORWARD Далее пакет попадает в цепочку FORWARD таблицы mangle, которая должна использоваться только в исключительных случаях, когда необходимо внести некоторые изменения в заголовок пакета между двумя точками принятия решения о маршрутизации.
7 Filter FORWARD В цепочку FORWARD попадают только те пакеты, которые идут на другой хост Вся фильтрация транзитного трафика должна выполняться здесь. Не забывайте, что через эту цепочку проходит трафик в обоих направлениях. Обязательно учитывайте это обстоятельство при написании правил фильтрации.
8 mangle POSTROUTING Эта цепочка предназначена для внесения изменений в заголовок пакета уже после того как принято последнее решение о маршрутизации.
9 nat POSTROUTING Эта цепочка предназначена в первую очередь для Source Network Address Translation. Не используйте ее для фильтрации без особой на то необходимости. Здесь же выполняется и маскарадинг (Masquerading).
10 Выходной сетевой интерфейс (например, eth1)
11 Кабель (пусть будет LAN)

Как Вы можете видеть, пакет проходит несколько этапов, прежде чем будет передан далее. На каждом из этапов пакет может быть остановлен, будь то цепочка iptables или что-либо еще, но нас главным образом интересует iptables.

Заметьте, что нет каких-либо цепочек, специфичных для отдельных интерфейсов или чего-либо подобного. Цепочку FORWARD проходят ВСЕ пакеты, которые движутся через наш брандмауэр-роутер. Не используйте цепочку INPUT для фильтрации транзитных пакетов, они туда просто не попадают. Через эту цепочку движутся только данные, предназначенные этому же хосту.


Правила iptables

Приведу пример части моего конфига роутера: vlan332 - это интерфейс через который я получаю доступ к Интернету, vlan333 - доступ в локальную сеть провайдера, а 172.30.2.5 - мой компьютер.

#NAT
iptables -t nat -A POSTROUTING -o vlan332 -j MASQUERADE
iptables -t nat -A POSTROUTING -o vlan333 -j MASQUERADE

#Torrent
iptables -A PREROUTING -t nat -p tcp --dport 9000 -i vlan332 -j DNAT --to 172.30.2.5

#Open port
iptables -A INPUT -p tcp --dport 53 -j ACCEPT #DNS TCP
iptables -A INPUT -p udp --dport 53 -j ACCEPT #DNS UDP
iptables -A INPUT -p tcp --dport 80 -j ACCEPT #WEB server

#Все остальное входящее "дропать" (удалять)
iptables -A INPUT -i vlan332 -j DROP

Что все это значит? Прежде всего, для удобства чтения я поделил конфиг на «секции» комментариями, т.е. в одной секции правила для NAT, в другой - проброс портов (PAT), в третей - разрешаем порты сервера и т.д.

Рассмотрим первое и второе правило (они отличаются только сетевыми интерфейсами):

iptables -t nat -A POSTROUTING -o vlan332 -j MASQUERADE

Исходя из него, мы добавляем в таблицу nat (-t nat) новое правило для цепочки postrouting (-A POSTROUTING), которое будет последним на момент выполнения команды в цепочке (т.е. - в конец). Правило будет применяться на исходящем интерфейсе vlan332 (-o vlan332) и будет передаваться в MASQUERADE (-j MASQUERADE) те NAT.

Говоря человеческим языком, - все что будет выходить с интерфейса vlan332 должно скрываться за NAT"ом. Это значит, что при выходе с нашего маршрутизатора адресом отправителя будет указан наш сервер, а не конечный компьютер пользователя, с которого был отправлен запрос. Когда придет ответ на запрос, будет проведена обратная процедура и пакет будет передан изначальному отправителю. Для чего это нужно будет подробно расписано в статье про NAT.

Перейдем к следующей группе правил, а именно секции помеченной как "torrent". В этой секции указаны правила для проброса портов (PAT - Port Adress Translation), т.е. для того чтобы со стороны Интернета можно было подключится к порту на компьютере за нашим роутером. Без этого не смогут правильно работать многие приложения, например файлообменные сети torrent, DC++ и некоторые приложения, требующие входящих подключений из сети Интернет. Разберем правило на примере проброса (назначения) портов для Torrent клиента

iptables -A PREROUTING -t nat -p tcp --dport 9000 -i vlan332 -j DNAT --to 172.30.2.5

Как и в предыдущем правиле, мы указываем таблицу и цепочку (-A PREROUTING -t nat), указываем допустимый тип протокола. В текущем правиле TCP (-p tcp) (в другом правиле UDP, хотя их можно указать и в одном правиле, у меня это, к сожалению, не получилось даже с официальной литературой и решения пока не нашел).

Порт назначения 9000 (--dport 9000), входящий интерфейс vlan332. Действием DNAT (-j DNAT) мы указываем, что нужно подменить адрес получателя на 172.30.2.5 (--to 172.30.2.5) т.е. - наш компьютер. Получается: все входящие соединения по протоколу TCP на порт 9000 перенаправлять на IP 172.30.2.5.

iptables -A INPUT -p tcp --dport 53 -j ACCEPT #DNS TCP

Указываем цепочку INPUT, протокол TCP, порт под номером 53 (используется для работы служб DNS) и действие - разрешить . Вы можете заметить, что для DNS запросов используется UDP и это будет правильно. Для передачи же информации о зонах (доменах) используется TCP и так как мой сервер является первичным для нескольких зон, я разрешил доступ через TCP.

Последним правилом, как я говорил выше, должен быть запрет всего остального, что не попало под фильтры. Я написал iptables -A INPUT -i vlan332 -j DROP т.е. все входящие пакеты на интерфейс vlan332 удалять.

Так как у этого файрвола нет постоянного конфига, то при перезагрузке правила нужно вводить вручную. Это не беда, так как есть shell скрипты (аналог bat и cmd файлов в Windows) и при выполнении они будут запускать команды, в них прописанные.

Для этого создадим файлик в каталоге etc с именем firewall.sh командой nano /etс/firewall.sh т.е. откроем его сразу в редакторе. Впишем туда все необходимые нам правила и сохраним его нажав Ctrl+X.

Вот некоторые правила рабочего конфига, которые могут Вам пригодиться в повседневном использовании. Первая строка (#!/bin/sh) обязательна, так как она указывает чем нужно интерпретировать эти инструкции.

#!/bin/sh
PATH=/usr/sbin:/sbin:/bin:/usr/bin

# Удалить все существующие правила всех таблиц и цепочек
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X

# Разрешить любой трафик
iptables -A INPUT -i lo -j ACCEPT#Петля (loopback)
iptables -A INPUT -i eth0 -j ACCEPT#Внутренний интерфейс в локалку
iptables -A INPUT -i eth2 -j ACCEPT#Внутренний интерфейс в локалку 2

#NAT
iptables -t nat -A POSTROUTING -o vlan332 -j MASQUERADE#Включить NAT в сторону Интернета
iptables -t nat -A POSTROUTING -o vlan333 -j MASQUERADE#Включить NAT в сторону провайдера (сеть провайдера)

#PORT FORWARDING
#Torrent
iptables -A PREROUTING -t nat -p tcp --dport 9000 -i vlan332 -j DNAT --to 172.30.2.5#Проброс портов на IP
iptables -A PREROUTING -t nat -p udp --dport 9000 -i vlan332 -j DNAT --to 172.30.2.5

#VPN соединения, разрешение подключения через PPP и тп.
iptables -A INPUT -p tcp -m tcp --dport 1723 -j ACCEPT
iptables -A INPUT -p gre -m state --state RELATED,ESTABLISHED -j ACCEPT

#Открываем порты сервера
iptables -A INPUT -p tcp --dport 23 -j ACCEPT #Разрешить доступ через SSH

#Все остальное входящее удалять ("дропать" - отбрасывать)
iptables -A INPUT -i vlan332 -j DROP

# Включение форвардинга, без этого не будет происходить маршрутизация пакетов
echo 1 > /proc/sys/net/ipv4/ip_forward

После этого делаем файл исполняемым, т.е.:
chmod +x /etс/firewall.sh (eXecute).

Чтобы данный файл отрабатывал автоматически при загрузке, пропишем путь к нему в файле «автозагрузки». Открываем nano /etс/rc.local и дописываем перед exit 0 строку /etс/firewall.sh Если необходимо использовать VLAN (виртуальные интерфейсы и сети), то нужно эту строку прописать в файле /etс/network/interfaces в виде up sh /etс/firewall.sh к интерфейсу vlan, например:

# VLAN to INET
auto vlan332
iface vlan332 inet static
address xxx.xxx.xxx.xxx
netmask 255.255.255.252
# gateway xxx.xxx.xxx.xxx
vlan_raw_device eth1
up sh /etс/firewall.sh

Это нужно потому, что сначала пройдет «автозагрузка», и только через некоторое время поднимутся наши VLAN интерфейсы, а если интерфейса нет, то и правило не создастся.

К сожалению, описать полностью работу этого замечательного файрвола у меня нет возможности, но по нему есть отличная документация на русском (перевод оригинального руководства разработчика), вот ее адрес .

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

В Linux встроен брандмауэр называемый Netfilter. По данным официального сайта проекта:

netfilter это набор системных сообщений внутри ядра Linux, которые позволяют модулям ядра зарегистрировать функции обратного вызова с сетевого стека. Зарегистрированная функция обратного вызова обрабатывает каждый пакет проходящий через сетевой стек.

Брандмауэр в Linux управляется программой iptables, которая имеет функции фильтрации IPv4, ip6tables фильтрует IPv6. Данное руководство рассказывает как научится пользоваться Netfilter (iptables) в CentOS / RHEL / Fedora / Redhat Enterprise Linux. В этой статье можно найти основные примеры настройки iptables в Linux для защиты от вторжений.

Примеры использования Iptables

  • Большинство из действий, перечисленных в этой статье пишутся с предположением, что они будут выполнены от root пользователя из bash или любой другой современной оболочке. Не вводите команды на удаленной системе, так как можете отключить себе доступ.
  • Для демонстрационных целей я использовал ubuntu 10.04, но команды должны работать с любым современным дистрибутивом.
Отображение состояния вашего брандмауэра
Введите следующую команду от root:
# iptables -L -n -v
Примерный ответ:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
Такой ответ означает, что брандмауэр не активен.
А, например, такой покажет, что брандмауэр в Linux активен:

Chain INPUT (policy ACCEPT 1810K packets, 126M bytes) pkts bytes target prot opt in out source destination 7418K 1070M ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:1194 881 52520 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:2222 flags:0x17/0x02 state NEW Chain FORWARD (policy ACCEPT 5628K packets, 482M bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT tcp -- eth0 tun0 0.0.0.0/0 0.0.0.0/0 tcp dpt:1111 state NEW,RELATED,ESTABLISHED 599K 539M ACCEPT udp -- eth0 * 0.0.0.0/0 10.1.1.6 udp dpt:1112 state NEW,RELATED,ESTABLISHED Chain OUTPUT (policy ACCEPT 4959K packets, 880M bytes) pkts bytes target prot opt in out source destination
Ключи в примере означают:

  • L : Вывести список правил.
  • v : Отображение подробной информации. Этот ключ будет выводить имя интерфейса, параметры правил и маски TOS. Счетчики пакетов и байтов, также будут показаны в списке, с "K" суффиксом, "М" или "G" в зависимости от необходимого множителя.
  • n : Не резолвить IP адреса, показывать в цифровом виде. Ускоряет вывод.
Для просмотра правил с номером строки добавьте ключ --line-numbers, например:
# iptables -n -L -v --line-numbers
Для просмотра INPUT или OUTPUT правил, наберите:
# iptables -L INPUT -n -v # iptables -L OUTPUT -n -v --line-numbers
Остановка, перезапуск, запуск брандмауэра
Если у Вас CentOS / RHEL / Fedora Linux, вводите:
# service iptables stop # service iptables start # service iptables restart
Чтобы отчистить правила iptables его собственными средствами введите:
# iptables -F # iptables -X # iptables -t nat -F # iptables -t nat -X # iptables -t mangle -F # iptables -t mangle -X # iptables -P INPUT ACCEPT # iptables -P OUTPUT ACCEPT # iptables -P FORWARD ACCEPT
Ключи в примере означают:
  • F : Удаление всех правил (flushing).
  • X : Удаление цепочки
  • t <таблица>: Выбрать таблицу и удалить правила.
  • P : Установить политику по умолчанию (например DROP, REJECT или ACCEPT).
Удаление правил брандмауэра
Для отображения номера строки наряду с другой информацией по существующим правилам, введите:
# iptables -L OUTPUT -n --line-numbers # iptables -L OUTPUT -n --line-numbers | less # iptables -L OUTPUT -n --line-numbers | grep 8.8.8.8
Вы получите список IP. Посмотрите на число слева, а вводите число, чтобы удалить его. Например, удаление линии номер 4, введите:
# iptables -D INPUT 4
Или найти источник IP 202.54.1.1 и удалить из правила:
# iptables -D INPUT -s 202.54.1.1 -j DROP
Ключ в примере означает:
  • D : удалить одно или несколько правил из указанной цепочки
Добавление правил брандмауэра
Чтобы вставить одно или несколько правил в указанной цепочке, как правило используется следующий синтаксис. Сначала узнать номер строки:
# iptables -L INPUT -n --line-numbers
Вывод например:
Chain INPUT (policy DROP) num target prot opt source destination 1 DROP all -- 202.54.1.1 0.0.0.0/0 2 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state NEW,ESTABLISHED
Чтобы вставить правило между 1 и 2, введите:
# iptables -I INPUT 2 -s 8.8.8.8 -j DROP
Для просмотра обновленных правил, введите:
# iptables -L INPUT -n --line-numbers
Вывод например:
Chain INPUT (policy DROP) num target prot opt source destination 1 DROP all -- 202.54.1.1 0.0.0.0/0 2 DROP all -- 8.8.8.8 0.0.0.0/0 3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state NEW,ESTABLISHED
Сохранение правил брандмауэра
Чтобы сохранить правила брандмауэра в CentOS / RHEL / Fedora Linux, введите:
# service iptables save
В других дистрибутивах
iptables-save > /root/my.active.firewall.rules
или
iptables-save
Восстановление правил брандмауэра
Для восстановление правил брандмауэра из файла /root/my.active.firewall.rules, введите:
# iptables-restore < /root/my.active.firewall.rules
Для восстановление правил брандмауэра в CentOS / RHEL / Fedora Linux, введите:
# service iptables restart
Установка политик брандмауэра по умолчанию
Блокировать весь трафик:
# iptables -P INPUT DROP # iptables -P OUTPUT DROP # iptables -P FORWARD DROP # iptables -L -v -n
Блокировать только входящий трафик:
# iptables -P INPUT DROP # iptables -P FORWARD DROP # iptables -P OUTPUT ACCEPT
Блокировка сетевых адресов локальной сети на внешнем интерфейсе
IP-спуфинг - атака заключающаяся в использовании в IP-пакетах, отправляемых жертве, в качестве обратного адреса IP-адрес хоста, которому она доверяет. Пакеты с немаршрутизируемыми адресами источника должны быть отвергнуты, используя следующий синтаксис:
# iptables -A INPUT -i eth1 -s 192.168.0.0/24 -j DROP # iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
Диапазон адресов IPv4 для частных сетей (убедитесь, что они заблокированы на внешнем интерфейсе)
  • 10.0.0.0/8 -j (A)
  • 172.16.0.0/12 (B)
  • 192.168.0.0/16 ©
  • 224.0.0.0/4 (MULTICAST D)
  • 240.0.0.0/5 (E)
  • 127.0.0.0/8 (LOOPBACK)
Блокировка IP-адресов
Чтобы заблокировать IP адрес 1.2.3.4, введите:
# iptables -A INPUT -s 1.2.3.4 -j DROP
Блокировка входящие запросов на порт
Чтобы заблокировать все запросы на порт 80, введите:
# iptables -A INPUT -p tcp --dport 80 -j DROP # iptables -A INPUT -i eth1 -p tcp --dport 80 -j DROP
Чтобы заблокировать порт 80 только для IP-адреса 1.2.3.4, введите:
# iptables -A INPUT -p tcp -s 1.2.3.4 --dport 80 -j DROP # iptables -A INPUT -i eth1 -p tcp -s 192.168.1.0/24 --dport 80 -j DROP
Блокировка исходящего IP-адреса
Чтобы заблокировать исходящий трафик определенного хоста или домена, такого как сайт, введите:
host -t a сайт
Ответ будет:
сайт has address 95.211.41.31
Запишите свой ​​IP-адрес и введите следующую команду, чтобы блокировать весь исходящий трафик с 95.211.41.31:
# iptables -A OUTPUT -d 95.211.41.31 -j DROP
Можно использовать маски:
# iptables -A OUTPUT -d 192.168.1.0/24 -j DROP # iptables -A OUTPUT -o eth1 -d 192.168.1.0/24 -j DROP
Вы также можете использовать доменное имя, введите:
# iptables -A OUTPUT -p tcp -d www..ru -j DROP
Хотя в документации пишут, что использование доменного имени вместо IP не рекомендуется.
Логирование и блокирование пакетов
Введите следующую команду, чтобы логировать и блокировать IP-спуфинг на открытый интерфейс с именем eth1:
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix "IP_SPOOF A: " # iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
По умолчанию все логируется в файл /var/log/messages .

Комментарий от :

Так лучше не делать, в особенности для явно левого трафика. LOG можно вставлять только строго с -m limit, иначе любая DoS-атака будет во много раз эффективнее: фактически косвенным образом злоумышленник получает прямой путь интенсивного воздействия непосредственно на файловую систему сервера.
Как делать правильнее, написано ниже
Логирование и блокирование пакетов с ограниченным количеством записей журнала
Параметр -m может ограничить количество записей в журнале созданных в единицу времени. Это используется для предотвращения флуда в файле журнала. Чтобы записывать не более 7 записей в 5 минут, введите:
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix "IP_SPOOF A: " # iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
Блокирование или разрешение трафика от Mac-адреса
Используйте следующий синтаксис:
# iptables -A INPUT -m mac --mac-source 00:19:99:3C:AB:23 -j DROP ## *only accept traffic for TCP port # 8080 from mac 00:19:99:3C:AB:22 * ## # iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source 00:19:99:3C:AB:22 -j ACCEPT
Запретить или разрешить ICMP запросы для ping
Введите следующую команду, чтобы заблокировать ICMP запросы:
# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP # iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP
Ping ответ также может быть ограничен определенными сетями или хостами:
# iptables -A INPUT -s 192.168.1.0/24 -p icmp --icmp-type echo-request -j ACCEPT
Следующий пример принимает только ограниченный тип ICMP запросов:
### ** assumed that default INPUT policy set to DROP ** ############# iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT ## ** all our server to respond to pings ** ## iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
Открытие диапазона IP-адресов
Используйте следующий синтаксис, чтобы открыть диапазон IP-адресов:
## only accept connection to tcp port 80 (Apache) if ip is between 192.168.1.100 and 192.168.1.200 ## iptables -A INPUT -p tcp --destination-port 80 -m iprange --src-range 192.168.1.100-192.168.1.200 -j ACCEPT
## nat example ## iptables -t nat -A POSTROUTING -j SNAT --to-source 192.168.1.20-192.168.1.25
Закрытие или открытие общих портов
Ниже приведен синтаксис для открытия и закрытия портов общих портов TCP и UDP:
Replace ACCEPT with DROP to block port: ## open port ssh tcp port 22 ## iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT ## open cups (printing service) udp/tcp port 631 for LAN users ## iptables -A INPUT -s 192.168.1.0/24 -p udp -m udp --dport 631 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 631 -j ACCEPT ## allow time sync via NTP for lan users (open udp port 123) ## iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p udp --dport 123 -j ACCEPT ## open tcp port 25 (smtp) for all ## iptables -A INPUT -m state --state NEW -p tcp --dport 25 -j ACCEPT # open dns server ports for all ## iptables -A INPUT -m state --state NEW -p udp --dport 53 -j ACCEPT iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT ## open http/https (Apache) server port to all ## iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT iptables -A INPUT -m state --state NEW -p tcp --dport 443 -j ACCEPT ## open tcp port 110 (pop3) for all ## iptables -A INPUT -m state --state NEW -p tcp --dport 110 -j ACCEPT ## open tcp port 143 (imap) for all ## iptables -A INPUT -m state --state NEW -p tcp --dport 143 -j ACCEPT ## open access to Samba file server for lan users only ## iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 137 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 138 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 139 -j ACCEPT iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 445 -j ACCEPT ## open access to proxy server for lan users only ## iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 3128 -j ACCEPT ## open access to mysql server for lan users only ## iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
Ограничить число одновременных подключений к серверу для каждого клиента по IP
Вы можете использовать модуль connlimit, чтобы поставить такие ограничения. Для ограничения не больше 3 SSH соединений на хост, введите:
# iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT
Установить HTTP запросов до 20:
# iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j DROP
Параметры в примере,
  • --connlimit-above 3: Соответствует ли количество существующих соединений выше 3.
  • --connlimit-mask 24: Группировать хосты по
разработчик 80-го уровня 28 сентября 2010 в 19:47

Основы iptables на примере Debian глазами младенца

  • Чулан *

О чем же пойдёт речь

Всё очень просто, в очередной раз объясняя на форуме новичкам в мире Linux, что да как я понял, что на просторах интернет не найти собранную воедино статью с объяснением не только настройки iptables, но и некоторых сетевых основ.
Так что вашему вниманию я представляю небольшой экскурс по настройке firewall в Linux. Углубимся лишь в настройку netfilter/iptables, остальных прикладных вопросов мы несомненно тоже коснёмся, ведь нам не хватает именно комплексных ответов на наши вопросы… И я постараюсь ка можно более доходчиво здесь все изложить.

Как это выглядит

Мы будем рассматривать типичную схему для офисов и для квартир, да-да именно квартир! Мало у кого есть собственный маленький сервачок дома под столом, но у большинства интернет дома раздается через роутер и в большинстве своём они тоже прошиты Linux.
Это типичная схема малого офиса. Когда к интернет подключен 1 компьютер(сервер), а остальные подключаются к интернет уже через этот сервер.

Поехали, потихонечку...

И так что же мы имеем:
  • сервер с 2мя сетевыми картами и установленным на нём Debian Lenny
  • имеющийся по умолчанию в Debian Lenny firewall - netfilter/iptables
  • локальную сеть из N компьютеров, все соединены через коммутатор, в том числе и сервер
что такое NAT
Для начала нам нужно понять, что настраивать мы будем самый обыкновенный NAT(Network Address Translation). Для жаждущих, я в конце упомяну и о проксе сервере на примере squid. Как я уже сказал разжёвывать будем практически всё.
Что же такое NAT? На самом деле все просто, все компьютеры имеют физический (MAC) и сетевой (IP) адреса. Нас в данный момент интересуют IP адреса. IP адрес в пределах одной сети должен быть уникальным! А при нынешнем стандарте IPv4 уникальными могут быть всего-то 4 294 967 296 (2 32), что совсем не много и они практически кончились. но не переживайте вот вот вступит в широкое распространение IPv6, а там адресов навалом!
Но тут вы можете заметить, компьютеров значительно больше того числа, что позволяет IPv4 или скажете, что у друга дома такой же адрес как и у вас! И вот тут-то и заходит речь о NAT - он позволяет соединять компьютерные сети между собой используя единственный, свой IP адрес, действия фаервола при этом называется SNAT(Source NAT или подмена адреса источника). Т.е. в 99% случаев вся ваша контора выходит в интернет под 1 IP адресом, при этом внутри офиса у каждого он свой. О классах IP адресов вы сможете прочесть в интерне.

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

транзитный трафик
Все команды выполняются от имени root(суперпользователь). В Debian по умолчанию отключен так называемый транзитный трафик, т.е. по умолчанию предусмотрена работа только как единичная машина. Как вы уже догадались, без транзитного трафика нету и NAT. Для его включения достаточно изменить 1 цифру - $ echo 1 > /proc/sys/net/ipv4/ip_forward , но данная настройка слетит после перезагрузки, так что лучше поправить конфиг - $ nano /etc/sysctl.conf далее ищем строчку #net.ipv4.ip_forward=1 и убираем «решётку»(символ комментария) в начале строки и проверяем что значения равно 1! Теперь можно приступать непосредственно к конфигурированию iptables.
настраиваем iptables
В интернет, есть много статей о том как писать правила в iptables и что с их помощью можно творить, наиболее полным и приятным для чтения мне показалась .
И так приступим. Для начала очистим таблицы от лишних правил, вдруг там что было лишнего…
$ iptables -F
$ iptables -t nat -F
$ iptables -t mangle -F

Лишнее почистили. Очень важно понять и помнить, что правила в iptables применяются иерархически, т.е. правило стоящее выше выполнится раньше. Все цепочки по умолчанию имеют политику ACCEPT - разрешают всё. что не попало под правила данной цепочки.
Условимся, что интерфейс смотрящий в локальную сеть - eth0, а в интернет - eth1, локальная сеть имеет адреса 192.168.0.0/24, а провайдер выдал нам статический адрес 10.188.106.33(пускай и не «белый» - о типах ip адресов вы также можете посмотреть в интернет). И так пишем:
$ iptables -A FORWARD -i eth0 -o eth1 -s 192.168.0.0/24 -j ACCEPT
$ iptables -A FORWARD -i eth1 -o eth0 -d 192.168.0.0/24 -j ACCEPT
$ iptables -P FORWARD DROP

тем самым разрешили ходить транзитным пакетам через firewall для нашего диапазона ip адресов, а всё остальное запрещаем.
Теперь сам NAT:
$ iptables -A POSTROUTING -s 192.168.0.0/24 -o eth1 -j SNAT --to-source 10.188.106.33
Этого достаточно для того что бы у вас заработал NAT.
по мелочам...
На клиентах указываем ip из выбранного диапазона и указываем в качестве шлюза ip адрес нашего сервера(обычно его назначают первым из подсети - я оставлю это на ваше усмотрение). Все сетевые настройки на сервере можно провести так:
$ nano /etc/network/interfaces в нём указываются настройки ваших сетевых интерфейсов.
доступ в недры сети через шлюз или DNAT
И тут вы поняли, что в сети у вас есть Windows Server к которому у вас всегда был простой доступ по RDP, а тут вылез это назойливый шлюз на Debian! Всё очень просто - надо всего лишь добавить DNAT правило в наш iptables.
Что за зверь DNAT? DNAT (Destination NAT или подмена адреса получателя) - сетевые карты работают в таком режиме, что они принимают только пакеты адресованные именно им, а зайти на наш сервер если ip под которым он выходит в интернет сидят еще десяток машин в вашем офисе? Как запрос дойдёт именного до него? На самом деле все запросы такого рода упираются в наш шлюз. И всё что нам надо сделать это задать правила для работы с такими пакетами.
$ iptables -A PREROUTING -i eth1 -p tcp -m tcp --dport 3389 -j DNAT --to-destination 192.168.0.2
Это простое правило будет переадресовывать все пакеты приходящие на шлюз из интернет на порт TCP 3389(именно его использует RDP протокол) на ваш внутренний Windows Server. И, вуаля, у вас все работает.
итак что там с любимым squid
И хотя сейчас все работает, у всех есть интернет и все работает, некоторым всё же нужен прокси сервер. Я не буду рассказывать о настройке squid, я покажу правило которое позволит сделать его «прозрачным». В сквид надо лишь прописать волшебное слово transparent в нужном месте и он начнём корректно обрабатывать свалившееся на него запросы.
Пишем $ iptables -A PREROUTING -d! 192.168.0.0/24 -i eth0 -p tcp -m multiport --dports 80,443 -j REDIRECT --to-ports 3128 .
И что же нам это даёт? Теперь все запросы на web страницы с ваших рабочих мест по http((80) и https(443) протоколам будут перенаправляться на порт который слушает squid. Вы получает контентную фильтрацию, информацию о том кто где был и что делал в интернет, пользователь ни чего не подозревая работает как и раньше…
немного безопасности
Следует хоть минимально защитить свой шлюз поэтому добавим еще пару правил
$ iptables -A INPUT -i lo -j ACCEPT
$ iptables -A INPUT -i eth0 -s 192.168.0.0/24 -j ACCEPT
$ iptables -A INPUT -i eth1 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
$ iptables -P INPUT DROP

Тем самым запретили любое общение непосредственно с шлюзом, кроме уже установленных соединений, т.е. те что были инициированы вами и вы просто получаете на них ответы. Не бойтесь наш DNAT до этих правил просто не доходит…
почему так мало?
Статья не резиновая и обо всем все-равно не расскажешь… Я привел минимальный набор действий и понятий что бы вы могли начать осваивать такую махину как шлюз на Linux. Здесь можно говорить очень и очень долго, обсуждая многие аспекты и возможности netfilter.

Итого

Как мы видим все действительно просто! Главное это понять принцип функционирования сети и не боятся настраивать и читать большие мануалы.
Надеюсь мне удалось собрать воедино информацию достаточную для начала вашей дружбы с программными маршрутизаторами на основе Linux.

Теги: iptables, netfilter, NAT

Всё очень просто, в очередной раз объясняя на форуме новичкам в мире Linux, что да как я понял, что на просторах интернет не найти собранную воедино статью с объяснением не только настройки iptables, но и некоторых сетевых основ.
Так что вашему вниманию я представляю небольшой экскурс по настройке firewall в Linux. Углубимся лишь в настройку netfilter/iptables, остальных прикладных вопросов мы несомненно тоже коснёмся, ведь нам не хватает именно комплексных ответов на наши вопросы… И я постараюсь ка можно более доходчиво здесь все изложить.

Как это выглядит

Мы будем рассматривать типичную схему для офисов и для квартир, да-да именно квартир! Мало у кого есть собственный маленький сервачок дома под столом, но у большинства интернет дома раздается через роутер и в большинстве своём они тоже прошиты Linux.
Это типичная схема малого офиса. Когда к интернет подключен 1 компьютер(сервер), а остальные подключаются к интернет уже через этот сервер.

Поехали, потихонечку...

И так что же мы имеем:
  • сервер с 2мя сетевыми картами и установленным на нём Debian Lenny
  • имеющийся по умолчанию в Debian Lenny firewall - netfilter/iptables
  • локальную сеть из N компьютеров, все соединены через коммутатор, в том числе и сервер
что такое NAT
Для начала нам нужно понять, что настраивать мы будем самый обыкновенный NAT(Network Address Translation). Для жаждущих, я в конце упомяну и о проксе сервере на примере squid. Как я уже сказал разжёвывать будем практически всё.
Что же такое NAT? На самом деле все просто, все компьютеры имеют физический (MAC) и сетевой (IP) адреса. Нас в данный момент интересуют IP адреса. IP адрес в пределах одной сети должен быть уникальным! А при нынешнем стандарте IPv4 уникальными могут быть всего-то 4 294 967 296 (2 32), что совсем не много и они практически кончились. но не переживайте вот вот вступит в широкое распространение IPv6, а там адресов навалом!
Но тут вы можете заметить, компьютеров значительно больше того числа, что позволяет IPv4 или скажете, что у друга дома такой же адрес как и у вас! И вот тут-то и заходит речь о NAT - он позволяет соединять компьютерные сети между собой используя единственный, свой IP адрес, действия фаервола при этом называется SNAT(Source NAT или подмена адреса источника). Т.е. в 99% случаев вся ваша контора выходит в интернет под 1 IP адресом, при этом внутри офиса у каждого он свой. О классах IP адресов вы сможете прочесть в интерне.

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

транзитный трафик
Все команды выполняются от имени root(суперпользователь). В Debian по умолчанию отключен так называемый транзитный трафик, т.е. по умолчанию предусмотрена работа только как единичная машина. Как вы уже догадались, без транзитного трафика нету и NAT. Для его включения достаточно изменить 1 цифру - $ echo 1 > /proc/sys/net/ipv4/ip_forward , но данная настройка слетит после перезагрузки, так что лучше поправить конфиг - $ nano /etc/sysctl.conf далее ищем строчку #net.ipv4.ip_forward=1 и убираем «решётку»(символ комментария) в начале строки и проверяем что значения равно 1! Теперь можно приступать непосредственно к конфигурированию iptables.
настраиваем iptables
В интернет, есть много статей о том как писать правила в iptables и что с их помощью можно творить, наиболее полным и приятным для чтения мне показалась .
И так приступим. Для начала очистим таблицы от лишних правил, вдруг там что было лишнего…
$ iptables -F
$ iptables -t nat -F
$ iptables -t mangle -F

Лишнее почистили. Очень важно понять и помнить, что правила в iptables применяются иерархически, т.е. правило стоящее выше выполнится раньше. Все цепочки по умолчанию имеют политику ACCEPT - разрешают всё. что не попало под правила данной цепочки.
Условимся, что интерфейс смотрящий в локальную сеть - eth0, а в интернет - eth1, локальная сеть имеет адреса 192.168.0.0/24, а провайдер выдал нам статический адрес 10.188.106.33(пускай и не «белый» - о типах ip адресов вы также можете посмотреть в интернет). И так пишем:
$ iptables -A FORWARD -i eth0 -o eth1 -s 192.168.0.0/24 -j ACCEPT
$ iptables -A FORWARD -i eth1 -o eth0 -d 192.168.0.0/24 -j ACCEPT
$ iptables -P FORWARD DROP

тем самым разрешили ходить транзитным пакетам через firewall для нашего диапазона ip адресов, а всё остальное запрещаем.
Теперь сам NAT:
$ iptables -A POSTROUTING -s 192.168.0.0/24 -o eth1 -j SNAT --to-source 10.188.106.33
Этого достаточно для того что бы у вас заработал NAT.
по мелочам...
На клиентах указываем ip из выбранного диапазона и указываем в качестве шлюза ip адрес нашего сервера(обычно его назначают первым из подсети - я оставлю это на ваше усмотрение). Все сетевые настройки на сервере можно провести так:
$ nano /etc/network/interfaces в нём указываются настройки ваших сетевых интерфейсов.
доступ в недры сети через шлюз или DNAT
И тут вы поняли, что в сети у вас есть Windows Server к которому у вас всегда был простой доступ по RDP, а тут вылез это назойливый шлюз на Debian! Всё очень просто - надо всего лишь добавить DNAT правило в наш iptables.
Что за зверь DNAT? DNAT (Destination NAT или подмена адреса получателя) - сетевые карты работают в таком режиме, что они принимают только пакеты адресованные именно им, а зайти на наш сервер если ip под которым он выходит в интернет сидят еще десяток машин в вашем офисе? Как запрос дойдёт именного до него? На самом деле все запросы такого рода упираются в наш шлюз. И всё что нам надо сделать это задать правила для работы с такими пакетами.
$ iptables -A PREROUTING -i eth1 -p tcp -m tcp --dport 3389 -j DNAT --to-destination 192.168.0.2
Это простое правило будет переадресовывать все пакеты приходящие на шлюз из интернет на порт TCP 3389(именно его использует RDP протокол) на ваш внутренний Windows Server. И, вуаля, у вас все работает.
итак что там с любимым squid
И хотя сейчас все работает, у всех есть интернет и все работает, некоторым всё же нужен прокси сервер. Я не буду рассказывать о настройке squid, я покажу правило которое позволит сделать его «прозрачным». В сквид надо лишь прописать волшебное слово transparent в нужном месте и он начнём корректно обрабатывать свалившееся на него запросы.
Пишем $ iptables -A PREROUTING -d! 192.168.0.0/24 -i eth0 -p tcp -m multiport --dports 80,443 -j REDIRECT --to-ports 3128 .
И что же нам это даёт? Теперь все запросы на web страницы с ваших рабочих мест по http((80) и https(443) протоколам будут перенаправляться на порт который слушает squid. Вы получает контентную фильтрацию, информацию о том кто где был и что делал в интернет, пользователь ни чего не подозревая работает как и раньше…
немного безопасности
Следует хоть минимально защитить свой шлюз поэтому добавим еще пару правил
$ iptables -A INPUT -i lo -j ACCEPT
$ iptables -A INPUT -i eth0 -s 192.168.0.0/24 -j ACCEPT
$ iptables -A INPUT -i eth1 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
$ iptables -P INPUT DROP

Тем самым запретили любое общение непосредственно с шлюзом, кроме уже установленных соединений, т.е. те что были инициированы вами и вы просто получаете на них ответы. Не бойтесь наш DNAT до этих правил просто не доходит…
почему так мало?
Статья не резиновая и обо всем все-равно не расскажешь… Я привел минимальный набор действий и понятий что бы вы могли начать осваивать такую махину как шлюз на Linux. Здесь можно говорить очень и очень долго, обсуждая многие аспекты и возможности netfilter.

Итого

Как мы видим все действительно просто! Главное это понять принцип функционирования сети и не боятся настраивать и читать большие мануалы.
Надеюсь мне удалось собрать воедино информацию достаточную для начала вашей дружбы с программными маршрутизаторами на основе Linux.

Теги: iptables, netfilter, NAT