iptables в простейших примерах

5 января, 2012 Рубрики: Linux, netfilter/iptables

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

Настройка netfilter/iptables для рабочей станции

Давайте начнем с элементарной задачи – реализация сетевого экрана Linux на десктопе. В большинстве случаев на десктопных дистрибутивах линукса нет острой необходимости использовать файервол, т.к. на таких дистрибутивах не запущены какие-либо сервисы, слушающие сетевые порты, но ради профилактики организовать защиту не будет лишним. Ибо ядро тоже не застраховано от дыр. Итак, мы имеем Linux, с настроенным сетевым интерфейсом eth0, не важно по DHCP или статически…

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

netfilter:~# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Это значит, что политика по умолчанию для таблицы filter во всех цепочках – ACCEPT и нет никаких других правил, что-либо запрещающих. Поэтому давайте сначала запретим ВСЁ входящие, исходящие и проходящие пакеты (не вздумайте это делать удаленно-тут же потеряете доступ):

netfilter:~# iptables -P INPUT DROP
netfilter:~# iptables -P OUTPUT DROP
netfilter:~# iptables -P FORWARD DROP

Этими командами мы устанавливаем политику DROP по умолчанию. Это значит, что любой пакет, для которого явно не задано правило, которое его разрешает, автоматически отбрасывается. Поскольку пока еще у нас не задано ни одно правило – будут отвергнуты все пакеты, которые придут на ваш компьютер, равно как и те, которые вы попытаетесь отправить в сеть. В качестве демонстрации можно попробовать пропинговать свой компьютер через интерфейс обратной петли:

netfilter:~# ping -c2 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
ping: sendmsg: Operation not permitted
ping: sendmsg: Operation not permitted
--- localhost ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1004ms

На самом деле это полностью не функционирующая сеть и это не очень хорошо, т.к. некоторые демоны используют для обмена между собой петлевой интерфейс, который после проделанных действий более не функционирует. Это может нарушить работу подобных сервисов. Поэтому в первую очередь в обязательно разрешим передачу пакетов через входящий петлевой интерфейс и исходящий петлевой интерфейс в таблицах INPUT (для возможности получения отправленных пакетов) и OUTPUT (для возможности отправки пакетов) соответственно. Итак, обязательно выполняем:

netfilter:~# iptables -A INPUT -i lo -j ACCEPT 
netfilter:~# iptables -A OUTPUT -o lo -j ACCEPT

После этого пинг на локалхост заработает:

netfilter:~# ping -c1 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1 (127.0.0.1): icmp_seq=1 ttl=64 time=0.116 ms
--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 116ms
rtt min/avg/max/mdev = 0.116/0.116/0.116/0.116 ms

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

netfilter:~# iptables -A INPUT -p icmp -j ACCEPT
netfilter:~# iptables -A OUTPUT -p icmp -j ACCEPT

Более безопасно будет указать следующую аналогичную команду iptables:

netfilter:~# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
netfilter:~# iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
netfilter:~# iptables -A OUTPUT -p icmp -j ACCEPT

Данная команда разрешит типы ICMP пакета эхо-запрос и эхо-ответ, что повысит безопасность.

Зная, что наш комп не заражен (ведь это так?) и он устанавливает только безопасные исходящие соединения. А так же, зная, что безопасные соединения – это соединения из т.н. эфимерного диапазона портов, который задается ядром в файле /proc/sys/net/ipv4/ip_local_port_range, можно разрешить исходящие соединения с этих безопасных портов:

netfilter:~# cat /proc/sys/net/ipv4/ip_local_port_range
32768 61000
netfilter:~# iptables -A OUTPUT -p TCP --sport 32768:61000 -j ACCEPT
netfilter:~# iptables -A OUTPUT -p UDP --sport 32768:61000 -j ACCEPT

Если подходить к ограничению исходящих пакетов не параноидально, то можно было ограничиться одной командой iptables, разрешающей все исхолящие соединения оп всем протоколам и портам:

netfilter:~# iptables -A OUTPUT -j ACCEPT
netfilter:~# # или просто задать политику по умолчанию ACCEPT для цепочки OUTPUT
netfilter:~# iptables -P OUTPUT ACCEPT

Далее, зная что в netfilter сетевые соединения имеют 4 состояния (NEW, ESTABLISHED, RELATED и INVALID) и новые исходящие соединения с локального компьютера (с состоянием NEW) у нас разрешены в прошлых двух командах iptables, что уже установленные соединения и дополнительные имеют состояния ESTABLISHED и RELATED, соответственно, а так же зная, что входящие соединения к локальной системе приходят через цепочку INPUT, можно разрешить попадание на наш компьютер только тех TCP- и UDP-пакетов, которые были запрошены локальными приложениями:

netfilter:~# iptables -A INPUT -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
netfilter:~# iptables -A INPUT -p UDP -m state --state ESTABLISHED,RELATED -j ACCEPT

Это собственно, все! Если на десктопе все же работает какая-то сетевая служба, то необходимо добавить соответствующие правила для входящих соединений и для исходящих. Например, для работы ssh-сервера, который принимает и отправляет запросы на 22 TCP-порту, необходимо добавить следующие iptables-правила:

netfilter:~# iptables -A INPUT -i eth0 -p TCP --dport 22 -j ACCEPT 
netfilter:~# iptables -A OUTPUT -o eth0 -p TCP --sport 22 -j ACCEPT

Т.е. для любого сервиса нужно добавить по одному правилу в цепочки INPUT и OUTPUT, разрешающему соответственно прием и отправку пакетов с использованием этого порта для конкретного сетевого интерфейса (если интерфейс не указывать, то будет разрешено принимать/отправлять пакеты по любому интерфейсу).

Настройка netfilter/iptables для подключения нескольких клиентов к одному соединению.

Давайте теперь рассмотрим наш Linux в качестве шлюза для локальной сети во внешнюю сеть Internet. Предположим, что интерфейс eth0 подключен к интернету и имеет IP 198.166.0.200, а интерфейс eth1 подключен к локальной сети и имеет IP 10.0.0.1. По умолчанию, в ядре Linux пересылка пакетов через цепочку FORWARD (пакетов, не предназначенных локальной системе) отключена. Чтобы включить данную функцию, необходимо задать значение 1 в файле /proc/sys/net/ipv4/ip_forward:

netfilter:~# echo 1 > /proc/sys/net/ipv4/ip_forward

Чтобы форвардинг пакетов сохранился после перезагрузки, необходимо в файле /etc/sysctl.conf раскомментировать (или просто добавить) строку net.ipv4.ip_forward=1.

Итак, у нас есть внешний адрес (198.166.0.200), в локальной сети имеется некоторое количество гипотетических клиентов, которые имеют адреса из диапазона локальной сети и посылают запросы во внешнюю сеть. Если эти клиенты будут отправлять во внешнюю сеть запросы через шлюз “как есть”, без преобразования, то удаленный сервер не сможет на них ответить, т.к. обратным адресом будет получатель из “локальной сети”. Для того, чтобы эта схема корректно работала, необходимо подменять адрес отправителя, на внешний адрес шлюза Linux. Это достигается за счет действия MASQUERADE (маскарадинг) в цепочке POSTROUTING, в таблице nat.

