15. Настройка сервера шлюза

Для настройки Calculate Directory Server в качестве шлюза используется Shorewall. Shorewall или более точно Shoreline Firewall — инструмент для настройки файрвола (межсетевого экрана). Технически является надстройкой над подсистемой Netfilter (iptables/ipchains) ядра Linux и обеспечивает упрощённые методы конфигурирования данной подсистемы. Он предоставляет более высокий уровень абстракции для описания правил работы файрвола.

Программа не является демоном, то есть не работает постоянно. Правила хранятся в текстовых файлах, при запуске shorewall считывает свои файлы конфигурации и преобразует их в настройки понятные ipchains/iptables, после чего данные настройки файрвола могут дейстовать до перезапуска операционной системы.

Используемый программный пакет

net-firewall/shorewall

Для включения примеров и документации необходимо собрать пакет с USE флагом "doc".

Программные пакеты расширяющие функционал

  • net-firewall/xtables-addons - расширения не добавленные в kernel/iptables (для определения p2p трафика)
  • net-misc/l7-filter-userspace - классификация пакетов по содержимому (для определения трафика по содержимому)
  • net-misc/linux-igd - для добавления функционала UPnP

Настройки файрвола

  • Зоны

Shorewall видит сеть, в которой он работает, как состоящую из набора зон (zones). Поэтому настройка начинается с определения одной или нескольких зон в файле /etc/shorewall/zones. Зоны представляют собой отдельные ip адреса хостов, подсети, или входящие/исходящие пакеты для конкретного интерфейса. Они могут относиться к внешней сети, внутренней сети и DMZ.

  • Интерфейсы

Зоны распознаются либо по подключенному к ним сетевому интерфейсу, определенному в файле /etc/shorewall/interfaces, либо по IP-адресу подсети, указанному в файле /etc/shorewall/hosts. У одной зоны может быть несколько интерфейсов, а у одного интерфейса – несколько зон. Заметим, что Shorewall рассматривает систему файервола как свою собственную зону.

  • Действия

Определив зоны, нужно задать действие по умолчанию в файле /etc/shorewall/policy (например, ACCEPT или DROP), применяемую к трафику между каждой исходной зоной и зоной назначения.

  • Политики

Наконец, в файле /etc/shorewall/rules определяются подробности исключений из политики, разрешающие доступ к заданным портам и т.д.

Объявление зон

Объявление зон производится в файле /etc/shorewall/zones. Для того, чтобы объявить зону необходимо ее название (ZONE) и ее тип (TYPE) (firewall зона файрвола, ipv4 - стандартная зона).

Порядок описания зон важен, так как именно в таком порядке будут вызываться цепочки iptables, проверяющие пакеты направленный из одной зоны в другую. То есть если поступает пакет адресованный файерволу, то в соответствии с вышеописанным примером пакет вначале проверяется на принадлежность зоне net, а затем уже зоне loc. Это правило является важным если одна из зон включает в себя другую. Например в зоне loc можно создать зону phone, которая представляет собой несколько ip адресов из зоны loc. Таким образом если вначале описать зону loc, а затем phone, то получится, что политика описанная для зоны phone никогда не будет выполняться, так как трафик будет попадать в цепочки для loc. Данная проблема может быть решена указанием зоны phone как подзоны loc (phone:loc ipv4).

Пример настройки c двумя сетевыми картами:
  • сам маршрутизатор (fw) обозначается как firewall
  • интернет (net) использует ipv4
  • локальная сеть (loc) использует ipv4
###############################################################################
#ZONE   TYPE            OPTIONS         IN                      OUT                    
#                                       OPTIONS                 OPTIONS
fw      firewall
net     ipv4
loc     ipv4

Более подробно о настройке этого файла можно прочитать, выполнив man shorewall-zones.

Связывание интерфейса с определенной зоной

Для связывания интерфейса с определенный зоной используется файл /etc/shorewall/interfaces, так же в этом файле можно указать какими фильтрами будут обрабатываться входящие пакеты.

Чтобы назначить интерфейс для определенной зоны, необходимо указать название этой зоны (ZONE), сам интерфейса (INTERFACE), широковещательный адрес (BROADCAST) (рекомендуется указать detect), а также при необходимости перечислить фильтры (OPTIONS).

Пример с двумя сетевыми картами:

В файле указываем, что eth0 выходит в интернет (net), eth1 в локальную сеть (loc). tcpflags, routefilter, nosmurfs, logmartians - применяем фильтры для входящего трафика.

  • tcpflags - пакеты полученные этим интерфейсом проверяются на некорректное сочетание TCP флагов;
  • routefilter - добавить anti-spoofing проверку (один из видов атак);
  • nosmrfs - не пропускать пакет с широковещательным исходящим адресом;
  • logmartians - логирование пакетов, которые содержат невозможный исходящий адрес.
