Question: Примеры применения ACL типа Packet Content Filtering.

Answer: 

Пример №1

Задача:

РС1 обращается на ТСР порт 445 РС2. Необходимо заблокировать подобную активность.

Решение:

Вот так пакет выглядит в Ethereal (протокол и порт выделены для наглядности):

Source                Destination           Protocol Info 192.168.0.101         192.168.0.6           TCP     1862 > 445 [SYN] Seq=0 Ack=0 Win=65535 Len=0 MSS=1460

Ethernet II, Src: 00:11:5b:31:b9:e7 (00:11:5b:31:b9:e7), Dst: 00:11:5b:4f:21:9f (00:11:5b:4f:21:9f)
Internet Protocol, Src: 192.168.0.101 (192.168.0.101), Dst: 192.168.0.6 (192.168.0.6)
Transmission Control Protocol, Src Port: 1862 (1862), Dst Port: 445 (445), Seq: 0, Ack: 0, Len: 0

0000 00 11 5b 4f 21 9f 00 11 5b 31 b9 e7 08 00 45 00 ..[O!...[1....E.
0010 00 30 5b 91 40 00 80 06 1d 7b c0 a8 00 65 c0 a8 .0[.@....{...e..
0020 00 06 07 46 01 bd be e9 ca 67 00 00 00 00 70 02 ...F.....g....p.
0030 ff ff 6f 0f 00 00 02 04 05 b4 01 01 04 02 ..o...........

Построение профиля для правил на основе packet_content_mask, упрощенно, а так же для более удобного сопоставления с имеющимися данными можно представить вот в таком виде:

create access_profile packet_content_mask
offset_0-15 0xffffffff 0xffffffff 0xffffffff 0xffffffff
offset_16-31 0xffffffff 0xffffffff 0xffffffff 0xffffffff
offset_32-47 0xffffffff 0xffffffff 0xffffffff 0xffffffff
offset_48-63 0xffffffff 0xffffffff 0xffffffff 0xffffffff
offset_64-79 0xffffffff 0xffffffff 0xffffffff 0xffffffff
[profile_id 1]

Исходя из этого приведем данные к более удобному варианту:

0000 00115b4f 219f0011 5b31b9e7 08004500
0010 00305b91 40008006 1d7bc0a8 0065c0a8
0020 00060746 01bdbee9 ca670000 00007002
0030 ffff6f0f 00000204 05b40101 0402

Т.к внутри свитча пакеты всегда тегированы, вне зависимости от того назначали вы тег или нет, то заполним символами „х“ данные с 12 по 15 байт (в свитче эти байты заполняются информацией о VLAN). Обратите внимание - у Вас в этих байтах могут быть данные, которые Вы захотите использовать для написания ACL:

0000 00115b4f 219f0011 5b31b9e7 xxххххxx
0010 08004500 00305b91 40008006 1d7bc0a8
0020 0065c0a8 00060746 01bdbee9 ca670000
0030 00007002 ffff6f0f 00000204 05b40101
0040 0402

Как видите информация относительно исходного варианта сместилась. Теперь сократим запись оставив только то, что нужно:

0010 08004500 00305b91 40008006 1d7bc0a8
0020 0065c0a8 00060746 01bdbee9 ca670000

Набросаем примерный скелет будущего правила:

offset_16-31 08004500 00305b91 40008006 1d7bc0a8
offset_32-47 0065c0a8 00060746 01bdbee9 ca670000

Напишем собственно необходимые правила ACL.

create access_profile packet_content_mask offset_16-31 0x0 0x0 0x000000ff 0x0 offset_32-47 0x0 0x0 0xffff0000 0x0 profile_id 1
config access_profile profile_id 1 add access_id 1 packet_content_mask offset_16-31 0x0 0x0 0x00000006 0x0 offset_32-47 0x0 0x0 0x01bd0000 0x0 port 1 deny

Вот и все, ТСР destination port 445 заблокирован. Можно поступить несколько иначе, а именно:

create access_profile packet_content_mask offset_32-47 0x0 0x0 0xffff0000 0x0 profile_id 1
config access_profile profile_id 1 add access_id 1 packet_content_mask offset_32-47 0x0 0x0 0x01bd0000 0x0 port 1 deny

Т.е. не указывать протокол (offset_16-31 0x0 0x0 0x000000ff), в таком варианте будут заблокированы все пакеты с destination port 445 вне зависимости от протокола, т.е. под данное правило попадут и ТСР и UDP пакеты.

Пример №2

Задача:

РС1 обращается на ТСР порт 445 РС2 через нешифрованное РРТР соединение. Необходимо заблокировать подобную активность.

Решение:

Вот так пакет выглядит в Ethereal (протоколы и порт, как и в примере №1, выделены для наглядности разными цветами):

Source                Destination           Protocol Info
192.168.0.101         192.168.0.6           TCP      1837 > 445 [SYN] Seq=0 Ack=0 Win=65535 Len=0 MSS=1360

Ethernet II, Src: 00:11:5b:31:b9:e7 (00:11:5b:31:b9:e7), Dst: 00:10:7b:3c:2b:bf (00:10:7b:3c:2b:bf)
Internet Protocol, Src: 10.10.10.2 (10.10.10.2), Dst: 10.10.10.1 (10.10.10.1)
Generic Routing Encapsulation (PPP)
Point-to-Point Protocol
Internet Protocol, Src: 192.168.0.101 (192.168.0.101), Dst: 192.168.0.6 (192.168.0.6)
Transmission Control Protocol, Src Port: 1837 (1837), Dst Port: 445 (445), Seq: 0, Ack: 0, Len: 0

0000 00 10 7b 3c 2b bf 00 11 5b 31 b9 e7 08 00 45 00   ..{<+...[1....E.
0010 00 54 59 d6 00 00 80 2f b8 8e 0a 0a 0a 02 0a 0a  .TY..../........
0020 0a 01 30 01 88 0b 00 34 00 0b 00 00 03 32 ff 03  ..0....4.....2..
0030 00 21 45 00 00 30 59 d5 40 00 80 06 1f 37 c0 a8  .!E..0Y.@....7..
0040 00 65 c0 a8 00 06 07 2d 01 bd 4f fd 47 59 00 00  .e.....-..O.GY..
0050 00 00 70 02 ff ff 61 87 00 00 02 04 05 50 01 01  ..p...a......P..
0060 04 02                                            ..

Если сравните этот пример и пример №1, то Вы увидите что пакет увеличился за счет транспортной составляющей (GRE, РРР заголовки и т.д.). Опять приведем это к более удобному варианту:

0000 00107b3c 2bbf0011 5b31b9e7 08004500
0010 005459d6 0000802f b88e0a0a 0a020a0a
0020 0a013001 880b0034 000b0000 0332ff03
0030 00214500 003059d5 40008006 1f37c0a8
0040 0065c0a8 0006072d 01bd4ffd 47590000
0050 00007002 ffff6187 00000204 05500101
0060 0402

Заполним символами „х“ данные с 12 по 15 байт:

0000 00107b3c 2bbf0011 5b31b9e7 хххххххх
0010 08004500 005459d6 0000802f b88e0a0a
0020 0a020a0a 0a013001 880b0034 000b0000
0030 0332ff03 00214500 003059d5 40008006
0040 1f37c0a8 0065c0a8 0006072d 01bd4ffd
0050 47590000 00007002 ffff6187 00000204
0060 05500101 0402

Сократим запись оставив только нужную информацию:

0010 08004500 005459d6 0000802f b88e0a0a
0030 0332ff03 00214500 003059d5 40008006
0040 1f37c0a8 0065c0a8 0006072d 01bd4ffd

Набросаем примерный скелет будущего правила:

offset_16-31 08004500 005459d6 0000802f b88e0a0a
offset_48-63 0332ff03 00214500 003059d5 40008006
offset_64-79 1f37c0a8 0065c0a8 0006072d 01bd4ffd

Вот собственно и все, можно переходить к написанию ACL.

create access_profile packet_content_mask offset_16-31 0x0 0x0 0x000000ff 0x0 offset_48-63 0x0 0x0 0x0 0x000000ff offset_64-79 0x0 0x0 0x0 0xffff0000 profile_id 1
config access_profile profile_id 1 add access_id 1 packet_content_mask offset_16-31 0x0 0x0 0x0000002f 0x0 offset_48-63 0x0 0x0 0x0 0x00000006 offset_64-79 0x0 0x0 0x0 0x01bd0000 port 1 deny

Аналогично примеру №1 можно заблокировать порт вне зависимости от протокола, т.е.:

create access_profile packet_content_mask offset_16-31 0x0 0x0 0x000000ff 0x0 offset_64-79 0x0 0x0 0x0 0xffff0000 profile_id 1
config access_profile profile_id 1 add access_id 1 packet_content_mask offset_16-31 0x0 0x0 0x0000002f 0x0 offset_64-79 0x0 0x0 0x0 0x01bd0000 port 1 deny

Вот рабочий пример рабочего решения, блокируются те же порты что и в примере №1:

create access_profile packet_content_mask offset_16-31 0x0 0x0 0x000000ff 0x0 offset_48-63 0x0 0x0 0x000000ff 0x0 offset_32-47 0x0 0x0 0xffff0000 0x0 profile_id 1
config access_profile profile_id 1 add access_id 1 packet_content_mask offset_16-31 0x0 0x0 0x0000002f 0x0 offset_48-63 0x0 0x0 0x00000006 0x0 offset_32-47 0x0 0x0 0x00870000 0x0 port 1 deny
config access_profile profile_id 1 add access_id 2 packet_content_mask offset_16-31 0x0 0x0 0x0000002f 0x0 offset_48-63 0x0 0x0 0x00000011 0x0 offset_32-47 0x0 0x0 0x00890000 0x0 port 1 deny
config access_profile profile_id 1 add access_id 3 packet_content_mask offset_16-31 0x0 0x0 0x0000002f 0x0 offset_48-63 0x0 0x0 0x00000011 0x0 offset_32-47 0x0 0x0 0x008a0000 0x0 port 1 deny
config access_profile profile_id 1 add access_id 4 packet_content_mask offset_16-31 0x0 0x0 0x0000002f 0x0 offset_48-63 0x0 0x0 0x00000006 0x0 offset_32-47 0x0 0x0 0x008b0000 0x0 port 1 deny
config access_profile profile_id 1 add access_id 5 packet_content_mask offset_16-31 0x0 0x0 0x0000002f 0x0 offset_48-63 0x0 0x0 0x00000006 0x0 offset_32-47 0x0 0x0 0x01710000 0x0 port 1 deny
config access_profile profile_id 1 add access_id 6 packet_content_mask offset_16-31 0x0 0x0 0x0000002f 0x0 offset_48-63 0x0 0x0 0x00000006 0x0 offset_32-47 0x0 0x0 0x01bd0000 0x0 port 1 deny
config access_profile profile_id 1 add access_id 7 packet_content_mask offset_16-31 0x0 0x0 0x0000002f 0x0 offset_48-63 0x0 0x0 0x00000006 0x0 offset_32-47 0x0 0x0 0x02510000 0x0 port 1 deny
config access_profile profile_id 1 add access_id 8 packet_content_mask offset_16-31 0x0 0x0 0x0000002f 0x0 offset_48-63 0x0 0x0 0x00000011 0x0 offset_32-47 0x0 0x0 0x076c0000 0x0 port 1 deny
config access_profile profile_id 1 add access_id 9 packet_content_mask offset_16-31 0x0 0x0 0x0000002f 0x0 offset_48-63 0x0 0x0 0x00000006 0x0 offset_32-47 0x0 0x0 0x0b350000 0x0 port 1 deny
config access_profile profile_id 1 add access_id 10 packet_content_mask offset_16-31 0x0 0x0 0x0000002f 0x0 offset_48-63 0x0 0x0 0x00000006 0x0 offset_32-47 0x0 0x0 0x13880000 0x0 port 1 deny

Этот пример подходит для сетей ISP с использованием РРТР, а т.к. в таких сетях активно используется оборудование Wi-Fi, то он позволяет уберечь это оборудование, а так же другие (xDSL, и т.п.) линки от прохождения по ним ненужного трафика. К такому трафику относятся в этом случае все не поддерживаемые данным ISP сервисы, но поддерживаемые фирмой Microsoft и внедренные в ОС Microsoft Windows(tm) для организации и работы Windows Network. При можно уберечь линки не только от обычных Ethernet пакетов (как можно их фильтровать показано в примере №1), а так же сделать так чтобы данный трафик не проходил и в GRE туннелях.

Также можно запретить Broadcast-трафик в GRE:

create access_profile packet_content_mask offset_16-31 0x0 0x0 0x000000ff 0x0 offset_64-79 0x0 0x0000ffff 0xffff0000 0x0 profile_id 1
config access_profile profile_id 1 add access_id 1 packet_content_mask offset_16-31 0x0 0x0 0x0000002f 0x0 offset_64-79 0x0 0x0000ffff 0xffff0000 0x0 port 1 deny

Пример №3

Задача:

Необходимо заблокировать Broadcast-трафик на клиентских портах (для спасения Ваших радиоканалов или еще из каких либо административных или иных побуждений).

Решение:

Решить подобную задачу можно вот таким образом:

create access_profile ethernet destination_mac ff-ff-ff-ff-ff-ff ethernet_type profile_id 1
config access_profile profile_id 1 add access_id 1 ethernet destination_mac ff-ff-ff-ff-ff-ff ethernet_type 0x806 port 1 permit
config access_profile profile_id 1 add access_id 2 ethernet destination_mac ff-ff-ff-ff-ff-ff ethernet_type 0x800 port 1 deny

Тут, как Вы можете видеть, разрешается ARP Broadcast (это необходимо сделать для функционирования данного протокола!) и запрещается IP Broadacst. Кто-то может заметить: „Я использую DHCP для раздачи адресов и когда я воспользовался этим правилом все перестало работать!“, на что можно привести вот такой пример:

create access_profile packet_content_mask offset_16-31 0x0 0x0 0x000000ff 0x0 offset_32-47 0x0 0x0000ffff 0x0 0x0 profile_id 1
config access_profile profile_id 1 add access_id 1 packet_content_mask offset_16-31 0x0 0x0 0x00000011 0x0 offset_32-47 0x0 0x00000044 0x0 0x0 port 1 permit
config access_profile profile_id 1 add access_id 2 packet_content_mask offset_16-31 0x0 0x0 0x00000011 0x0 offset_32-47 0x0 0x00000043 0x0 0x0 port 1 deny

create access_profile ethernet destination_mac ff-ff-ff-ff-ff-ff ethernet_type profile_id 2
config access_profile profile_id 2 add access_id 1 ethernet destination_mac ff-ff-ff-ff-ff-ff ethernet_type 0x806 port 1 permit
config access_profile profile_id 2 add access_id 2 ethernet destination_mac ff-ff-ff-ff-ff-ff ethernet_type 0x800 port 1 deny

Т.е. необходимо разрешить на клиентских портах прохождение пакетов DHCP запросов (src port 68 UDP) и запретить прохождение DHCP ответов (src port 67 UDP) до блокирования Broadcast-трафика. Это очень важное замечание, т.к. порядок следования правил определяет очередность их действия и соответственно надо сначала разрешить нужный Вам Broadcast- трафик, а потом уже его запрещать. Profile_id 1 данного примера аналогичен примеру из FAQ. Если же Вам хочется фильтровать не по src, а по dst порту, то вспомнив, что DHCP пакеты ходят по схеме:

src port dst port
запрос:
67 -> 68
ответ: 68 -> 67

достаточно изменить access_profile 1 следующим образом:

create access_profile packet_content_mask offset_16-31 0xffff0000 0x0 0x000000ff 0x0 offset_32-47 0x0 0x0 0xffff0000 0x0 profile_id 1
config access_profile profile_id 1 add access_id 1 packet_content_mask offset_16-31 0x08000000 0x0 0x00000011 0x0 offset_32-47 0x0 0x0 0x00430000 0x0 port 1 permit
config access_profile profile_id 1 add access_id 2 packet_content_mask offset_16-31 0x08000000 0x0 0x00000011 0x0 offset_32-47 0x0 0x0 0x00440000 0x0 port 1 deny

где так же разрешается прохождение DHCP запросов (dst port 67 UDP) и запрещается прохождение DHCP ответов (dst port 68 UDP). Сюда же Вы можете вписать блокировку ненужных Вам как TCP так и UDP dst портов.

А вот так может выглядеть profile_id 2, на основе packet_content_mask, а не Ethernet заголовков:

create access_profile packet_content_mask offset_0-15 0xffffffff 0xffff0000 0x0 0x0 offset_16-31 0xffff0000 0x0 0x0 0x0 profile_id 2
config access_profile profile_id 2 add access_id 1 packet_content_mask offset_0-15 0xffffffff 0xffff0000 0x0 0x0 offset_16-31 0x08060000 0x0 0x0 0x0 port 1 permit
config access_profile profile_id 2 add access_id 2 packet_content_mask offset_0-15 0xffffffff 0xffff0000 0x0 0x0 offset_16-31 0x08000000 0x0 0x0 0x0 port 1 deny

В некоторых случаях правила на основе packet_content_mask действительно лучше чем обычные правила, для этого возьмем вот такой пример блокировки трафика генерируемого Microsoft Windows(tm):

create access_profile ip tcp dst_port_mask 0xffff profile_id 1
config access_profile profile_id 1 add access_id 1 ip tcp dst_port 135 port 1 deny
config access_profile profile_id 1 add access_id 2 ip tcp dst_port 139 port 1 deny
config access_profile profile_id 1 add access_id 3 ip tcp dst_port 369 port 1 deny
config access_profile profile_id 1 add access_id 4 ip tcp dst_port 445 port 1 deny
config access_profile profile_id 1 add access_id 5 ip tcp dst_port 593 port 1 deny
config access_profile profile_id 1 add access_id 6 ip tcp dst_port 2869 port 1 deny
config access_profile profile_id 1 add access_id 7 ip tcp dst_port 5000 port 1 deny

create access_profile ip udp dst_port_mask 0xffff profile_id 2
config access_profile profile_id 2 add access_id 1 ip udp dst_port 137 port 1 deny
config access_profile profile_id 2 add access_id 2 ip udp dst_port 138 port 1 deny
config access_profile profile_id 2 add access_id 3 ip udp dst_port 1900 port 1 deny

А вот так этот пример будет выглядеть при использовании правил на основе packet_content_mask:

create access_profile packet_content_mask offset_16-31 0x0 0x0 0x000000ff 0x0 offset_32-47 0x0 0x0 0xffff0000 0x0 profile_id 1
config access_profile profile_id 1 add access_id 1 packet_content_mask offset_16-31 0x0 0x0 0x00000006 0x0 offset_32-47 0x0 0x0 0x00870000 0x0 port 1 deny
config access_profile profile_id 1 add access_id 2 packet_content_mask offset_16-31 0x0 0x0 0x00000011 0x0 offset_32-47 0x0 0x0 0x00890000 0x0 port 1 deny
config access_profile profile_id 1 add access_id 3 packet_content_mask offset_16-31 0x0 0x0 0x00000011 0x0 offset_32-47 0x0 0x0 0x008a0000 0x0 port 1 deny
config access_profile profile_id 1 add access_id 4 packet_content_mask offset_16-31 0x0 0x0 0x00000006 0x0 offset_32-47 0x0 0x0 0x008b0000 0x0 port 1 deny
config access_profile profile_id 1 add access_id 5 packet_content_mask offset_16-31 0x0 0x0 0x00000006 0x0 offset_32-47 0x0 0x0 0x01710000 0x0 port 1 deny
config access_profile profile_id 1 add access_id 6 packet_content_mask offset_16-31 0x0 0x0 0x00000006 0x0 offset_32-47 0x0 0x0 0x01bd0000 0x0 port 1 deny
config access_profile profile_id 1 add access_id 7 packet_content_mask offset_16-31 0x0 0x0 0x00000006 0x0 offset_32-47 0x0 0x0 0x02510000 0x0 port 1 deny
config access_profile profile_id 1 add access_id 8 packet_content_mask offset_16-31 0x0 0x0 0x00000011 0x0 offset_32-47 0x0 0x0 0x076c0000 0x0 port 1 deny
config access_profile profile_id 1 add access_id 9 packet_content_mask offset_16-31 0x0 0x0 0x00000006 0x0 offset_32-47 0x0 0x0 0x0b350000 0x0 port 1 deny
config access_profile profile_id 1 add access_id 10 packet_content_mask offset_16-31 0x0 0x0 0x00000006 0x0 offset_32-47 0x0 0x0 0x13880000 0x0 port 1 deny

Как можно увидеть из этого примера использование правил на основе packet_content_mask позволяет уменьшить количество занимаемых правилами профилей без потери функционала ACL.

Выражаем благодарность за предоставленный материал Бочкарёву Павлу aka snark, г Новочеркасск.