Shorewall
Обновлено 13 июля 2022
- Установка Shorewall
- Настройки 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 пакеты (пакеты установленного соединения) по умолчанию пропускаются.
Для примера установим следующие политики:
- разрешить доступ из локальный сети в интернет
- разрешить доступ из файрвола куда угодно
- сбрасывать все пакеты пришедшие из интернета + вести лог
- остальные пакеты запрещать с сообщением об ошибке + вести лог
/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
Допустим, что у нас есть сеть, представленная на рисунке ниже:
- компьютеры внутренней сети имеют адреса
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-адреса находятся в диапазоне
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-туннель с удалённым шлюзом через интернет, подключая сегмент
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