Сетевые средства Linux

Межсетевое экранирование в Linux

Показывать лекцию целиком

Содержание

  • Общие сведение о подсистеме netfilter
  • Управление правилами iptables
  • Взаимодействие правил и цепочек iptables
  • Общие сведение о подсистеме netfilter

    Подсистема netfilter представляет собой средство пакетной фильтрации в ядре Linux (начиная с версии 2.4) . Утилита iptables используется для управления netfilter.

    Примечание: Netfilter/iptables кроме создание межсетевых экранов на основе пакетной фильтрации (в том числе и с учетом состояния соединения), также позволяет реализовать различные сложные схемы манипуляции сетевыми пакетами, в частности трансляцию сетевых адресов (NAT) для разделяемого доступа в Интернет и организации прозрачных прокси (см. ).

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

    Существует пять типов стандартных цепочек, встроенных в систему :

  • PREROUTING — для изначальной обработки входящих пакетов
  • INPUT — для входящих пакетов, адресованных непосредственно локальному компьютеру
  • FORWARD — для проходящих (маршрутизируемых) пакетов
  • OUTPUT — для пакетов, создаваемых локальным компьютером
  • POSTROUTING — для окончательной обработки исходящих пакетов
  • Цепочки организованы в четыре таблицы :

  • raw — просматривается до передачи пакета системе определения состояний. Содержится в цепочках PREROUTING и OUTPUT.
  • mangle — содержит правила модификации заголовка IP?пакетов. Среди прочего, поддерживает изменения полей TTL и TOS, и маркеров пакета. Содержится во всех стандартных цепочках.
  • nat — используется для трансляции сетевых адресов. Содержится в цепочках PREROUTING, OUTPUT, и POSTROUTING.
  • filter — основная таблица, предназначенная для фильтрации сетевых пакетов; используется по умолчанию если название таблицы не указано. Содержится в цепочках INPUT, FORWARD, и OUTPUT.
  • (рис 11.1) Прохождение пакета в подсистеме netfilter (взято из wikipedia.org)

    Следует отметить, что одноименные таблицы каждой цепочки независимы.

    Входящий пакет (рис 11.1) начинает обрабатываться с цепочки PREROUTING в таблицах raw, conntrack (определение состояний) и mangle. Затем он обрабатывается правилами таблицы nat данной цепочки. На этом этапе проверяется, необходима ли модификация адреса получателя пакета ( DNAT ). Важно сменить адрес получателя на данном этапе, так как маршрут пакета определяется сразу после того, как он покинет цепочку PREROUTING.

    Далее возможны два варианта:

  • Если целью пакета является этот компьютер, то пакет будет отправлен в цепочку INPUT ; после маршрутизации, он обрабатывается правилами цепочек INPUT. В случае прохождения цепочек пакет передается приложению.
  • Если целью пакета является другой компьютер, то пакет фильтруется правилами цепочки FORWARD таблиц mangle и filter, а затем к нему применяются правила цепочки POSTROUTING. На данном этапе можно использовать SNAT/MASQUERADE (подмена источника/маскировка). После этих действий пакет будет отправлен в сеть.
  • Третий вариант - когда приложение на компьютере, отвечает на запрос или отправляет собственный пакет, то он обрабатывается цепочкой OUTPUT таблиц raw, conntrack и filter. Затем к нему применяются правила цепочки OUTPUT таблицы nat, для определения, требуется ли использовать DNAT (модификация адреса получателя), пакет фильтруется цепочкой OUTPUT таблицы filter и выпускается в цепочку POSTROUTING. В случае успешного прохождения POSTROUTING пакет выходит в сеть.

    Непосредственно для фильтрации используются таблицы filter. Поэтому в рамках данной темы важно понимать, что для фильтрации пакетов, предназначенных данному узлу необходимо модифицировать таблицу filter цепочки INPUT, для проходящих пакетов — цепочки FORWARD, для пакетов, созданных данным узломOUTPUT.

    Управление правилами iptables

    Команда iptables позволяет редактировать правила таблиц netfilter. Каждое правило представляет собой запись, содержащую в себе параметры отбора (критерии), определяющие, подпадает ли пакет под данное правило, и действие, которое необходимо выполнить в случае соответствия параметрам отбора .

    В общем виде правила записываются в виде:

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

    По умолчанию используется таблица filter, если же необходимо указать другую таблицу, то следует использовать спецификатор -t с указанием имени таблицы. После имени таблицы указывается команда, определяющая действие: вставить правило, или добавить правило в конец цепочки, или удалить правило и т. п. Match задает параметры отбора. Target указывает, какое действие должно быть выполнено при условии выполнения критериев в правиле: передать пакет в другую цепочку правил, "сбросить" пакет, выдать на источник сообщение об ошибке и т. п.

    Примечание: для работы с iptables требуются права суперпользователя.

    Для просмотра существующих правил, команда iptables используется с ключом -L. Так, для просмотра всех цепочек таблицы filter ( -v — для более детального отображения):

    # iptables -L -v
    Примечание: Далее по тексту данной темы, если не названа таблица, то имеется в виду таблица filter.

    Для просмотра цепочки FORWARD нужно указать имя цепочки:

    # iptables -v -L FORWARD

    Сбросить все правила (-F) и удалить определенные пользователем цепочки (-X):

    # iptables -F
    # iptables -X

    Для добавления правила в цепочку используется ключ -A. Например, чтобы добавить правило в цепочку POSTROUTING таблицы nat:

    # iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

    Для того, чтобы добавить правило в цепочку FORWARD:

    # iptables -A FORWARD -i eth0 --destination 192.168.1.0/24  -j ACCEPT

    Ниже в виде таблицы приведены основные параметры отбора пакетов :

    ПараметрОписаниеПример
    --protocol (сокращено -p ) Определяет протокол. Опции tcp, udp, icmp, или любой другой протокол определенный в /etc/protocols iptables -A INPUT -p tcp
    --source (-s) IP адрес источника пакета. Может быть определен несколькими путями.
  • Одиночный хост: host.domain.tld, или IP адрес: 10.10.10.3
  • Пул-адресов (подсеть): 10.10.10.3/24 или 10.10.10.3/255.255.255.0
  • iptables -A INPUT -s 10.10.10.3
    --destination (-d) IP адрес назначения пакета. Может быть определен несколькими путями - смотри — source iptables -A INPUT --destination 192.168.1.0/24
    --source-port (--sport) Порт источник, возможно только для протоколов — protocol tcp, или — protocol udp iptables -A INPUT --protocol tcp --source-port 25
    --destination-port (--dport) Порт назначения, возможно только для протоколов — protocol tcp, или — protocol udp iptables -A INPUT --protocol udp --destination-port 67
    --state

    Состояние соединения. Доступно, если модуль 'state' загружен с помощью '-m state'. Доступные опции:

    NEW (Все пакеты устанавливающие новое соединение)

    ESTABLISHED (Все пакеты, принадлежащие установленному соединению)

    RELATED (Пакеты, не принадлежащие установленному соединению, но связанные с ним. Например - FTP в активном режиме использует разные соединения для передачи данных. Эти соединения связаны.)

    INVALID (Пакеты, которые не могут быть по тем или иным причинам идентифицированы. Например, ICMP ошибки не принадлежащие существующим соединениям)

    iptables -A INPUT -m state --state NEW,ESTABLISHED
    --in-interface (сокращенно -i ) Определяет интерфейс, на который прибыл пакет. Полезно для NAT и машин с несколькими сетевыми интерфейсами iptables -t nat -A PREROUTING --in-interface eth0
    --out-interface (сокращенно -o ) Определяет интерфейс, с которого уйдет пакет. Полезно для NAT и машин с несколькими сетевыми интерфейсами iptables -t nat -A POSTROUTING --out-interface eth1
    --tcp-flags Определяет TCP флаги пакета. Содержит 2 параметра: Список флагов которые следует проверить и список флагов которые должны быть установлены
    --syn Сокращение для ‘--tcp-flags SYN,RST,ACK SYN. Поскольку проверяет TCP флаги, используется с — protocol tcp. В примере показан фильтр для пакетов с флагом NEW, но без флага SYN. Обычно такие пакеты должны быть выброшены ( DROP ). iptables -A INPUT --protocol tcp ! --syn -m state --state NEW

    Действие, которое система выполнит, если пакет в одной из цепочек удовлетворяет условию, устанавливается с помощью ключа -j (--jump). Можно также передать пакет в другую цепочку.

    Стандартные действия:

  • -ACCEPT - пакет покидает данную цепочку и передается в следующую.
  • -DROP - отбросить удовлетворяющий условию пакет.
  • -REJECT - отбросить пакет, отправив отправителю ICMP-сообщение.
  • -LOG - протоколировать пакет.
  • -RETURN - возвратить пакет в предыдущую цепочку.
  • -SNAT - применить трансляцию адреса источника в пакете. Может использоваться только в цепочках POSTROUTING и OUTPUT таблицы nat.
  • -DNAT - применить трансляцию адреса назначения в пакете. Может использоваться только в цепочке POSTROUTING таблицы nat.
  • -MASQUERADE — используется вместо SNAT при наличии соединения с динамическим IP.
  • -MARK — используется для установки меток на пакеты.
  • # iptables -A input -p tcp -s 192.168.0.0/16 --dport 80 -j ACCEPT
    # iptables -A FORWARD -s 192.168.1.0/24 -d 192.168.9.9 -j DROP

    Взаимодействие правил и цепочек

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

    Для того, чтобы установить запрещающую политику (уничтожения без сообщения адресату) для проходящих пакетов, не удовлетворяющих ни одному правилу нужно использовать iptables с ключом -P c указанием цепочки и действия:

    # iptables -P FORWARD DROP
    # iptables -L FORWARD
    Chain FORWARD (policy DROP)
    target     prot opt source               destination
    команда фактически устанавливает запрещающую политику по умолчанию только в таблице filter цепочки FORWARD. В таблице mangle данной цепочки политика по умолчанию не изменилась:
    # iptables -t mangle -L FORWARD
    Chain FORWARD (policy ACCEPT)
    target     prot opt source

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

    При добавлении правил iptables следует учитывать то, что их порядок в цепочке имеет значение (). Чтобы вставить правило в произвольное место существующей цепочки, укажите ключ -I, затем название этой цепочки и позицию (1,2,3,...,n), в которой должно располагаться правило.

    Пусть существует разрешительная политика по умолчанию для входящего локального трафика и запретительное правило на доступ к локальному HTTP-серверу из сети 192.168.0.0/16:

    # iptables -L INPUT -v
    Chain INPUT (policy ACCEPT 7 packets, 508 bytes)
     pkts bytes target     prot opt in     out     source               destination         
        0     0 DROP       tcp  --  any    any     192.168.0.0/16       anywhere            tcp dpt:www

    Для того, чтобы сделать исключение для узла 192.168.1.5 (входящему в сеть 192.168.0.0/16), соответствующее разрешительное правило, должно быть достижимо, поэтому его необходимо разместить перед запретительным:

    # iptables -I INPUT 1 -p tcp -s 192.168.1.5 --dport 80 -j ACCEPT
    # iptables -L INPUT -v
    Chain INPUT (policy ACCEPT 7 packets, 508 bytes)
     pkts bytes target     prot opt in     out     source               destination         
        0     0 ACCEPT     tcp  --  any    any     192.168.1.5          anywhere            tcp dpt:www 
        0     0 DROP       tcp  --  any    any     192.168.0.0/16       anywhere            tcp dpt:www

    Возможность сетевого взаимодействия с участием данного узла или узлов, трафик которых проходит через данный узел, определяется действием на сетевые пакеты всех цепочек, через которые они проходят ( Пример 11.5).

    Для того, чтобы обеспечить доступ узла 192.168.1.5 к локальному HTTP-серверу при запретительной политики по умолчанию цепочек INPUT и OUTPUT, соответствующие разрешительные правила необходимо добавить как в цепочку INPUT, так и в цепочку OUTPUT:

    # iptables -A INPUT -p tcp -s 192.168.1.5 --dport 80 -j ACCEPT
    # iptables -A OUTPUT -p tcp -d 192.168.1.5 -j ACCEPT
    # iptables -L INPUT -v
    Chain INPUT (policy DROP 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination         
     4         336   ACCEPT     all  --  lo     any     anywhere             anywhere            
     1536  123K ACCEPT     all  --  any    any     192.168.56.1         anywhere            
        0     0       ACCEPT     tcp  --  any    any     192.168.1.5          anywhere            tcp dpt:www 
    # iptables -L OUTPUT -v
    Chain OUTPUT (policy DROP 8 packets, 564 bytes)
     pkts bytes target     prot opt in     out     source               destination         
        4       336 ACCEPT     all  --  any    lo      anywhere             anywhere            
     1050  106K ACCEPT     all  --  any    any     anywhere             192.168.56.1        
        0           0 ACCEPT     all  --  any    any     anywhere             192.168.1.5
    Примечание: При запретительной политике по умолчанию для цепочек INPUT и OUTPUT необходимо разрешить трафик интерфейса loopback (lo):
    # iptables -A OUTPUT -o lo -j ACCEPT
    # iptables -A INPUT -i lo -j ACCEPT

    Краткие итоги

  • Подсистема netfilter, входящая в состав ядра Linux, используется для фильтрации сетевых пакетов, а также для реализации сложных схем манипуляции сетевыми пакетами, в т.ч. трансляции сетевых адресов ( NAT ). Для управления netfilter используется утилита iptables.
  • Сетевые пакеты в подсистеме netfilter проходят последовательность цепочек ( chain ). Каждая цепочка включает заданный набор таблиц, содержащих упорядоченные списки правил. Каждое правило содержит параметры выбора и выполняемое действие при соответствии содержимого пакета параметрам.
  • Для фильтрации пакетов, предназначенных данному узлу используются правила таблицы filter цепочки INPUT, для проходящих пакетов — цепочки FORWARD, для пакетов, созданных данным узлом — OUTPUT.
  • Для каждой цепочки задается политика для пакетов, не удовлетворяющих ни одному правилу цепочки. При добавлении правил iptables следует учитывать то, что их порядок в цепочке имеет значение. Возможность сетевого взаимодействия с участием данного узла или узлов, трафик которых проходит через данный узел, определяется действием на сетевые пакеты всех цепочек, через которые они проходят.
  • Упражнения

    Используя стенд на основе VirtaulBox, описанный в упражнении "Маршрутизация в Linux", настроить фильтрацию трафика на маршрутизаторе:

  • Разрешить IP-трафик от сети 192.168.0.0/24 к маршрутизатору на интерфейсе eth1 ; весь остальной входящий трафик маршрутизатора на интерфейсе eth1 запретить.
  • Разрешить проходящий IP-трафик для сети 192.168.0.0/24; проходящий трафик других сетей запретить.
  • Запретить ICMP-трафик от сети 192.168.0.0/24 к сети 192.168.9.0/24.
  • Запретить проходящий IP-трафик от сети 192.168.0.0/24 к сети 192.168.10.0/24.
  • Запретить IP-трафик от сети 192.168.0.0/24 к узлу 192.168.11.11
  • 1.Реализовать п. 1 ( основная ВМ ):

    # iptables -P INPUT DROP
    # iptables -A INPUT -i lo -p all -j ACCEPT
    # iptables -A INPUT -i eth1 --source 192.168.0.0/24 -j ACCEPT

    2.Реализовать п. 2:

    # iptables -P FORWARD DROP
    # iptables -A FORWARD -i eth1 --source 192.168.0.0/24 -j ACCEPT
    # iptables -A FORWARD -i eth2 --destination 192.168.0.0/24 -j ACCEPT
    # iptables -A FORWARD -i eth3 --destination 192.168.0.0/24 -j ACCEPT

    3.Реализовать п. 3.

    # iptables -I FORWARD 1 -i eth1 --source 192.168.0.0/24 --destination
       192.168.9.0/24 --protocol icmp -j DROP

    4.Реализовать пп. 4 и 5. самостоятельно.

    Вернуться к учебному плану