###############################################################################
#ZONE   INTERFACE       BROADCAST       OPTIONS
net     eth0            detect          tcpflags,routefilter,nosmurfs,logmartians
loc     eth1            detect          tcpflags,routefilter,nosmurfs,logmartians

Начиная с версии 4.5.3 shorewall поддерживает второй формат в котором нет необходимости указывать BROADCAST

?FORMAT 2
###############################################################################
#ZONE   INTERFACE       OPTIONS
net     eth0            tcpflags,routefilter,nosmurfs,logmartians
loc     eth1            tcpflags,routefilter,nosmurfs,logmartians

Более подробно о настройке этого файла можно прочитать, выполнив man shorewall-interfaces.

Связывание IP-адресов с определенной зоной

Для связывания IP-адресов или подсетей с зоной используется файл /etc/shorewall/hosts. Для связывания хостов/подсетей c зоной необходимо указать название зоны (ZONE), и сетевой интерфейс с подсетью или ip адресами (HOST).

Пример определения vpn зоны (текущий шлюз устанавливает туннель с другим шлюзом, который подключен к сегменту 10.0.0.0/24).

###############################################################################
#ZONE            HOST(S)        OPTIONS
vpn              eth0:10.0.0.0/24

Пример выделения ip адресов для телефонов (множество ip адресов 192.168.0.60-192.168.0.80) в отдельную зону phone. Это может быть удобно для управлением доступом политиками, а не исключениями.

###############################################################################
#ZONE            HOST(S)        OPTIONS
phone            eth1:192.168.0.60-192.168.0.80

Более подробно о настройке этого файла можно прочитать, выполнив man shorewall-hosts.

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

Действие по умолчанию (политика), применяемое к трафику между каждой исходной зоной и зоной назначения указывается в файле /etc/shorewall/policy. Правило описывается следующим образом: исходная зона (SOURCE), зона назначения (DEST), правило по умолчанию (POLICY)(DROP,ACCEPT,REJECT), и если необходимо уровень логирования (например info).

Политика рассматривает пакеты, которые создают новые соединения. RELATED/ESTABLISHED пакеты (пакеты установленного соединения) по умолчанию пропускаются.

Для примера установим следующие политики:
  • разрешить доступ из локальный сети в интернет
  • разрешить доступ из фаервола во всюду
  • сбрасывать все пакеты пришедшие из интернета + вести лог
  • остальные пакеты запрещать с сообщением об ошибке + вести лог
###############################################################################
#SOURCE DEST    POLICY          LOG     LIMIT:          CONNLIMIT:
#                               LEVEL   BURST           MASK
loc     net     ACCEPT
$FW     all     ACCEPT
net     all     DROP            info
all     all     REJECT          info

Более подробно о настройке этого файла можно прочитать, выполнив man shorewall-policy.

Добавление маскарадинга

Маскарадинг — тип трансляции сетевого адреса, при которой адрес отправителя подставляется динамически, в зависимости от назначенного интерфейсу адреса.

Определение dynamic NAT (Masquerading) и Source NAT (SNAT) производится в /etc/shorewall/masq.

Для добавления маскарадинга к конкретному интерфейса необходимо его указать (INTERFACE:DEST), затем указать подсеть, для которой будет применяться данный маскарадинг (SOURCE), исходящий адрес (ADDRESS) для SNAT. Если исходящий адрес не указывать, то будет использоваться dynamic NAT.

Для примера укажем, что для всех пакетов уходящие на eth0 c нашей внутренней сети (192.168.0.0/24) применять SNAT (24.56.78.21).

###############################################################################
#INTERFACE:DEST         SOURCE          ADDRESS         PROTO   PORT(S) IPSEC   MARK    USER/
#                                                                                       GROUP
eth0                    192.168.0.0/24  24.56.78.21

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

Для примера отключим NAT при отправки пакета в подсеть 192.168.2.0/24:

eth0:!192.168.2.0/24    192.168.0.0/24  24.56.78.21

Более подробно о настройке этого файла можно прочитать, выполнив man shorewall-masq.

Добавление правил

Правила необходимы для описания исключений из политик, применяемых к трафику. Правила помещаются в файл /etc/shorewall/rules.

Файл содержит три секции: RELATED,ESTABLISHED,NEW, соответствующие критерий состояния соединения. Критерий определяется при помощи критерия conntrack, который можете классифицировать пакеты на основании их отношения к соединениям. В частности, состояние NEW позволяет выделять только пакеты, открывающие новые соединения, состояние ESTABLISHED — пакеты, принадлежащие к установленным соединениям, состоянию RELATED соответствуют пакеты, открывающие новые соединения, логически связанные с уже установленными (например, соединение данных в пассивном режиме FTP). Состояние INVALID означает, что принадлежность пакета к соединению установить не удалось (INVALID также относится к секции NEW). Как уже описывалось ранее политика определяет действие для секции NEW, к RELATED и ESTABLISHED по умолчанию применяется ACCEPT.