netfilter:~# iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
netfilter:~# iptables -A FORWARD -m conntrack --ctstate NEW -i eth1 -s 10.0.0.1/24 -j ACCEPT
netfilter:~# iptables -P FORWARD DROP
netfilter:~# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Итак, по порядку сверху-вниз мы разрешаем уже установленные соединения в цепочке FORWARD, таблице filter, далее мы разрешаем устанавливать новые соединения в цепочке FORWARD, таблице filter, которые пришли с интерфейса eth1 и из сети 10.0.0.1/24. Все остальные пакеты, которые проходят через цепочку FORWARD – отбрасывать. Далее, выполняем маскирование (подмену адреса отправителя пакета в заголовках) всех пакетов, исходящих с интерфейса eth0.

Примечание. Есть некая общая рекомендация: использовать правило -j MASQUERADE для интерфейсов с динамически получаемым IP (например, по DHCP от провайдера). При статическом IP, -j MASQUERADE  можно заменить на аналогичное -j SNAT —to-source IP_интерфейса_eth0. Кроме того, SNAT умеет “помнить” об установленных соединениях при кратковременной недоступности интерфейса. Сравнение MASQUERADE  и SNAT в таблице:

SNAT vs MASQUARADE

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

netfilter:~# iptables -P INPUT DROP
netfilter:~# iptables -P OUTPUT DROP
netfilter:~# iptables -A INPUT -i lo -j ACCEPT 
netfilter:~# iptables -A OUTPUT -o lo -j ACCEPT
netfilter:~# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
netfilter:~# iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
netfilter:~# iptables -A OUTPUT -p icmp -j ACCEPT
netfilter:~# cat /proc/sys/net/ipv4/ip_local_port_range
32768 61000
netfilter:~# iptables -A OUTPUT -p TCP --sport 32768:61000 -j ACCEPT
netfilter:~# iptables -A OUTPUT -p UDP --sport 32768:61000 -j ACCEPT
netfilter:~# iptables -A INPUT -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
netfilter:~# iptables -A INPUT -p UDP -m state --state ESTABLISHED,RELATED -j ACCEPT

В результате, если один из хостов локальной сети, например 10.0.0.2, попытается связаться с одним из интернет-хостов, например, 93.158.134.3 (ya.ru), при проходе его пакетов через шлюз, их исходный адрес будет подменяться на внешний адрес шлюза в цепочке POSTROUTING таблице nat, то есть исходящий IP  10.0.0.2 будет заменен на 198.166.0.200. С точки зрения удаленного хоста (ya.ru), это будет выглядеть, как будто с ним связывается непосредственно сам шлюз. Когда же удаленный хост начнет ответную передачу данных, он будет адресовать их именно шлюзу, то есть 198.166.0.200. Однако, на шлюзе адрес назначения этих пакетов будет подменяться на 10.0.0.2, после чего пакеты будут передаваться настоящему получателю в локальной сети. Для такого обратного преобразования никаких дополнительных правил указывать не нужно — это будет делать все та же операция MASQUERADE, которая помнит какой хост из локальной сети отправил запрос и какому хосту необходимо вернуть пришедший ответ.

Примечание: желательно негласно принято, перед всеми командами iptables очищать цепочки, в которые будут добавляться правила:

netfilter:~# iptables -F ИМЯ_ЦЕПОЧКИ

Предоставление доступа к сервисам на шлюзе

Предположим, что на нашем шлюзе запущен некий сервис, который должен отвечать на запросы поступающие из сети интернет. Допустим он работает на некотором TCP порту nn. Чтобы предоставить доступ к данной службе, необходимо модифицировать таблицу filter в цепочке INPUT (для возможности получения сетевых пакетов, адресованных локальному сервису) и таблицу filter в цепочке OUTPUT (для разрешения ответов на пришедшие запросы).

Итак, мы имеем настроенный шлюз, который маскарадит (заменяет адрес отправителя на врешний) пакеты во внешнюю сеть. И разрешает принимать все установленные соединения. Предоставление доступа к сервису будет осуществляться с помощью следующих разрешающих правил:

netfilter:~# iptables -A INPUT -p TCP --dport nn -j ACCEPT 
netfilter:~# iptables -A OUTPUT -p TCP --sport nn -j ACCEPT

Данные правила разрешают входящие соединения по протоколу tcp на порт nn и исходящие соединения по протоколу tcp с порта nn. Кроме этого, можно добавить дополнительные ограничивающие параметры, например разрешить входящие соединения только с внешнего интерфейса eth0 (ключ -i eth0) и т.п.

Предоставление доступа к сервисам в локальной сети

Предположим, что в нашей локальной сети имеется какой-то хост с IP X.Y.Z.1, который должен отвечать на сетевые запросы из внешней сети на TCP-порту xxx. Для того чтобы при обращении удаленного клиента ко внешнему IP на порт xxx происходил корректный ответ сервиса из локальной сети, необходимо направить запросы, приходящие на внешний IP порт xxx на соответствующий хост в локальной сети. Это достигается модификацией адреса получателя в пакете, приходящем на указанный порт. Это действие называется DNAT и применяется в цепочке PREROUTING в таблице nat. А так же разрешить прохождение данный пакетов в цепочке FORWARD в таблице filter.

Опять же, пойдем по пути прошлого раздела. Итак, мы имеем настроенный шлюз, который маскарадит (заменяет адрес отправителя на врешний) пакеты во внешнюю сеть. И разрешает принимать все установленные соединения. Предоставление доступа к сервису будет осуществляться с помощью следующих разрешающих правил:

netfilter:~# iptables -t nat -A PREROUTING -p tcp -d 198.166.0.200 --dport xxx -j DNAT --to-destination X.Y.Z.1
netfilter:~# iptables -A FORWARD -i eth0 -p tcp -d X.Y.Z.1 --dport xxx -j ACCEPT

Сохранение введенных правил при перезагрузке

Все введенные в консоли правила – после перезагрузки ОС будут сброшены в первоначальное состояние (читай – удалены). Для того чтобы сохранить все введенные команды iptables, существует несколько путей. Например, один из них – задать все правила брандмауэра в файле инициализации rc.local. Но у данного способа есть существенный недостаток: весь промежуток времени с запуска сетевой подсистемы, до запуска последней службы и далее скрипта rc.local из SystemV операционная система будет не защищена. Представьте ситуацию, например, если какая-нибудь служба (например NFS) стартует последней и при ее запуске произойдет какой-либо сбой и до запуска скрипта rc.local. Соответственно, rc.local так и не запуститься, а наша система превращается в одну большую дыру.

Поэтому самой лучшей идеей будет инициализировать правила netfilter/iptables при загрузке сетевой подсистемы. Для этого в Debian есть отличный инструмент – каталог /etc/network/if-up.d/, в  который можно поместить скрипты, которые будут запускаться при старте сети. А так же есть команды iptables-save и iptables-restore, которые сохраняют создают дамп правил netfilter из ядра на стандартный вывод и восстанавливают в ядро правила со стандартного ввода соответственно.

Итак, алгоритм сохранения iptables примерно следующий:

  • Настраиваем сетевой экран под свои нужны с помощью команды iptables
  • создаем дамп созданный правил с помощью команды iptables-save > /etc/iptables.rules
  • создаем скрипт импорта созданного дампа при старте сети (в каталоге /etc/network/if-up.d/) и не забываем его сделать исполняемым:
