Едем дальше. Попробуем добавить безопасности.
Первым делом, что хочется сделать, это построить правильный межсетевой экран с сохранением сессий (stateful inspection) и учетом сложных протоколов (advanced protocol handling).
Посмотрим, что vyatta умеет делать с точки зрения фильтрации трафика, а сложные протоколы рассмотрим позже.
Все глобальные параметры межсетевого экранирования собраны в режиме
edit firewall
Все функции фильтрации, которые можно применить для конкретного интерфейса, собраны в настройке
edit firewall name {ИМЯ}
Там можно фильтровать как по МАС-адресам (фильтр на канальном уровне), так и по IP и TCP/UDP портам (статические списки доступа).
Для начала описываем действие, которое мы хотим сделать с пакетом
[edit firewall name {ИМЯ}]
set rule {RULENUMBER} action {accept|drop|reject|inspect}
RULENUMBER
— всего лишь номер правила в списке. Просматриваем сверху вниз. В конце любого фильтра всегда стоит невидимое «запретить все».
Рекомендация: когда создаете правила, лучше оставлять запас для последующей вставки правил. Например, указывать номера 10,20,30 и т.д.
drop
– уничтожить пакет тихо
reject
– сбросить ТСР-сессию с reset(насколько я понял)
inspect
– отправить на анализ системе IPS
Важно: указание слова inspect не подразумевает последующего прохождения трафика, если IPS не доступен. Т.е. если отправить весь трафик на анализ и больше никаких правил в правиле МСЭ не описать, то при применении на интерфейс все будет заблокировано!
Если же дополнительно указывать состояние сессии (new, established, related) то можно явно описать и динамические правила.
[edit firewall name {ИМЯ} rule {#}]
set state {new|established|related|invalid}
new
– инициирование сессии. Имеются ввиду протоколы, у которых есть порты (TCP и UDP).
established
– пропускаем только пакеты по установленным сессиям. Будьте внимательны: относится тоже и к TCP и к UDP, хотя как вы знаете, понятие «установленная сессия» в классике относится только к TCР к пакетам, где есть флаг ACK или RST. Однако здесь разработчики и для UDP заложили (и это очень хорошо) понятие «установленная» — это означает, что был пакет в противоположном направлении по этой сессии, а мы видим ответ.
related
– пожалуй, самое интересное. Это ключевое слово означает, что vyatta откроет сессию, которая требуется для работы сложного протокола, которому требуется открывать динамические сессии (ftp, h.323, sip и т.д.). Параметры этой связанной сессии согласовываются в рамках служебной сессии, чье установление идёт по известным портам.
invalid
– vyatta не может определить состояние этой сессии
Для нашей задачи (отгородиться от внешнего мира) вполне сгодится такое простое правило МСЭ: будем снаружи пропускать только те пакеты TCP и UDP, которые мы запрашивали изнутри, а также ICMP-ответы (echo-repy, unreachable).
[edit]
edit firewall name FROMOUT rule 10
[edit firewall name FROMOUT rule 10]
set action accept
[edit firewall name FROMOUT rule 10]
set source address 0.0.0.0/0
[edit firewall name FROMOUT rule 10]
set destination address 10.4.4.0/24
[edit firewall name FROMOUT rule 10]
set protocol tcp
[edit firewall name FROMOUT rule 10]
set state established enable
[edit firewall name FROMOUT rule 10]
commit
[edit firewall name FROMOUT rule 10]
exit
[edit]
edit firewall name FROMOUT rule 20
[edit firewall name FROMOUT rule 20]
set action accept
[edit firewall name FROMOUT rule 20]
set source address 0.0.0.0/0
[edit firewall name FROMOUT rule 20]
set destination address 10.4.4.0/24
[edit firewall name FROMOUT rule 20]
set protocol udp
[edit firewall name FROMOUT rule 20]
set state established enable
[edit firewall name FROMOUT rule 20]
commit
Важно: здесь вскрывается одна важнейшая деталь: правило МСЭ отрабатывает до правила NAT если мы идём наружу, но для обратных пакетов, когда мы идём внутрь, все наоборот: сначала производится обратная трансляция, и только после этого применяется правило МСЭ! Как видите, в правилах я указал в качестве destination свою частную сеть 10.4.4.0/24, а не глобальный адрес внешнего интерфейса. Это очень важный момент. У маршрутизаторов cisco, например, сначала отрабатывают правила МСЭ, и только потом NAT
Добавим icmp. Коды icmp – 0 для ответов (echo-reply), 3 – для недоступных. Можно выбрать все, а можно по конкретным типам (самые нужные: 1, 3 и 4). К сожалению, это надо описывать в разных правилах отдельно. В примере – только code 0 и code 3 type 1
[edit firewall name FROMOUT rule 30]
set action accept
[edit firewall name FROMOUT rule 30]
set source address 0.0.0.0/0
[edit firewall name FROMOUT rule 30]
set destination address 10.4.4.0/24
[edit firewall name FROMOUT rule 30]
set protocol icmp
[edit firewall name FROMOUT rule 30]
Set icmp code 0
[edit firewall name FROMOUT rule 30]
exit
[edit]
edit firewall name FROMOUT rule 40
[edit firewall name FROMOUT rule 40]
set action accept
[edit firewall name FROMOUT rule 40]
set source address 0.0.0.0/0
[edit firewall name FROMOUT rule 40]
set destination address 10.4.4.0/24
[edit firewall name FROMOUT rule 40]
set protocol icmp
[edit firewall name FROMOUT rule 40]
Set icmp code 3
[edit firewall name FROMOUT rule 40]
Set icmp type 1
[edit firewall name FROMOUT rule 40]
commit
В итоге мы получим такой конфиг правила FROMOUT:
rule 10 {
action accept
destination {
address 10.4.4.0/24
}
protocol tcp
state {
established enable
}
}
rule 20 {
action accept
destination {
address 10.4.4.0/24
}
protocol udp
source {
address 0.0.0.0/0
}
state {
established enable
}
}
rule 30 {
action accept
destination {
address 10.4.4.0/24
}
icmp {
code 0
}
protocol icmp
}
rule 40 {
action accept
destination {
address 10.4.4.0/24
}
icmp {
code 3
type 1
}
protocol icmp
}
Осталось применить его на вход внешнего интерфейса:
[edit interface ethernet eth0]
set firewall in name FROMOUT
[edit interface ethernet eth0]
commit
Метки: firewall, vyatta, МСЭ, настройка
Опубликовано: Vyatta
убедил. Скачал вмваре-образ. посмотрю 🙂
В сетевых экранах Juniper приблизительно такой синтаксис и конструкции?
Синтаксис Vyatta мегагорбатый.
Доброго дня! Спасибо за замечательный цикл статей!
Начал разбираться с файрволом, столкнулся с определённым непониманием, хочу для начала просто попробовать заблокировать сквидов порт (3128), делаю:
vyatta@vyatta# show firewall
all-ping enable
broadcast-ping disable
ipv6-receive-redirects disable
ipv6-src-route disable
ip-src-route disable
log-martians enable
name InetAccess {
default-action drop
rule 10 {
action drop
destination {
port 3128
}
protocol tcp_udp
}
}
receive-redirects disable
send-redirects enable
source-validation disable
syn-cookies enable
vyatta@vyatta# show interfaces ethernet eth0
address 10.1.66.104/24
description KM-Lan
duplex auto
firewall {
in {
name InetAccess
}
}
hw-id 00:30:48:84:75:c8
smp_affinity auto
speed auto
vif 1 {
address 10.1.1.104/24
description KM-V-Office
firewall {
in {
name InetAccess
}
}
}
vif 3 {
address 10.1.3.1/24
description KM-V-VoIP
}
vif 4 {
address 10.1.4.1/24
description KM-V-DCinema
}
однако:
telnet 10.1.1.104 3128
Trying 10.1.1.104…
Connected to 10.1.1.104.
Escape character is ‘^]’.
порт остаётся открытым, что я делаю не так?
hexes: «local» вместо «in». «in» это forwarded traffic, трафик к самому маршрутизатору — «local».
Ох! Покорнейше благодарю! Всё понял!