Ниже представленные примеры записываются в секцию NEW.

Запрещение выхода в интернет с определенных узлов

#ACTION         SOURCE                     DEST            PROTO   DEST    SOURCE          ORIGINAL        RATE            USER/   MARK    CONNLIMIT    TIME
#                                                                  PORT    PORT(S)         DEST            LIMIT           GROUP
REJECT          loc:10.0.0.100-10.0.0.254  net

Перенаправление порта (DNAT) 80.

#ACTION        SOURCE          DEST            PROTO   DEST    SOURCE          ORIGINAL        RATE            USER/   MARK    CONNLIMIT    TIME
#                                                      PORT    PORT(S)         DEST            LIMIT           GROUP
HTTP/DNAT      net             loc:10.0.0.5

Если нужно, чтобы для пакетов отправленных из локальной сети на внешний ip шлюза также применялось это правило, то необходимо отредактировать файлы masq и interfaces
В interfaces добавить опцию routeback для loc сети, разрешающее маршрутизатору пересылать пакеты из локальной сети в локальную

loc    eth1        detect        tcpflags,routeback

В masq добавить правило SNAT, чтобы пакет для 10.0.0.5 был отправлен от ip шлюза (10.0.0.1 - внутренний ip адрес шлюза)
eth1:10.0.0.5                  eth1     10.0.0.1

К выше добавленному правилу в rules добавить правило DNAT что бы все пакеты из локальной сети отправлялись на 10.0.0.5, (1.2.3.4 - внешний ip адрес шлюза помещаем в ORIGINAL DEST)
HTTP/DNAT      loc             loc:10.0.0.5    -        -       1.2.3.4

Перенаправление порта 222 на 22

#ACTION        SOURCE          DEST            PROTO   DEST    SOURCE          ORIGINAL        RATE            USER/   MARK    CONNLIMIT    TIME
#                                                      PORT    PORT(S)         DEST            LIMIT           GROUP
DNAT           net             loc:10.0.0.5:22 tcp     222

Перенаправление LDAP порта, например для возможности выполнения репликации сервисов unix,samba,mail на Calculate Directory Server через интернет

#ACTION        SOURCE          DEST            PROTO   DEST    SOURCE          ORIGINAL        RATE            USER/   MARK    CONNLIMIT    TIME
#                                                      PORT    PORT(S)         DEST            LIMIT           GROUP
LDAP/DNAT      net             loc:10.0.0.5

В примере с 80 портом использован макрос, который представляет собой шаблон для создания одного или нескольких правил. Стандартные макросы находятся в /usr/share/shorewall и называются macro.имя_макроса. Содержимое макроса HTTP.

#ACTION    SOURCE    DEST    PROTO    DEST    SOURCE    RATE    USER/
#                                     PORT(S) PORT(S) LIMIT   GROUP
PARAM      -         -       tcp      80

В соответствии с содержимым макроса, его использование эквивалентно
#ACTION        SOURCE          DEST            PROTO   DEST    SOURCE          ORIGINAL        RATE            USER/   MARK    CONNLIMIT    TIME
#                                                      PORT    PORT(S)         DEST            LIMIT           GROUP
DNAT           net             loc:10.0.0.5    tcp     80

Отправитель и получатель пакета может быть задан следующим образом

dmz:192.168.2.2 узел 192.168.2.2 в DMZ зоне
net:155.186.235.0/24 подсеть 155.186.235.0/24 в интернете
loc:192.168.1.1,192.168.1.2 узлы 192.168.1.1 и 192.168.1.2 в локальной сети
loc:~00-A0-C9-15-39-78 узел в локальной сети с MAC адресом 00:A0:C9:15:39:78
net:192.0.2.11-192.0.2.17 узлы в диапазоне 192.0.2.11-192.0.2.17 в интернете
net:!192.0.2.11-192.0.2.17 все узлы из интернета исключая 192.0.2.11-192.0.2.17
net:155.186.235.0/24!155.186.235.16/28 подсеть 155.186.235.0/24 в интернете исключая 155.186.235.16/28

Более подробно о настройке этого файла можно прочитать, выполнив man shorewall-rules.

Определение туннелей

Для того чтобы Shorewall не сбрасывал шифрованный трафик - необходимо описать туннель в /etc/shorewall/tunnels. Этот файл используется для определения правил пропуска инкапсулированного (обычно шифрованного) трафика между Shorewall и удаленным шлюзом.

В описании указывается тип туннеля (TYPE), зона из которой приходит трафик туннеля(ZONE), адрес удаленного шлюза (GATEWAY).

Для примера определим IPSEC туннель (ESP) между текущим шлюзом и удаленным (4.33.99.124).

#TYPE           ZONE    GATEWAY
ipsec:esp       net     4.33.99.124