# cat /etc/network/if-up.d/firewall
#!/bin/bash
/sbin/iptables-restore < /etc/iptables.rules
exit 0
# chmod +x /etc/network/if-up.d/firewall

Дамп правил, полученный командой iptables-save имеет текстовый формат, соответственно пригоден для редактирования. Синтаксис вывода команды iptables-save следующий:

# Generated by iptables-save v1.4.5 on Sat Dec 24 22:35:13 2011
*filter
:INPUT ACCEPT [0:0] 
:FORWARD ACCEPT [0:0]
.......
# комментарий
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT
...........
-A FORWARD -j REJECT
COMMIT
# Completed on Sat Dec 24 22:35:13 2011
# Generated by iptables-save v1.4.5 on Sat Dec 24 22:35:13 2011
*raw
......
COMMIT

Строки, начинающиеся на # – комментарии, строки на * – это название таблиц, между названием таблицы и словом COMMIT содержатся параметры, передаваемые команде iptables. Параметр COMMIT – указывает на завершение параметров для вышеназванной таблицы. Строки, начинающиеся на двоеточие задают цепочки, в которых содержится данная таблица в формате:

:цепочка политика [пакеты:байты]

где цепочка – имя цепочки, политика – политика цепочки по-умолчанию для данной таблицы, а далее счетчики пакетов и байтов на момент выполнения команды.

В RedHat функции хранения команд iptables выполняемых при старте и останове сети выполняет файл /etc/sysconfig/iptables. А управление данным файлом лежит на демоне iptables.

Как еще один вариант сохранения правил, можно рассмотреть использование параметра up в файле /etc/network/interfaces с аргументом в виде файла, хранящего команды iptables, задающие необходимые правила.

Итог

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

С Уважением, Mc.Sim!




Теги: , , , ,

