Shorewall

Обновлено 13 июля 2022

Shorewall

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

Установка Shorewall

В Calculate Linux Desktop и Calculate Directory Server пакет Shorewall входит в базовую поставку, в остальных дистрибутивах для установки пакета выполните:

emerge -a net-firewall/shorewall

Заметка

Чтобы включить примеры и документацию, установите пакет с USE-флагом doc:

USE="doc" emerge -a net-firewall/shorewall

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

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

Для их установки выполните:

emerge -a net-firewall/xtables-addons net-misc/l7-filter-userspace net-libs/gupnp-igd

Настройки Shorewall

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

  • Зоны
    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

/etc/shorewall/zones

#ZONE   #TYPE
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 - логирование пакетов, которые содержат невозможный исходящий адрес.

/etc/shorewall/interfaces

?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).

/etc/shorewall/hosts

#ZONE       HOSTS
vpn         eth0:10.0.0.0/24

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

/etc/shorewall/hosts

#ZONE       HOSTS
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 пакеты (пакеты установленного соединения) по умолчанию пропускаются.

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

  1. разрешить доступ из локальный сети в интернет
  2. разрешить доступ из файрвола куда угодно
  3. сбрасывать все пакеты пришедшие из интернета + вести лог
  4. остальные пакеты запрещать с сообщением об ошибке + вести лог

/etc/shorewall/policy

#SOURCE     DEST    POLICY      LOGLEVEL
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/snat.

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

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

/etc/shorewall/snat

#ACTION             SOURCE              DEST
SNAT(24.56.78.21)   192.168.0.0/24      eth0

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

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

/etc/shorewall/snat

#ACTION             SOURCE              DEST
SNAT(24.56.78.21)   192.168.0.0/24      eth0:!192.168.2.0/24

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

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

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

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

Последующие примеры записываются в секцию NEW.

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

/etc/shorewall/rules

#ACTION     SOURCE                          DEST
REJECT      loc:10.0.0.100-10.0.0.254       net

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

/etc/shorewall/rules

#ACTION     SOURCE      DEST
HTTP/DNAT   net         loc:10.0.0.5

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

/etc/shorewall/rules

#ACTION     SOURCE      DEST        PROTO
loc         eth1        detect      tcpflags,routeback

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

/etc/shorewall/rules

#ACTION       SOURCE    DEST
eth1:10.0.0.5 eth1      10.0.0.1

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

/etc/shorewall/rules

#ACTION     SOURCE      DEST            PROTO       DPORT      SPORT
HTTP/DNAT   loc         loc:10.0.0.5    -           -          1.2.3.4

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

/etc/shorewall/rules

#ACTION     SOURCE      DEST                PROTO       DPORT
DNAT        net         loc:10.0.0.5:22     tcp         222

Перенаправление LDAP порта

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

/etc/shorewall/rules

#ACTION     SOURCE      DEST
LDAP/DNAT   net         loc:10.0.0.5

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

/usr/share/shorewall/macro.HTTP

#ACTION     SOURCE      DEST        PROTO       DPORT
PARAM       -           -           tcp         80

В соответствии с содержимым макроса, его использование эквивалентно:

/etc/shorewall/rules

#ACTION     SOURCE      DEST            PROTO       DPORT
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).

/etc/shorewall/tunnels

#TYPE           ZONE        GATEWAY
ipsec:esp       net         4.33.99.124

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

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

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

rc-update add shorewall boot

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/etc/shorewall/tcdevices

#NUMBER:        IN-BANDWITH     OUT-BANDWIDTH
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% от всего канала.

/etc/shorewall/tcclasses

#INTERFACE  MARK    RATE        CEIL        PRIO        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.

/etc/shorewall/mangle

#ACTION         SOURCE          DEST            PROTO       DPORT       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.

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

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

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

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

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

Для начала определите необходимые зоны: net - интернет, loc - локальная сеть, fw - шлюз, vpn - VPN:

/etc/shorewall/zones

#ZONE       TYPE
fw          firewall
net         ipv4
loc         ipv4
vpn         ipv4

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

/etc/shorewall/interfaces

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

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

/etc/shorewall/policy

#SOURCE     DEST        POLICY          LOGLEVEL
loc         all         ACCEPT
vpn         all         ACCEPT
$FW         all         ACCEPT
net         all         DROP
all         all         REJECT          info

Добавьте маскарадинг для пакетов, исходящих из локальной сети и VPN в интернет:

/etc/shorewall/snat