Более подробно о настройке этого файла можно прочитать, выполнив man shorewall-tunnels.

Добавление запуска Shorewall при загрузке

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

rc-update add shorewall boot

Настройка управления пропускной способностью

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

В том виде, в каком сейчас существует Internet, мы не можем контролировать объем входящего трафика. Это что-то вроде почтового ящика (не электронного!). Нет никакого способа влиять на то, какой объем почты приходит к вам, разве что общаясь с каждым респондентом.

Однако, Internet, в большистве своем, основан на протоколе TCP/IP, а у него есть несколько свойств, которые могут нам помочь. TCP/IP не может узнать пропускной способности сети между двумя хостами, поэтому он начинает передавать данные все быстрее и быстрее (это называется "медленный старт"). Когда пакеты начинают теряться из-за перегрузки передающей среды, передача тормозится. На самом деле все немного сложнее и умнее, но об этом позже.

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

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

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

Если пакет благополучно миновал эту стадию, то далее он может быть передан либо локальным приложениям (в этом случае он попадает в стек IP для дальнейшей обработки), либо в сеть, через исходящий классификатор, на другой узел сети. Пользовательские приложения так же могут отправлять данные в сеть, которые аналогичным образом движутся через исходящий классификатор. Исходящий классификатор "разбивает" трафик по очередям, каждая из которых имеет свою дисциплину организации. В случае конфигурации по-умолчанию имеется единственная исходящая очередь -- pfifo_fast. Этот процесс называется "постановкой в очередь".

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

Включение управления трафиком на интерфейсе.

Для включения управления трафиком используется файл /etc/shorewall/tcdevices.

Записи в этом файле определяют ширину канала для интерфейса, на котором вы хотите использовать управление пропускной способностью. Ширина канала может измеряться в kbps, mbps, kbit, mbit и bps.

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

OUT-BANDWIDTH содержит ширину исходящего канала для интерфейса. Это максимальная скорость используется как "full" при классификации трафика. Исходящий трафик превышающий максимальный сбрасывается.

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

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

###############################################################################
#NUMBER:        IN-BANDWITH     OUT-BANDWIDTH   OPTIONS         REDIRECTED
#INTERFACE                                                      INTERFACES
eth0            -               10mbit
eth1            -               10mbit

Более подробно о настройке этого файла можно прочитать, выполнив man shorewall-tcdevices.

Определение классов для трафика

Определения классов производится в /etc/shorewall/tcclasses. В каждой строке определяется класс трафика, а именно: интерфейс для которого создается класс (INTERFACE), маркер принадлежности трафика к классу (MARK), гарантированная пропускная способность (RATE), желаемая пропускная способность (CEIL), приоритет (PRIORITY), дополнительные параметры (OPTIONS).

Маркер будет использоваться при настройки правил (tcrules) принадлежности трафика определенному классу. Гарантированная и желаемая пропускная способность может быть указана в абсолютных величинах или относительно полной пропускной способности указанной для интерфейса (например 2*full/3, две трети канала). Гарантированная пропускная способность означает, что при пиковых нагрузках данный вид трафика будет иметь как минимум эту пропускную способность, желаемая - что пропускная способность для данного вида трафика не будет больше указанной величины. Чем меньше значение приоритета, тем выше приоритет для трафика. Пока не будет обработан трафик с высшим приоритетом, трафик с меньшим приоритетом не обрабатывается. Дополнительные параметры перечисляются через запятую и могут принимать следующие значения:

  • default - класс по умолчанию, не маркированный трафик будет отнесен в этот класс.
  • tos=0xvalue[/0xmask] - классификация трафика на основе TOS байта.
  • tos-tosname - так же классификация трафика по TOS байту на основании пяти стандартных значений
  • tcp-ack - служит для определения tcp ask пакетов, имеющих размер менее 64 байт.
  • pfifo - использовать для класса дисциплину pfifo, вместо SFQ.
  • limit=number - определяет максимальное число пакетов которые могут быть помещены в эту очередь
Ниже в примере настраивается классификация следующим образом:
  • 100-180kbit для трафика с tos байтом 68/b8 (EF и AFF3-1 трафик VOIP устройств)
  • Интерактивный трафик и TCP acks и любой пакет с маркером 2 будет иметь гарантированную 1/4 от всей полосы и может занимать весь канал.
  • Неклассифицированный трафик и пакет с маркером 3 будет иметь гарантированную 1/4 от всей полосы и может занимать весь канал.
  • Пакет с маркером 4 имеют наименьший приоритет гарантированную 1/8 часть полосы, и может занимать 80% от всего канала.
#INTERFACE  MARK  RATE    CEIL      PRIORITY    OPTIONS
eth0        1     100kbit 180kbit   1           tos=0x68/0xfc,tos=0xb8/0xfc
eth0        2     full/4  full      2           tcp-ack,tos-minimize-delay
eth0        3     full/4  full      3           default
eth0        4     full/8  full*8/10 4