105 комментариев к “iptables в простейших примерах”

  1. Антон
    21 марта, 2012 at 11:01
    1

    Отличная статья! Впервые встречаю так четко разложенную по полочкам информацию об iptables! Мне очень помогло. Спасибо.

    • 21 марта, 2012 at 13:24
      2

      Пожалуйста!
      Приходите еще!

  2. Денис
    22 марта, 2012 at 21:39
    3

    Интересно , у меня не заработал форвардинг на таком правиле(в итоге его стер), не могу понять в чем прикол –
    $IPTABLES -A FORWARD -m state –state INVALID -j DROP

    ставил – echo 1 > /proc/sys/net/ipv4/netfilter-/ip_conntrack_tcp_be_liberal – не помогло.

    • 24 марта, 2012 at 01:32
      4

      Без всего списка правил трудно что-то сказать…

  3. Денис
    22 марта, 2012 at 21:57
    5

    Прикол № 2

    при

    $IPTABLES -P OUTPUT DROP
    $IPTABLES -A OUTPUT -m state –state INVALID -j DROP
    $IPTABLES -A OUTPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
    $IPTABLES -A OUTPUT -o lo -j ACCEPT
    #Allow ICMP Replies (Ping)
    $IPTABLES -A OUTPUT -p ICMP -o eth0 –icmp-type 8 -j ACCEPT

    ping 8.8.8.8 работает , а ping ya.ru нет

    ставлю $IPTABLES -P OUTPUT ACCEPT – работает все ,
    получается не работают dns запросы по udp ,

    помогла такая строка –
    iptables -A OUTPUT -p udp -o eth0 –dport 53 –sport 1024:65535 -m state –state ESTABLISHED,NEW -j ACCEPT

    • 24 марта, 2012 at 01:35
      6

      ну дык все верно, у вас в этих правилах:
      $IPTABLES -P OUTPUT DROP
      $IPTABLES -A OUTPUT -m state —state INVALID -j DROP
      $IPTABLES -A OUTPUT -m state —state ESTABLISHED,RELATED -j ACCEPT
      $IPTABLES -A OUTPUT -o lo -j ACCEPT
      #Allow ICMP Replies (Ping)
      $IPTABLES -A OUTPUT -p ICMP -o eth0 —icmp-type 8 -j ACCEPT

      нет правила, разрешающего udp трафик, поэтому и DNS не работал.
      а вот это:
      iptables -A OUTPUT -p udp -o eth0 —dport 53 —sport 1024:65535 -m state —state ESTABLISHED,NEW -j ACCEPT
      я бы заменил на
      iptables -A OUTPUT -p udp -o eth0 —dport 53 —sport 1024:65535 -m state —state NEW -j ACCEPT
      и добавил
      iptables -A INPUT -m state —state ESTABLISHED,RELATED -j ACCEPT

    • 24 марта, 2012 at 01:36
      7

      Чтобы всю схему понять, нужно почитать первую статью о netfilter.

  4. creed.d
    29 апреля, 2012 at 18:05
    8

    Я то думал что понимаю что такое ‘iptables’,к моему удивлению наверное процентов 60 было ново для меня-спасибо огромное автору =)
    Вот нашел на блоге про статическую маршрутизацию-а есть про динамическую что-нить—не нашел ,так не хочется в нете капаться по кускам все собирать-твои статьи мне как-то лучше внимать получается—все четко,все в одном месте и добросовестный автор,который всегда ответит на вопрос если че не понял!!!

    • 29 апреля, 2012 at 19:57
      9

      К сожалению, о динамической маршрутизации пока статей не планируется…

    • Dep
      22 июля, 2015 at 17:29
      10

      Спасибо. Статья очень хорошая, для людей. )

  5. 6y6lbIk
    20 мая, 2012 at 23:07
    11

    отличная статья-сильно помагла, так как я знаком с iptables и линукс 1 неделю. а можно поподробнее о conntrack – в различных примерах по iptables ее нет, 1ый раз тут вижу.
    если вместо этого
    iptables -P FORWARD DROP
    iptables -A FORWARD -m conntrack –ctstate ESTABLISHED,RELATED -j ACCEPT
    iptables -A FORWARD -m conntrack –ctstate NEW -i eth1 -s 10.0.0.1/24 -j ACCEPT

    прописать так
    iptables -P FORWARD DROP
    iptables -A FORWARD -m state –state ESTABLISHED,RELATED -j ACCEPT
    iptables -A FORWARD -o eth0 -i eth1 -j ACCEPT
    будет ли сильноразница?

    • 22 мая, 2012 at 23:31
      12

      Если считать, что в обоих примерах интерфейс eth1 один и тот же, то разница будет в том, что во втором примере будут разрешены любые пакеты проходящие через сервер, которые имеют входящий интерфейс eth1 и исходящий eth1. В первом же примере разрешается только устанавливаемые (имеющие состояние NEW) соединения, которые входят через интерфейс eth1 и имеют исходящий IP из подсети 10.0.0.1/24. Т.о. теоретически, первый пример более безопасен.

  6. 6y6lbIk
    27 мая, 2012 at 01:22
    13

    спасибо! сделал по Вашему примеру. и заодно прикрутил, вместо устаревшего state, conntrack 8) .

  7. Sergey
    24 декабря, 2012 at 18:53
    14

    Спасибо за статейку.
    Подскажите пожалуйста, как правильно настраивать iptables на удаленном сервере.
    Если я изначально все правила пропишу а уже в самом конце пропишу правила по умолчанию:
    > iptables -P INPUT DROP
    > iptables -P OUTPUT DROP
    > iptables -P FORWARD DROP
    это тоже будет правильно ?

    • 24 декабря, 2012 at 21:04
      15

      перед экспериментами с iptables я бы посоветовал в cron добавить задание на перезагрузку. Так, если будет ошибка, то сервер перегрузится и все правила сбросятся.

  8. сибиряк
    25 декабря, 2012 at 20:57
    16

    Кстати один из лучший мануалов в рунете =)

  9. Леха
    30 марта, 2013 at 00:23
    17

    Спасибо! все четко, а то я совсем не понимал…

  10. Art
    17 апреля, 2013 at 11:14
    18

    Статья толковая . Автору респект . Про удалённую перезагрузку в кроне – наверное достаточно просто поместить скрипт ,который бы сбрасывал правила .

    • 19 апреля, 2013 at 11:33
      19

      тоже можно…

  11. Cepreu
    18 мая, 2013 at 14:33
    20

    А почему:
    iptables -A INPUT -p icmp –icmp-type 8 -j ACCEPT
    iptables -A INPUT -p icmp –icmp-type 11 -j ACCEPT
    iptables -A OUTPUT -p icmp -j ACCEPT

    У меня так пинги не проходят. Зато проходят так:

    iptables -A INPUT -p icmp –icmp-type 0 -j ACCEPT
    iptables -A OUTPUT -p icmp –icmp-type 8 -j ACCEPT

    Потому как:

    ТИП КОД Описаниe
    0 0 Echo Reply
    8 0 Echo request

    • 20 мая, 2013 at 09:05
      21

      Спасибо за замечание, Cepreu
      Это опечатка. Вношу поправки.

  12. Igor
    20 мая, 2013 at 17:38
    22

    Самая разжованная статья какую я только встречались по iptables. Автору честь и хвала. Вопрос в следующем если это использовать на роутэре (на Linux)то в icmp кроме 8 и 0 типа какие есче лучше открыть типы ?

    • 22 мая, 2013 at 22:45
      23

      Спасибо за отзыв. В wiki описаны типы icmp пакетов. По названиям вполне наглядно можно выбрать себе подходящие )

  13. Андрей
    30 мая, 2013 at 17:30
    24

    Добрый день. Я не нашел следующую информацию а для меня это очень важно. При настройке iptables как применяются правила. Если я одним правилом запретил прохождение всех пакетов, а следующим частично разрешил, какое правило в итоге сработает. И на оборот, если я разрешил частично прохождение пакетов а следующее правило их все DROPает. Что будет в итоге. Интуитивно понятно но хотелось бы чтобы специалисты подсказали более точно. И еще что имеет приоритет политика по умолчанию или добавленные правила. Большое спасибо за ответ.

  14. Андрей
    31 мая, 2013 at 11:18
    25

    И еще вопрос: отличаются ли команды iptables -F INPUT
    и iptables -t filter -F
    если я правильно понял первая команда очищает таблицу filter в цепочке INPUT а вторая очищает таблицы filter во всех цепочках где эта таблица присутствует.
    Правильно ли я понял? Спасибо.

    • 3 июня, 2013 at 08:37
      26

      Андрей, добрый день.
      Пожалуйста, прочитайте первую статью об netfilter. Большая часть вопросов отпадет.

      • Антон
        21 марта, 2014 at 10:05
        27

        Нету там такого.

        If a rule specifies that any packets from the 192.168.100.0/24 subnet be dropped, and this is followed by a rule that allows packets from 192.168.100.13 (which is within the dropped subnet), then the second rule is ignored.

        The rule to allow packets from 192.168.100.13 must precede the rule that drops the remainder of the subnet.

        netfilter:~# iptables -A INPUT -i lo -j ACCEPT
        netfilter:~# iptables -A OUTPUT -o lo -j ACCEPT
        netfilter:~# iptables -P INPUT DROP
        netfilter:~# iptables -P OUTPUT DROP

        • Антон
          21 марта, 2014 at 13:48
          28

          default policy может быть и в начале, но думаю суть вы уловили.

          • 26 марта, 2014 at 00:29
            29

            Антон, спасибо за дополнение. Но я вроде не указывал, что правило default policy обязательно нужно в начале…

            • 26 марта, 2014 at 00:30
              30

              Видимо, вас с толку сбила формулировка:

              в обязательном порядке:

              Сейчас переделаю чтобы было понятней, что я имел ввиду )

  15. Александр
    21 июля, 2013 at 18:14
    31

    Здравствуйте, Mc.Sim!
    Действительно очень хорошая статья – от простого к сложному.
    Хотел бы прочитать аналогичную статью по настройке netfilter для веб-сервера, такой, например, конфигурации:
    сетевая карта eth0 смотрит в локальную сеть провайдера, сетевая eth1 смотрит в домашнюю локальную сеть, где один desktop выходит в интернет через сервер. Сервер выходит в интернет через vpn на интерфейсе ppp0.
    Если аналогичная статья уже написана вами – дайте, пожалуйста, ссылку.
    С наилучшими пожеланиями, Александр.

    • 24 июля, 2013 at 10:11
      32

      Доброго времени, Александр.
      Специальной статьи по веб-серверу нет. В целом, настройка будет (в зависимости от того, каким образом желаете настроить “desktop выходит в интернет через сервер”) примерно такая (ключевые моменты):
      1. Разрешить входящие для 80 порта (iptables -A INPUT -i ppp0 -p TCP –dport 80 -j ACCEPT ) – это согласно абзаца “Предоставление доступа к сервисам на шлюзе”
      2. Включить форвардинг и разрешить трансляцию адресов в интернет – согласно абзацу “Настройка netfilter/iptables для подключения нескольких клиентов к одному соединению.”

  16. Арнур
    12 сентября, 2013 at 10:10
    33

    Добрый день, Mc.Sim !
    Можно ли будет прояснить следующий вопрос.
    Иммется eth0 (выход в Интернет) и eth1 (подключен кабелем к сетевой 2-го компа для rdp).

    Правила для eth0 настроены. eth1 не указан.

    Как правильно дополнить файл правилами для eth1.Достаточно ли добавить
    LAN_IP=”192.168.0.2″
    LAN_IP_RANGE=”192.168.0.0/16″
    LAN_IFACE=”eth1″
    $IPTABLES -A INPUT -p ALL -i $LAN_IFACE -s $LAN_IP_RANGE -j ACCEPT

    • 21 сентября, 2013 at 21:27
      34

      остались вопросы:
      1.

      eth1 (подключен кабелем к сетевой 2-го компа для rdp).

      напрямую подключен?
      2. что требуется от правил? Какая конечная задача?

  17. Арнур
    12 сентября, 2013 at 10:15
    35

    Дополнение
    адреса в локалке статические
    для 2-го компа выход в интернет не требуется.

  18. Серега
    30 октября, 2013 at 00:03
    36

    Стаття просто бомба! Очень понравилась, хорошо все усвоил)
    ;) ;)

  19. StereoRu
    11 ноября, 2013 at 13:08
    37

    Классная статья!
    Спасибо!

    Но вопрос, пытаюсь прикрутить защиту от спуффинга вида
    iptables -I INPUT 1 ! -i lo -m addrtype –src-type LOCAL -j DROP

    но пакеты с другой машины из scapy все равно пропускает!!!!
    команда в scapy:
    send(IP(dst=”10.10.111.55″,src=”127.0.0.1″)/UDP(dport=220))

    Помогите плз. я всю голову уже сломал!!!!

    • 28 ноября, 2013 at 13:04
      38

      Вижу, что на ЛОРе уже дали нужную рекомендацию )

  20. max
    5 декабря, 2013 at 08:55
    39

    Вопрос меня мучает такой так сказать сомнения. Есть у меня ppp0 привязанный к интерфейсу eth1 – вопрос что мне маскарадить для нат ppp0?

    • max
      5 декабря, 2013 at 14:30
      40

      имеется ввиду что маскарадить ppp0 или eth1? а то написал и сам читаю непойму что написал.

    • 6 декабря, 2013 at 11:31
      41

      Маскарадить тот интерфейс, которому присваивается шлюз по умолчанию, который используется для доступа в интернет.

      • max
        9 декабря, 2013 at 08:26
        42

        значит вариант такой: есть сервак(дебиан), eth0 – интерфейс связанный с внутренней локальной сетью (адрес допустим 192.168.1.9), второй интерфейс – eth1, на нём подымается бриджем ppp0 (так сказать выход во внешний мир интернет), для себя понимаю, что надо маскарадить пакеты для ppp0 (postrouting для этого соединения замаскарадить) чтобы внешний мир не видел моей локалки. Верно ли моё утверждение?

        • 12 декабря, 2013 at 13:25
          43

          Да, все верно.

  21. Maxim
    23 февраля, 2014 at 09:31
    44

    Такой вопрос, имеется правило
    -A PREROUTING -p tcp -m tcp –dport 443 -j REDIRECT –to-ports 3130
    https перенаправлять на squid, но некоторые сайты должны открываться напрямую, как сделать исключение??

    • 4 марта, 2014 at 13:48
      45

      Например: перед данным правилом добавить правило NAT с IP адресами сайтов, которые должны открываться напрямую.

      P.S. для информации, squid не понимает перенаправленный https.

      • Алексей
        24 ноября, 2014 at 15:12
        46

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

        P.S. Умеет! вроде SSLBump фича называется

        сам не пробывал но все идет к тому что придется и https заворачивать))

        • 18 декабря, 2014 at 15:15
          47

          Пожалуйста. Приходите еще!

  22. 25 февраля, 2014 at 13:30
    48

    Сохранение введенных правил при перезагрузке
    в Debian http://www.pivpav.ru/post/134 все проще оказывается…

    • 4 марта, 2014 at 13:53
      49

      Да, действительно. Спасибо.
      Это появилось только в 6 версии, поэтому я упустил данный пакет )

  23. Alexey
    4 июня, 2014 at 23:21
    50

    Отличная статья! все очень понятно написаною
    Большое спасибо!

  24. Дмитрий
    10 сентября, 2014 at 16:38
    51

    Максим, спасибо за эту и предыдущую статью про iptables. Стал яснее понимать принцип его работы.
    Есть моменты которые не совсем ясны. Если получиться разобраться – буду премного благодарен.
    Ситуация такая. Есть сеть. Маршрутизатор на Linux. Два выхода в Интернет. Получаем 3 интерфейса.
    auto eth0 # Локальная сеть
    iface eth0 inet static
    address 192.168.100.2
    netmask 255.255.255.0
    # gateway 192.168.100.250
    auto vlan102 # Основной Интернет. Подключение через модем
    iface vlan102 inet static
    vlan-raw-device eth0
    address 192.168.100.206
    netmask 255.255.255.0
    gateway 192.168.100.250
    auto vlan103 # Запасной канал Интернет.
    iface vlan103 inet static
    vlan-raw-device eth0
    address 79.x.y.70
    netmask 255.255.255.224
    # gateway 79.x.y.94

    Необходимо открыть порт 8081.
    В локальной сети открыт.
    telnet 192.168.100.2 8081 – OK
    Из внешней сети – закрыт.

    В iptables прописал правила в таблице filter
    -A INPUT -i vlan102 -p tcp -m tcp –dport 8081 -j ACCEPT
    -A INPUT -i vlan102 -p udp -m udp –dport 8081 -j ACCEPT
    Политики в этой таблице
    :INPUT DROP [0:0]
    :FORWARD DROP [0:0]
    :OUTPUT ACCEPT [2:184]

    Проброс порта 8081 на модеме-маршрутизаторе сделан с внешнего на IP vlan102

    Что упустил или вообще неправильно делаю? Подскажите.

    • 17 декабря, 2014 at 21:19
      52

      У вас не совсем корректная конфигурация.
      На Вашем месте, для локальной сети я бы выделил отдельный физический интерфейс и не мешал тегированный и нетегированный трафик в одном интерфейсе.
      Что касается настроек netfilter, то на первый взгляд все корректно.
      Посмотрите, работает ли сервис на интерфейсе vlan2 командой netstat.

  25. max
    24 сентября, 2014 at 22:25
    53

    Я написал так:

    netfilter:~# iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
    netfilter:~# iptables -A FORWARD -m conntrack --ctstate NEW -i eth1 -s 192.168.1.7/24 -j ACCEPT
    netfilter:~# iptables -A FORWARD -m conntrack --ctstate NEW -i eth1 -s 192.168.1.8/24 -j ACCEPT
    netfilter:~# iptables -A FORWARD -m conntrack --ctstate NEW -i eth1 -s 192.168.1.30/24 -j ACCEPT

    А при команде sudo iptables-save выводит что сохранится следующуе:

    -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    -A FORWARD -s 192.168.1.0/24 -i eth1 -m conntrack --ctstate NEW -j ACCEPT
    -A FORWARD -s 192.168.1.0/24 -i eth1 -m conntrack --ctstate NEW -j ACCEPT
    -A FORWARD -s 192.168.1.0/24 -i eth1 -m conntrack --ctstate NEW -j ACCEPT

    Весь сахар в том, что надо после добавления такого правила:iptables -P FORWARD DROP
    хочу чтоб определённые ip ходили в интернет, а вся подсеть не ходила, а iptables все перевел как 192.168.1.0/24, что делать чтоб открыть только определённые ip, а всей подсети закрыть доступ в net?

    • 17 декабря, 2014 at 23:56
      54

      ну вы же указываете подсеть 192.168.1.7/24
      укажите только хост 192.168.1.7/32

      • max
        18 декабря, 2014 at 18:16
        55

        укажите только хост 192.168.1.7/32

        а что значит на конце “/32”, по вашему просто надо указать 192.168.1.7 в моём случае?

        • 18 декабря, 2014 at 18:23
          56

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

          • max
            18 декабря, 2014 at 18:42
            57

            Я читал Ваши статьи, спасибо. Может что-то упустил. А вот без префикса /32 можно указывать ip или iptables сам допишет “что надо(или что не надо =) )” после указания ip/

            • 18 декабря, 2014 at 18:48
              58

              Да, указать просто IP адрес без маски будет корректно.
              Но я предпочитаю все же указывать маску.

              • max
                18 декабря, 2014 at 19:59
                59

                понял. спасибо за качественные знания и статьи!

              • 18 декабря, 2014 at 20:57
                60

                На здоровье )
                Буду рад видеть снова!

  26. Pavel
    11 октября, 2014 at 16:01
    61

    Добрый день.
    Статья действительно написано очень доходчиво даже для начинающих.
    Вот по ходу дела возник вопрос. Собираюсь заменить роутер Dlink dir 620 на шлюз собранный из попавшихся комплектующих. Мой провайдер проверяет клиентов по MAC адресу. В роутере есть функция клонирования MAC адреса. Поэтому с других устройств подключаюсь без проблем. Так вот собственно и вопрос: как средствами Iptables организовать клонирование MAC адреса?
    Заранее спасибо за ответ.

  27. max
    18 декабря, 2014 at 19:30
    63

    уважаемый Mc.Sim!
    Пользуясь Вашим появлением поле длительного отсутствия, хочу поинтересовать следующее дело. Касается оно трафик контрол из пакета нетфилтер. Я хочу фильтровать трафик на своём серваке для клиентов. Картина такая: eth1-локальная сеть, ppp0-интерфейс в интернет, на нём москарад. Фильтровать хочу с использованием iptables для маркировки пакетов и в последующем просеивать трафик контролем, с использованием (HTB), кого куда. Правила и фильтр на двух пользователей(192.168.1.7; 192.168.1.8):
    01
    01 tc qdisc del dev ppp0 root
    02 tc qdisc add dev ppp0 root handle 1 htb default 30
    03
    04 tc class add dev ppp0 parent 1: classid 1:1 htb rate 15Mbit ceil 15Mbit
    05
    06 tc class add dev ppp0 parent 1:1 classid 1:20 htb rate 5Mbit ceil 5Mbit prio 1
    07 tc class add dev ppp0 parent 1:1 classid 1:10 htb rate 8Mbit ceil 8Mbit prio 1
    08 tc class add dev ppp0 parent 1:1 classid 1:30 htb rate 512Kbit prio 2
    09
    10 tc qdisc add dev ppp0 parent 1:20 handle 120: sfq perturb 10
    11 tc qdisc add dev ppp0 parent 1:10 handle 110: sfq perturb 10
    12 tc qdisc add dev ppp0 parent 1:30 handle 130: sfq perturb 10
    13 tc filter add dev ppp0 parent 1:0 protocol ip prio 1 handle 0x10 fw classid 1:10
    14 tc filter add dev ppp0 parent 1:0 protocol ip prio 1 handle 0x20 fw classid 1:20
    15
    16 iptables -t mangle -A PREROUTING -s 192.168.1.7 -j MARK --set-mark 0x10
    17 iptables -t mangle -A PREROUTING -s 192.168.1.7 -j RETURN
    18 iptables -t mangle -A PREROUTING -s 192.168.1.8 -j MARK --set-mark 0x20
    19 iptables -t mangle -A PREROUTING -s 192.168.1.8 -j RETURN

    Здесь получается что ограничение исходящего трафика из локалки, а как ограничить приходящий(или исходящий) трафик с интернета(с интерфейса ppp0 в локалку). проскачила такая мысль на одном из ресурсов, что будет работать и в обратку если маркануть вот так:

    iptables -t mangle -A POSTROUTING -d 192.168.1.7 -j MARK --set-mark 0x10
    iptables -t mangle -A POSTROUTING -d 192.168.1.7 -j RETURN
    iptables -t mangle -A POSTROUTING -d 192.168.1.8 -j MARK --set-mark 0x20
    iptables -t mangle -A POSTROUTING -d 192.168.1.8 -j RETURN

    или всё таки придётся создавать виртуальный интерфейс,на него переправлять, и там уже резать в локалку трафик? Есть может способ по новаторней? прерыто ресурсов в интернете много, но там в основном задачи решались, когда за интерфейсом что-то есть(маршрутизатор к примеру) и нет NATa, получалось всё просто, а тут… и примера не нашлось.

    • 18 декабря, 2014 at 20:56
      64

      Теоретически, с точки зрения TCP\UDP ограничивать входящий трафик нет возможности.
      Можно этот трафик перенаправить на некий виртуальный интерфейс и сделать его тем самым условно исходящим. Хороший пример я видел на хабре.

      • max
        20 декабря, 2014 at 19:35
        65

        Хороший пример я видел на хабре.

        Спасибо, тоже его лицезрел как-то, но там задачка немного другая, он виртуальный интерфейс сделал чтобы организовать раздачу от двух провайдеров в локалку по потребности(то ли от первого брать, то ли от второго). Да и ppp0 у него нет. Вот тут вопрос такой: стоит ли мне вообще создавать виртуальный фейс,провайдер то один? Смотрю на этих ребят, может у меня также просто.

        • 20 декабря, 2014 at 21:42
          66

          Может. )
          А вообще, NATом интернет пользователям раздавать – дело неблагодарное. Хотя не мне вам советовать, как в вашей сети работать, но я бы порекомендовал использовать прокси.

          • max
            20 декабря, 2014 at 21:49
            67

            я бы порекомендовал использовать прокси.

            squid – вещь хорошая, но не умеет торрент через себя качать. А почему натом раздавать – не благодарное дело?

            • 20 декабря, 2014 at 22:12
              68

              Потому что нет контроля над пользователем. Отдав сетевой порт пользователю – он может с локалкой все что хочешь сделать.
              А если речь идет о домашней сети и доверенных пользователях, то можно ограничить и настройками торрент-клиента.

            • 20 декабря, 2014 at 22:17
              69

              А вообще, у меня вполне себе работал торрент через прокси при таких настройках:
              acl CONNECT method CONNECT
              acl torrent src 192.168.200.1
              acl torrent_dst_ports port 80
              acl torrent_dst_ports port 1024-65535
              http_access allow CONNECT torrent_src torrent_dst_ports

              • max
                20 декабря, 2014 at 22:28
                70

                Круто. Буду знать, а мне в своё время не удалось реализовать, а так было надо! Но у меня задача не стоит тотально контролировать, а нужно деление скорости основного канала интернета, а также распределение трафика между участниками в случае, если кто-то канал свой не использует. За пример конфига сквиду, отдельное спасибо. Буду пробовать в использовании.

  28. Темный
    21 декабря, 2014 at 00:28
    71

    У тебя еще один баг в статье (или я чего-то не понял):
    в методе сохранения ты создаешь файл в каталоге /etc/network/if-up.d/, а права на исполнение даешь на файл в другом каталоге
    # chmod +x /etc/network/if-pre-up.d/firewall

    • 8 апреля, 2015 at 20:17
      72

      Да, спасибо.
      Поправил.

  29. Stoner
    10 февраля, 2015 at 00:52
    73

    Здравствуйте. Есть проблема с пробросом портов в виртуальную машину KVM.
    Внешний адрес сервера – 1.2.3.4, адрес гостевой системы – 192.168.2.102
    Выполняю проброс:
    iptables -t nat -A PREROUTING -p tcp -d 1.2.3.4 –dport 33333 -j DNAT –to-destination 192.168.2.102
    iptables -A FORWARD -i eth0 -p tcp -d 192.168.2.102 –dport 80 -j ACCEPT
    При переходе в браузере на адрес 1.2.3.4:33333 – тишина. Лишь однажды после длительного ожидания браузер выгрузил искомую веб-морду, но явно недогрузившуюся.
    Вывод iptables -t nat -L POSTROUTING:
    :MASQUERADE all — 192.168.2.0/24 !192.168.2.0/24:
    Если я правильно понимаю, KVM при создании интерфейса virbr1 добавляет правило маскарадинга в iptables. Тем не менее, что-то не так. Не подскажете, в чём может быть проблема? Ёщё один существенный нюанс: это хенд-мейд хостинг с множеством запущенных python-скриптов. К сожалению, документации на всё это нет и мне непонятно, искать проблему в iptables или же разбираться в коде.

  30. Stoner
    10 февраля, 2015 at 17:20
    74

    Whoops!.. Узрел правило REJECT в оба направления для виртуального интерфейса. Видимо, было автоматически добавлено при поднятии virbr1. Прошу прощения, можете удалить мой комментарий. Вот так всегда, стоит попросить о помощи и осеняет)

    • 7 июня, 2015 at 15:02
      75

      Да, иногда очень важно описать на бумаге\форуме свою проблему досконально и начинаешь видеть источник ошибки.

  31. Yanis
    12 февраля, 2015 at 03:01
    76

    Mc.Sim Спасибо, что занимаетесь просвещением в столь необходимой области. Позволю себе небольшое дополнение к вашей статье. Поскольку на eth0 IP статический, лучше правило
    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    заменить на
    iptables -t nat -A POSTROUTING -o eth0 -j SNAT –to-source 198.166.0.200
    Если IP на eth0 динамический, то, конечно, MASQUERADE.

    Возможно ли от вас получить статью. “Два шлюза – одна локальная сеть”. Об этом много написано, но хотелось бы все в одном месте увидеть. Например eth0 – Провайдер A IP статический, eth1 – Провайдер B IP статический, eth2 – Локальная сеть IP 192.168.1.0/24. Провайдер А – основной, если пропадает ping (например на 8.8.8.8), то автоматом переключаемся на другой шлюз, провайдер В (резервный), ping появился – вернулись на первый шлюз.
    Это легко делается на DLinke DFL-210(260)используя DMZ как второй WAN, или DFL 860, где два WANa, но хотелось бы это сделать под Linux. DLink нынче денег стоят!
    Еще раз спасибо.

    • 7 июня, 2015 at 19:54
      77

      Спасибо за дополнение. Статью подправил.
      По поводу новой статьи – добавил в планы, но о сроках говорить не могу )

  32. dolboeb
    19 апреля, 2015 at 15:40
    78

    Доброго! Хороший материал, которого не хватало мну в своё время.
    Есть вопрос:
    Как с помощью iptables закрыть порт 555 для всех ip и открыть для определенных ip?
    у меня iptables v1.4.21 (на домашнем роутере rtn16)

    по умолчанию закрывать всё для всех (iptables -P INPUT DROP) не нужно, интересует именно то, что в вопросе – закрыть порт 555 для всех ip и открыть для определенных ip.

    если я сделаю
    iptables -I INPUT ! -s 1.2.3.4 -p tcp –dport 555 -j REJECT –reject-with tcp-reset
    то все работает как надо, но (!) только для одного ip
    если после правила выше я сделаю
    iptables -I INPUT ! -s 1.2.3.5 -p tcp –dport 555 -j REJECT –reject-with tcp-reset
    то актуальным будет последнее правило, т.е. для ip 1.2.3.5

    собственно повторю вопрос еще раз – как сделать для нескольких ip такое правило?

    по материалам инета, люди пишут, что “Начиная с версии iptables 1.4.6, в одном параметре -s можно указывать более одного адреса, разделяя адреса запятой. При этом для каждого адреса будет добавлено отдельное правило.”, но у меня “старая” версия iptables.

    т.е. iptables v1.4.21: ! not allowed with multiple source or destination IP addresses

    Заранеее благодарен!

    • 7 июня, 2015 at 22:38
      79

      предлагаю разместить правила в таком порядке:
      iptables -I INPUT -s 1.2.3.4 -p tcp —dport 555 -j ACCEPT
      iptables -I INPUT -s 1.2.3.5 -p tcp —dport 555 -j ACCEPT
      iptables -I INPUT -p tcp —dport 555 -j REJECT —reject-with tcp-reset

  33. FraGjSM
    7 ноября, 2015 at 23:09
    80

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

    • 24 июля, 2016 at 15:17
      81

      FraGjSM, я не понял Вашего вопроса. Что именно начинать?

    • max
      29 июля, 2016 at 22:16
      82

      откуда начинать куда идти

      FraGjSM, иди учи документацию netfilter и iptables, а здесь расписан уже практический совет как настроить для того или иного случая. Также могут помочь с реализацией под твою конкретную задачу, но мать часть, хотя бы основы, надо знать иначе ничего не поймёшь.

  34. Влад
    26 апреля, 2016 at 19:44
    83

    Здравствуйте! Такой вопрос, у меня работает apache и расшаривает папку folder (для примера). Чтобы в неё попасть из интернета, нужно набрать http://ip_address/folder, т.е. нужо знать точное название. Я хочу сделать следующее, чтоб каждый не дергал мой сервер (хакеры там и прочие любопытные), создаю такое правило:
    iptables -P INPUT DROP
    iptables -A INPUT -p tcp -m tcp --dport 80 -m string --string "GET /folder" --algo kmp --to 1024 -m recent --set
    iptables -A INPUT -p tcp -m tcp --dport 80 -m recent --update -j ACCEPT

    но оно не срабатывает, а срабатывает DROP. Не пойму почему?

    • 4 августа, 2016 at 21:35
      84

      Мне кажется, пример съехал. Можете на pastebin выложить?

  35. hrustbb
    21 июля, 2016 at 18:39
    85

    Добрый день Mc.Sim, а как можно переадресовать исходящий на определенный ip с опредленного порта удп трафик на 127.0.0.1:какой-нибудь порт, при этом остальной трафик блокировать.
    Очень нужна помощь, готов заплатить.

    • 17 мая, 2018 at 08:46
      86

      hrustbb, не прошло и 2х лет, как я добрался до комментариев на блоге )
      Актуален ли еще данный вопрос?
      Если актуален, то необходимо понимать, откуда исходит данный трафик?
      От локальных сервисов или это трафик транзитный?

  36. Retrokun
    8 ноября, 2016 at 22:44
    87

    Я тут сильно заигрался с линуксом о потер файлы в своей домашней директории, в том числе и файл с правилами фаерволла. Благодоря вашей статье почти все востановил, а то за окном вечереет и решил доделать завтра. Т.к это мой старенький ноут – а не важный сервер :-D
    Спасибо тебе

  37. Андрей
    17 февраля, 2017 at 09:49
    88

    Очень давно от вас не было статей. Если есть время и желание, может быть возобновите написание ?

    А по теме, вот возник вопрос при настройке Samba сервера. Корректные ли эти правила и оптимальны ли они при политике OUTPUT ACCEPT:
    $IPT -A INPUT -i eth1 -p udp -m multiport \
    –dports 137,138 -j ACCEPT
    $IPT -A INPUT -i eth1 -p tcp -m multiport \
    –dports 139,445 -m conntrack –ctstate NEW,ESTABLISHED -j ACCEPT

    • 9 февраля, 2019 at 13:22
      89

      Со временем туго. Желание, конечно, есть. На комментарии вот отвечаю 2 года спустя )
      Да, правила выглядят правильно.

  38. Андрей
    11 марта, 2017 at 09:01
    90

    Добрый день!
    у как быть если есть основной шлюз в интернет (сетевая 1), а вторая сетевая карта шлюз в закрытую сеть ?
    тоесть: eth0: 192.168.55.10/24 gateway 192.168.55.1 (интернет)
    eth1: 10.29.7.10 (ip адрес в закрытой сети)
    static gateway 10.2.2.0 255.255.255.255.192 10.29.7.1 (маршрут до сети 10.2.2.0)
    eth3: 192.168.0.100/24 локальная сеть
    Спасибо!

    • 9 февраля, 2019 at 13:36
      91

      Если ваш сервер не маршрутизирует трафик между этими сетями, то просто пишете правила iptables и указываете имя интерфейса, например:
      -A INPUT -i eth0
      -A OUTPUT -o eth0

      Если трафик маршрутизируется, то для задания правил используете цепочку FORWARD.
      В первой статье по iptables об этом много написано: https://www.k-max.name/linux/netfilter-iptables-v-linux/

  39. Денис
    24 августа, 2017 at 16:28
    92

    Добрый день, подскажите как сделать на шлюзе убунту следующее: на один интерфейс поступает интернет, со второго интерфейса точки доступа Микротик раздают инет по вайфай. Мне нужно с внешнего интерфейса иметь доступ к микротикам через винбокс. ip адресов микротики не имеют винбокс бегает по порту 8291

    • 9 февраля, 2019 at 23:30
      93

      С микротиками работать не приходилось, но попробую пованговать… )
      Винбокс где установлен? НА этой же машине, куда подключен и интернет и микротики?
      Что из себя представляет винбокс? Если это служба, которая работает на порту 8291, то нужно разрешить обращение к этому порту из интернета, по аналогии как написано в статье.

  40. Lexa
    26 сентября, 2017 at 08:27
    94

    Привет.
    Очень хорошая и подробная статья, но я не нашёл для себя решения на поставленную мне задачу. Не могли бы мне помочь разобраться как сделать фильтрацию ПК по мак адресу на сервере Ubunta.Что бы ПК выходили в инет через сервер только с разрешенными мак адресами.
    Заранее спасибо!

    • 9 февраля, 2019 at 23:41
      95

      Вот Вам пример правила для размышления )
      -A FORWARD -m mac --mac-source 50:8F:4C:52:E3:XX -m comment --comment android-xiaomi -j ACCEPT

  41. Влад
    31 декабря, 2017 at 18:52
    96

    Приветствую!
    Есть маршрутизатор на Ubuntu Server 16.04 LTS, обслуживает локальную сеть 192.168.2.0/24. Основной интернет получаю через PPPoE соединение. К этому маршрутизатору я дополнительно подключаю 3G модем ZTE MF667, который в Ubuntu виден как ещё одна сетевая карта. На этом модеме есть свой dhcp (и видимо dns) сервер, который имеет ip 192.168.0.1 (его можно менять из веб интерфейса модема). Подключаюсь (пока временно) к модему через консоль командой dhclient -v enx, где enx сетевой интерфейс этого модема. Клиент dhclient получает ip 192.168.0.20. Задача, нужно чтоб локальная сеть 192.168.2.0/24 получала интернет и от этого модема, но не весь, а только для определённых сайтов. Основным каналом для получение интернета по прежнему будет PPPoE. Мне не нужно ничего агрегатировать, балансировать и т.п. Т.е. допустим мне нужно на клиенте в локальной сети открыть страницу google.ru через этот модем, другие страницы должны получать доступ исключительно через PPPoE. Сейчас у меня из локальной сети (192.168.2.0/24) есть доступ только к веб интерфейсу (192.168.0.1) этого модема. На клиентах (очень) желательно ничего не прописывать. Через iptables можно что-то сделать?

    • 10 февраля, 2019 at 10:43
      97

      Добрый день, Влад.
      Нужно больше исходных данных )
      Если речь идет только о веб-серфинге, вернее, о том, что можно проксировать, то в данном случае, лучше использовать squid или другой прокси.
      Если мы говорим, что нам нужно определенные подсети направлять в разное место, то нужна маршрутизация (iproute и policy based routing).

  42. Knyaz
    4 июня, 2018 at 10:27
    98

    Добрый день Mc.Sim, есть задача заворачивать DNS трафик с определенного устройства в домашней сети на роутере. Я сделал 2 варианта но не один не работает как нужно, может подскажете где я накосячил?
    Первый вариант:
    iptables -t nat -I PREROUTING -p udp -m udp –dport 53 -m mac –mac-source xx:xx:xx:xx:xx:xx -j DNAT –to-destination 192.168.1.1:5354
    Второй вариант:
    iptables -t nat -I PREROUTING -p udp –dport 53 -m mac –mac-source xx:xx:xx:xx:xx:xx -j REDIRECT –to-port 5354
    Думаю второй вариант ближе к истине, но не работает. По статистике вижу что правила выполняются, но DNS на машине тот что оп дефолту, а не тот что должен… Как можно отследить трафик (отладить) iptables?

    • 10 февраля, 2019 at 13:21
      99

      тут tcpdump вам в помощь.
      И еще можно перед и после введенных правил добавить правило с логированием пакета -j LOG.
      Думаю, что если делать DNAT, я не уверен что conntrack корректно отработает обратное соединение.

  43. Alexander
    22 августа, 2018 at 12:29
    100

    Приветствую!
    Великолепная статья, читаю по пятому разу и нахожу что-то новое.
    Скажите, как можно было бы снять дамп приходящего на iptables трафика.
    Спасибо!

    • 10 февраля, 2019 at 22:59
      101

      Если не вдаваться в подробности, то можно считать, что tcpdump собирает трафик ДО обработки iptables.
      Для диагностики iptables можно использовать -j LOG.
      Тогда все обрабатываемые пакеты, которые попадут под это правило будут записаны в syslog.

      • Alexander
        11 февраля, 2019 at 12:40
        102

        Спасибо!

      • p25wh
        26 февраля, 2023 at 18:08
        103

        Действие LOG хорошо позволяет диагностировать проблемы,но можно и вообще удалить syslog daemon и все будет писаться в dmesg

  44. Andrey
    20 марта, 2022 at 19:47
    104

    Автор, благодарю! *THUMBS UP*

  45. aleksey
    19 сентября, 2022 at 14:00
    105

    Здравствуйте. Не получается настроить таблицу filter iptables так, чтобы сеансы / обмен пакетами, исходящие от виртуальной машины 1 (в качестве источника), были успешными; с другой стороны, сеансы / обмен пакетами, исходящие с удалённого компьютера на виртуальную машину 1 (в качестве получателя), не были успешными.
    пробовал и не пингуется:
    iptables -P INPUT DROP
    iptables -P OUTPUT DROP
    iptables -A OUTPUT -d 192.168.1.72 -j ACCEPT
    iptables -A OUTPUT -j DROP
    попробовал хотя бы один адрес пингануть-ничего. 192.168.1.72 -это другая машина в той же сети. может я и сам задание не так понял. разные варианты пробовал, где-то вообще всё пингуется, а мне надо чтобы только от меня (но с icmp это не связано). может с протоколами как-то разрулить.
    Помогите пожалуйста.

Написать комментарий