#ACTION         SOURCE              DEST
SNAT(1.2.3.4)   192.168.1.0/24      eth0
SNAT(1.2.3.4)   192.168.20.0/24     eth0

Добавьте описание туннеля OpenVPN, связав его с зоной vpn:

/etc/shorewall/tunnels

#TYPE                   ZONE            GATEWAY                 GATEWAY_ZONE
openvpnserver:udp       net             0.0.0.0/0               vpn

Или добавьте описание туннеля WireGuard, связав его с зоной vpn:

/etc/shorewall/tunnels

#TYPE                   ZONE            GATEWAY                 GATEWAY_ZONE
openvpnserver:udp:51820 net             0.0.0.0/0               vpn

Шлюз, обеспечивающий выход в интернет локальной сети, готов. Добавьте несколько правил:

  • разрешить ping шлюза из интернета
  • разрешим соединение по SSH со шлюзом из интернета

/etc/shorewall/rules

?SECTION NEW
#ACTION         SOURCE                              DEST
Ping/ACCEPT     net                                 fw
SSH/ACCEPT      net                                 fw

Включите маршрутизацию, TCP Clamp MSS и разрешите запуск shorewall:

/etc/shorewall/shorewall.conf

...
IP_FORWARDING=Yes
CLAMPMSS=Yes
STARTUP_ENABLED=Yes

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

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

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

  • компьютеры внутренней сети имеют адреса 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
fw          firewall
net         ipv4
loc         ipv4

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

/etc/shorewall/interfaces

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

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

/etc/shorewall/policy

#SOURCE     DEST        POLICY          LOGLEVEL
loc         all         ACCEPT
$FW         all         ACCEPT
net         all         DROP
all         all         REJECT          info

Добавим маскарадинг для пакетов, исходящих из локальной сети в интернет:

/etc/shorewall/snat

#ACTION         SOURCE              DEST
SNAT(1.2.3.4)   192.168.1.0/24      eth0

Шлюз, обеспечивающий выход в интернет локальной сети, готов. Теперь добавим несколько правил:

  • разрешить ping шлюза из интернета
  • разрешим соединение по SSH со шлюзом из интернета
  • запретим выход в интернет с диапазона адресов 192.168.1.100-192.168.1.254
  • перенаправим порты IMAP/IMAPS для доступа к почтового сервера из интернета
  • перенаправим порт SMTP к почтовому серверу

/etc/shorewall/rules

?SECTION NEW
#ACTION         SOURCE                              DEST
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:

/etc/shorewall/shorewall.conf

STARTUP_ENABLED=Yes

Добавление IP-телефонии

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

Добавление IP-телефонии

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

Объявим новую зону phone для телефонов, зона phone должна быть объявлена обязательно перед зоной loc:

/etc/shorewall/zones

#ZONE       TYPE
fw          firewall
net         ipv4
phone       ipv4
loc         ipv4

Выделим телефоны из зоны loc в зону phone:

/etc/shorewall/hosts

#ZONE       HOST
phone       eth1:192.168.1.70-192.168.1.99

Опишем политику, запрещающую телефонам (phone) доступ к интернету (net):

/etc/shorewall/policy

#SOURCE     DEST        POLICY          LOG
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

?SECTION NEW
#ACTION         SOURCE          DEST                PROTO       DEST
...
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 туннели

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

Добавляем зону "vpn" для удалённой подсети:

/etc/shorewall/zones

#ZONE       TYPE
fw          firewall
vpn         ipv4
net         ipv4
phone       ipv4
loc         ipv4

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

/etc/shorewall/hosts

#ZONE       HOSTS
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/snat

#ACTION         SOURCE              DEST
SNAT(1.2.3.4)   192.168.1.0/24      eth0:!192.168.3.0/24

Описываем политику, разрешая соединения "vpn" с локальной зоной loc:

/etc/shorewall/policy

#SOURCE     DEST        POLICY          LOGLEVEL
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
eth0            -               5mbit
eth1            -               5mbit

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

/etc/shorewall/tcclasses

#INTERFACE      MARK        RATE        CEIL        PRIO
# 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
# 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

#INTERFACE      IN_BANDWITH     OUT_BANDWIDTH       OPTIONS
eth0            -               5mbit               classify
eth1            -               5mbit               classify

Изменим классы трафика в соответствии со структурой, представленной выше:

/etc/shorewall/tcclasses

#INTERFACE      MARK        RATE        CEIL        PRIO
# 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
# 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