Более подробно о настройке этого файла можно прочитать, выполнив man shorewall-tcclasses.

Настройка маркировки трафика

Настройка маркировки осуществляется в файле /etc/shorewall/mangle. Записи в этом файле при помощи маркировки определяют принадлежность пакета тому или иному классу. Для определения условия установки маркера используются следующие поля:
  • ACTION - действие
  • SOURCE - адрес отправителя пакета
  • DEST - адрес получателя пакета
  • PROTO - протокол
  • DEST PORT - порт или порты получателя
  • SOURCE PORT - порт или порты отправителя
  • USER - пользователь, которому принадлежит процесс, создавший пакет (имеет смысл только для исходящего трафика с самого файервола
  • TEST - проверка установленного маркера
  • LENGTH - размер пакета
  • TOS - значение TOS байта
  • CONNBYTES - диапазон передаваемых данных для соединения
  • HELPER - имя Netfiler helper модуля, например для определения ftp, sip, amanda, и т.д.
Для указания маркера используется следующие значения:
  • MARK(значение)[:{C|F|P|T|CF|CP|CT}]
    • F - маркировка производится в FORWARD цепочке
    • P - маркировка производится в PREROUTING цепочке
    • T - маркировка производится в POSTROUTING цепочке
    • CF - маркировка соединения производится в FORWARD цепочке
    • CP - маркировка соединения производится в PREROUTING цепочке
    • CT - маркировка соединения производится в POSTROUTING цепочке
  • RESTORE[/mask] - восстановить маркировку пакета из маркировки соединения
  • SAVE[/mask] - сохранить маркировку пакета в маркировке соединения
  • CONTINUE - не обрабатывать последующие правила в таблице маркировки

Пример

  • Все пакеты GRE (протокол 47), не созданные в системе файрвола и имеющие целевой адрес 155.186.235.151, должны иметь метку 1.
  • Все пакеты SSH, приходящие с 192.168.1.0/24 и предназначенные для 155.186.235.151, должны иметь метку 2.
  • Все пакеты P2P промаркировать меткой 4.
#ACTION       SOURCE         DESTINATION     PROTOCOL   PORT(S)       SPORT    USER      TEST
MARK(1):T     0.0.0.0/0      155.182.235.151 47
MARK(2):T     192.168.1.0/24 155.182.235.151 tcp        22
RESTORE       0.0.0.0/0      0.0.0.0/0       all        -             -        -         0
CONTINUE      0.0.0.0/0      0.0.0.0/0       all        -             -        -         !0
MARK(4):T     0.0.0.0/0      0.0.0.0/0       ipp2p:all
SAVE          0.0.0.0/0      0.0.0.0/0       all        -             -        -         !0

Последние четыре правила означают следующее:

Если пакет не был классифицирован (метка пакета 0), то скопировать метку соединения в метку пакета. Если метка пакета уже задана, то никаких действий более не требуется. Если пакет относится к типу P2P, то задать метку пакета 4. Если метка пакета задана, то сохранить ее в качестве метки соединения.

Справка по настройке man shorewall-tcrules.

Примеры настроек

Пример настройки шлюза

Допустим у нас есть сеть представленная на рисунке ниже:

  • компьютеры внутренней сети имеют адреса 192.168.1.0/24
  • Calculate Directory Server, подключенный к внутренней сети через интерфейс eth1 с установленным ip адресом 192.168.1.1, и имеющий выход в интернет через интерфейс eth0 с установленным ip адресом 1.2.3.4 (шлюз)
  • в локальный сети есть почтовый сервер с адресом 192.168.1.10

Для начала определим необходимые зоны: net - интернет, loc - локальная сеть, fw - CDS. В /etc/shorewall/zones поместим записи:

###############################################################################
#ZONE   TYPE            OPTIONS         IN                      OUT                    
#                                       OPTIONS                 OPTIONS
fw      firewall
net     ipv4
loc     ipv4

Теперь необходимо указать, что зона net обслуживается интерфейсом eth0, а зона loc - интерфейсом eth1. Входящий трафик на обоих интерфейсах будем пропускать через фильтры: tcpflags,routefilter,nosmurfs,logmartians. В /etc/shorewall/interfaces поместим записи:

###############################################################################
#ZONE   INTERFACE       BROADCAST       OPTIONS
net     eth0            detect          tcpflags,nosmurfs,routefilter,logmartians
loc     eth1            detect          tcpflags,nosmurfs,routefilter,logmartians

Опишем правила по умолчанию (политики) для трафика проходящего через шлюз: локальной сети (loc) и шлюзу ($FW) разрешен доступ во все зоны, пакеты из сети (net) сбрасывается, к остальным применяется правило REJECT c логом. В /etc/shorewall/policy поместим записи:

###############################################################################
#SOURCE DEST    POLICY          LOG     LIMIT:          CONNLIMIT:
#                               LEVEL   BURST           MASK
loc     all     ACCEPT
$FW     all     ACCEPT
net     all     DROP
all     all     REJECT          info

Добавим маскарадинг для пакетов исходящих из локальной сети в интернет. В /etc/shorewall/masq поместим записи:

###############################################################################
#INTERFACE:DEST         SOURCE          ADDRESS         PROTO   PORT(S) IPSEC   MARK    USER/
#                                                                                       GROUP
eth0                    192.168.1.0/24  1.2.3.4
Шлюз обеспечивающий выход в интернет локальной сети готов, теперь добавим несколько правил:
  • разрешить ping шлюза из интернета
  • разрешим соединение по ssh со шлюзом из интернета
  • запретим выход в интернет с диапазона адресов 192.168.1.100-192.168.1.254
  • перенаправим порты IMAP/IMAPS для доступа к почтового сервера из интернета
  • перенаправим порт SMTP к почтовому серверу

В /etc/shorewall/rules поместим записи:

####################################################################################################################################################################
#ACTION         SOURCE          DEST            PROTO   DEST    SOURCE          ORIGINAL        RATE            USER/     MARK    CONNLIMIT       TIME         HEADERS
#                                                       PORT    PORT(S)         DEST            LIMIT           GROUP
#SECTION ESTABLISHED
#SECTION RELATED
SECTION NEW
Ping/ACCEPT     net             $FW
SSH/ACCEPT      net             $FW
REJECT          loc:192.168.1.100-192.168.1.254  net
IMAP/DNAT       net             loc:192.168.1.10
IMAPS/DNAT      net             loc:192.168.1.10
SMTP/DNAT       net             loc:192.168.1.10

Разрешаем запуск shorewall, для этого устанавливаем параметр STARTUP_ENABLED=Yes в файле /etc/shorewall/shorewall.conf.

Добавление ip телефонии

Модифицируем сеть предыдущего примера, добавив в нее ip телефоны:

  • телефоны подключены к основной сети и их ip адреса находятся в диапазоне 192.168.1.70-192.168.1.99
  • на сервер 192.168.1.10 устанавливается asterisk

Объявим новую зону phone для телефонов. Изменим /etc/shorewall/zones (зона phone должна быть объявлена обязательно перед зоной loc):

###############################################################################
#ZONE   TYPE            OPTIONS         IN                      OUT
#                                       OPTIONS                 OPTIONS
fw      firewall
net     ipv4
phone   ipv4 # Новая строка
loc     ipv4

Выделим телефоны из зоны loc в зону phone. Поместим в /etc/shorewall/hosts

###############################################################################
#ZONE   HOST(S)                                 OPTIONS
phone   eth1:192.168.1.70-192.168.1.99

Опишем политику запрещающую телефонам (phone) доступ к интернету (net). Изменим /etc/shorewall/policy

###############################################################################
#SOURCE DEST    POLICY          LOG     LIMIT:          CONNLIMIT:
#                               LEVEL   BURST           MASK
phone   net     DROP    # Новая строка
loc     all     ACCEPT
$FW     all     ACCEPT
net     all     DROP
all     all     REJECT          info

Сделаем проброс SIP и IAX портов на 192.168.1.10. Добавим к /etc/shorewall/rules

####################################################################################################################################################################
#ACTION         SOURCE          DEST            PROTO   DEST    SOURCE          ORIGINAL        RATE            USER/     MARK    CONNLIMIT       TIME         HEADERS
#                                                       PORT    PORT(S)         DEST            LIMIT           GROUP
#SECTION ESTABLISHED
#SECTION RELATED
SECTION NEW
...
SMTP/DNAT       net             loc:192.168.1.10
# SIP
DNAT            net             loc:192.168.1.10  udp   5060
# IAX
DNAT            net             loc:192.168.1.10  udp   4569

IPSEC туннели

Модифицируем сеть предыдущего примера, в соответствии с рисунком (добавление удаленный подсети):

  • Шлюз устанавливает ipsec туннель с удаленным шлюзом через интернет, подключая сегмент 192.168.3.0/24
  • Удаленный шлюз имеет ip адрес 1.2.3.5

Добавляем зону vpn для удаленной подсети. Изменяем /etc/shorewall/zones.

###############################################################################
#ZONE   TYPE            OPTIONS         IN                      OUT
#                                       OPTIONS                 OPTIONS
fw      firewall
vpn     ipv4 # Новая строка
net     ipv4
phone   ipv4
loc     ipv4

Определяем зону vpn (пакеты, поступающие eth0 и находящиеся в подсети 192.168.3.0/24). Изменяем /etc/shorewall/hosts

###############################################################################
#ZONE   HOST(S)                                 OPTIONS
phone   eth1:192.168.1.70-192.168.1.99
vpn     eth0:192.168.3.0/24 # Новая строка

Описываем туннель: ipsec, туннель проходит через зону net, ip адрес удаленного шлюза. Записываем в /etc/shorewall/tunnels

#TYPE      ZONE        GATEWAY          GATEWAY ZONE
ipsec      net         1.2.3.5

Отключаем маскарадинг пакетов отправляемых из локальный сети (loc) в удаленную подсеть (vpn). Изменяем /etc/shorewall/masq:

###############################################################################
#INTERFACE:DEST         SOURCE          ADDRESS         PROTO   PORT(S) IPSEC   MARK    USER/
#                                                                                       GROUP
eth0:192.168.3.0/24     192.168.1.0/24  1.2.3.4 # Измененная строка

Описываем политику, разрешая соединения vpn с локальной зоной loc. Изменяем /etc/shorewall/policy:

###############################################################################
#SOURCE DEST    POLICY          LOG     LIMIT:          CONNLIMIT:
#                               LEVEL   BURST           MASK
phone   net     DROP
vpn     loc     ACCEPT    # Новая строка
loc     all     ACCEPT
$FW     all     ACCEPT
net     all     DROP
all     all     REJECT          info

Пример управления трафиком

Есть канал шириной 5 мбит, необходимо разбить его следующим образом:
  • SIP из интернета 256кбит гарантированно и максимально, максимальный приоритет
  • SIP по туннелю 1мбит гарантированно и максимально, максимальный приоритет
  • RDP по туннелю 1мбит гарантированно и весь канал минус SIP максимально (5мбит-1мбит-256кбит) обычный приоритет
  • http трафик - низкий приотритет, 256кбит гарантированно и весь канал минус SIP максимально
  • ftp трафик - высокий приоритет, 256кбит гарантированно и весь канал минус SIP максимально
  • остальной трафик обычный приоритет, 256кбит гарантированно и весь канал минус SIP максимально

Устанавливаем ширину входящего и исходящего канала. Правим /etc/shorewall/tcdevices:

###############################################################################
#NUMBER:        IN-BANDWITH     OUT-BANDWIDTH   OPTIONS         REDIRECTED
#INTERFACE                                                      INTERFACES
eth0            -               5mbit
eth1            -               5mbit

Определяем классы трафика. Так как у нас eth0 смотрит в интернет, то исходящий трафик управляется на нем, eth1 смотрит в локальную сеть - входящий на нем. Правим /etc/shorewall/tcclasses:

###############################################################################
#INTERFACE:CLASS        MARK    RATE:           CEIL      PRIORITY        OPTIONS
#                               DMAX:UMAX
# INBOUND
eth1                    1       256kbit         256kbit   1
eth1                    2       1mbit           1mbit     1
eth1                    3       1mbit           3768kbit  3
eth1                    4       256kbit         3768kbit  2
eth1                    5       256kbit         3768kbit  4
eth1                    256     256kbit         3768kbit  3

# OUTBOUND
eth1                    1       256kbit         256kbit   1
eth1                    2       1mbit           1mbit     1
eth1                    3       1mbit           3768kbit  3
eth1                    4       256kbit         3768kbit  2
eth1                    5       256kbit         3768kbit  4
eth1                    256     256kbit         3768kbit  3

Определяем правила, по которым трафик будет отнесен в тот или иной класс. Правим /etc/shorewall/mangle:

######################################################################################################################
#MARK   SOURCE          DEST            PROTO   DEST    SOURCE  USER    TEST    LENGTH  TOS   CONNBYTES         HELPER
#                                               PORT(S) PORT(S)
# SIP internet
MARK(1) 0.0.0.0/24      0.0.0.0/24      udp     5060
MARK(1) 0.0.0.0/24      0.0.0.0/24      udp     -       5060
MARK(1) 0.0.0.0/24      0.0.0.0/24      all     -       -       -       -       -       -     -                  sip
# SIP tunnel
MARK(2) 192.168.3.0/24  192.168.1.0/24  udp     5060
MARK(2) 192.168.1.0/24  192.168.3.0/24  udp     5060
MARK(2) 192.168.3.0/24  192.168.1.0/24  udp     -       5060
MARK(2) 192.168.1.0/24  192.168.3.0/24  udp     -       5060
MARK(2) 192.168.3.0/24  192.168.1.0/24  all     -       -       -       -       -       -     -                  sip
MARK(2) 192.168.1.0/24  192.168.3.0/24  all     -       -       -       -       -       -     -                 sip
# RDP tunnel
MARK(3) 192.168.3.0/24  192.168.1.0/24  tcp     3389
MARK(3) 192.168.1.0/24  192.168.3.0/24  tcp     3389
MARK(3) 192.168.3.0/24  192.168.1.0/24  tcp     -       3389
MARK(3) 192.168.1.0/24  192.168.3.0/24  tcp     -       3389
# high priority FTP
MARK(4) 0.0.0.0/24      0.0.0.0/24      all     -       -       -       -       -       -     -                ftp
# low priority http,https
MARK(5) 0.0.0.0/24      0.0.0.0/24      tcp     http,https

В приведенной настройке есть особенность: так как все классы подчинены напрямую корневой дисциплине, то при отсутствии sip трафика допустим RDP и http в сумме могут занять весь канал. Если необходимо, чтобы канал выделенный под sip трафик не занимался другими трафиками - необходимо использовать иерархическую структуру подобно этой:

Для того, чтобы использовать подобную классификацию необходимо указать classify параметр для каждого интерфейса. Модифицируем /etc/shorewall/tcdevices:

###############################################################################
#NUMBER:        IN-BANDWITH     OUT-BANDWIDTH   OPTIONS         REDIRECTED
#INTERFACE                                                      INTERFACES
eth0            -               5mbit           classify
eth1            -               5mbit           classify

Модифицируем /etc/shorewall/tcclasses в соответствии со структурой представленной выше.

###############################################################################
#INTERFACE:CLASS        MARK    RATE:           CEIL      PRIORITY        OPTIONS
#                               DMAX:UMAX
# INBOUND
# SIP
1:10                    -       1256kbit        1256kbit  1
eth1:10:101             -       256kbit         256kbit   1
eth1:10:102             -       1mbit           1mbit     1

# OTHER
1:20                    -       3768kbit        3768kbit  2
eth1:20:201             -       1mbit           3768kbit  3
eth1:20:202             -       256kbit         3768kbit  2
eth1:20:203             -       256kbit         3768kbit  4
eth1:20:204             -       256kbit         3768kbit  3

# OUTBOUND
2:30                    -       1256kbit        1256kbit  1
eth0:30:301             -       256kbit         256kbit   1
eth0:30:302             -       1mbit           1mbit     1

# OTHER
2:40                    -       3768kbit        3768kbit  2
eth0:40:401             -       1mbit           3768kbit  3
eth0:40:402             -       256kbit         3768kbit  2
eth0:40:403             -       256kbit         3768kbit  4
eth0:40:404             -       256kbit         3768kbit  3

Определяем по новой правила, по которым трафик будет отнесен в тот или иной класс. Правим /etc/shorewall/mangle:

######################################################################################################################
#MARK             SOURCE          DEST            PROTO   DEST    SOURCE  USER    TEST    LENGTH  TOS   CONNBYTES         HELPER
#                                                 PORT(S) PORT(S)
# SIP internet
CLASSIFY(10:101)  0.0.0.0/24      0.0.0.0/24      udp     5060
CLASSIFY(10:101)  0.0.0.0/24      0.0.0.0/24      udp     -       5060
CLASSIFY(10:101)  0.0.0.0/24      0.0.0.0/24      all     -       -       -       -       -       -     -                  sip
CLASSIFY(30:301)  0.0.0.0/24      0.0.0.0/24      udp     5060
CLASSIFY(30:301)  0.0.0.0/24      0.0.0.0/24      udp     -       5060
CLASSIFY(30:301)  0.0.0.0/24      0.0.0.0/24      all     -       -       -       -       -       -     -                  sip

# SIP tunnel
CLASSIFY(10:102)  192.168.3.0/24  192.168.1.0/24  udp     5060
CLASSIFY(30:302)  192.168.1.0/24  192.168.3.0/24  udp     5060
CLASSIFY(10:102)  192.168.3.0/24  192.168.1.0/24  udp     -       5060
CLASSIFY(30:302)  192.168.1.0/24  192.168.3.0/24  udp     -       5060
CLASSIFY(10:102)  192.168.3.0/24  192.168.1.0/24  all     -       -       -       -       -       -     -                  sip
CLASSIFY(10:302)  192.168.1.0/24  192.168.3.0/24  all     -       -       -       -       -       -     -                 sip
# RDP tunnel
CLASSIFY(20:201)  192.168.3.0/24  192.168.1.0/24  tcp     3389
CLASSIFY(40:401)  192.168.1.0/24  192.168.3.0/24  tcp     3389
CLASSIFY(20:201)  192.168.3.0/24  192.168.1.0/24  tcp     -       3389
CLASSIFY(40:401)  192.168.1.0/24  192.168.3.0/24  tcp     -       3389
# high priority FTP
CLASSIFY(20:203)  0.0.0.0/24      0.0.0.0/24      all     -       -       -       -       -       -     -                ftp
CLASSIFY(40:403)  0.0.0.0/24      0.0.0.0/24      all     -       -       -       -       -       -     -                ftp
# low priority http,https
CLASSIFY(20:204)  0.0.0.0/24      0.0.0.0/24      tcp     http,https
CLASSIFY(40:404)  0.0.0.0/24      0.0.0.0/24      tcp     http,https

Спасибо!