Архив метки: cisco asa

Организация DMZ-подсети на cisco ASA 5510 или как мы переходили на Cisco ASA — часть 4

Приоритезацию трафика для voip и skype сделали, наступил следующий этап подготовки к переходу — организация DMZ-подсети. Сама по себе организация DMZ-подсети ничего сложного из себя не представляет: отдельный порт для отдельной физической сети с отдельной адресацией. Естественно, доступа из подсети DMZ в основную подсеть быть не должно, доступ же из основной сети в подсеть DMZ должен быть без ограничений. Еще несколько условий для нашей реализации DMZ:

  1. Не все сервера из DMZ могут свободно ходить в интернет;
  2. Некоторые сервера могут ходить только по определенным адресам;
  3. Некоторые сервера должны иметь полный доступ в интернет;
  4. Скорость доступа в интернет для всех серверов должна быть ограничена;
  5. К некоторым сервисам в локальной сети все же должен быть доступ из DMZ;

Собственно, начнем с начала :) То есть с конфигурирования интерфейса:

interface Ethernet0/1
 nameif DMZ
 security-level 99
 ip address 192.168.15.1 255.255.255.0
 no shutdown

Security-level 99 как раз и отвечает за то, чтобы клиенты из DMZ, по умолчанию, не могли достучаться до локальной сети (она у нас имеет security-level 100). Клиенты из локальной сети, при такой настройке, будут иметь доступ к ресурсам DMZ.

Интерфейс сконфигурирован, пора прописывать правила доступа. Для облегчения восприятия, назовем access-list FROMDMZ — очевидно, что действовать он будет на пакеты исходящие из сети DMZ. Несмотря на запрет доступа из сети с меньшим security-level в сеть с бОльшим, лучше после разрешений доступа в локальную сеть к определенным сервисам, указать явный запрет на весь трафик из DMZ в локальную сеть.

Напомню, что Cisco ASA обрабатывает списки доступа (access-list) до первого совпадения. Таким образом, разрешение в начале списка подействует раньше, чем запрет на весь трафик в конце списка.

Итак, разрешим доступ всей подсети DMZ к почтовым серверам и DNS-серверам во всей локальной сети:

access-list FROMDMZ extended permit tcp 192.168.15.0 255.255.255.0 192.168.0.0 255.255.248.0 eq smtp
access-list FROMDMZ extended permit udp 192.168.15.0 255.255.255.0 192.168.0.0 255.255.248.0 eq domain

Далее запретим весь остальной трафик из DMZ в локальную сеть:

access-list FROMDMZ extended deny ip 192.168.25.0 255.255.255.0 192.168.8.0 255.255.248.0

Разрешим доступ к внешним DNS-серверам:

access-list FROMDMZ extended permit udp any host 8.8.8.8 eq domain
access-list FROMDMZ extended permit udp any host 8.8.4.4 eq domain

Создадим object-group для серверов, которым необходим доступ в интернет без ограничений по адресам:

object-group network DMZ-TO-INTERNET
 network-object host 192.168.15.3
 network-object host 192.168.15.5
 network-object host 192.168.15.8

Чаще всего для разрешения доступа к чему-либо более чем для одного клиента удобнее использовать object-group. В списках доступа важен порядок следования правил и правило с конкретным object-group будет всегда на одном и том же месте. Добавление же новых правил в конкретное место — более сложная операция.

Разрешим им доступ:

access-list FROMDMZ extended permit tcp object-group DMZ-TO-INTERNET any
 access-list FROMDMZ extended permit udp object-group DMZ-TO-INTERNET any

Далее можно разрешать доступ к конкретным внешним IP-адресам и в конце добавить запрет для остального трафика.

access-list FROMDMZ extended permit ip host 192.168.15.23 host 1.2.3.4
 access-list FROMDMZ extended deny ip any any

Учитывая то, что на нашей Cisco ASA настроен костыль, похожий на PBR (см. часть 1), нам придется заставить железяку выбирать интерфейс для трафика из локальной сети в DMZ, иначе весь трафик, адресованный на порты 80, 443, 8080 и др. будет уходить не на тот интерфейс. Для этого достаточно добавить правило:

static (DMZ,LOCAL) 192.168.15.0 192.168.15.0 netmask 255.255.255.0

При рестарте устройства, который в идеале вообще не произойдет никогда, это правило может загрузиться раньше остальных и тогда трафик опять пойдет «не туда». К сожалению, ASA не сохраняет порядок следования правил static. В таком случае это правило надо удалить и добавить заново:

no static (DMZ,LOCAL) 192.168.15.0 192.168.15.0 netmask 255.255.255.0
static (DMZ,LOCAL) 192.168.15.0 192.168.15.0 netmask 255.255.255.0

Костыль, но с этим надо как-то жить… На этой позитивной ноте, переходим к ограничению скорости. Создадим object-group и access-list:

object-group network DMZ-LIMIT
network-object host 192.168.15.3
network-object host 192.168.15.5
network-object host 192.168.15.9
access-list DMZ-LIMIT extended deny ip object-group DMZ-LIMIT 192.168.0.0 255.255.248.0
access-list DMZ-LIMIT extended deny ip  192.168.0.0 255.255.248.0 object-group DMZ-LIMIT
access-list DMZ-LIMIT extended permit ip object-group DMZ-LIMIT any
access-list DMZ-LIMIT extended permit ip any  object-group DMZ-LIMIT

Певые две строчки access-list нужны для исключения трафика в локальную сеть и из нее из будущего ограничения скорости: нам надо ограничивать только скорость доступа в интернет

Создаем class-map и policy-map.

class-map DMZ-LIMIT
 match access-list DMZ-LIMIT
policy-map DMZ-LIMIT
 class DMZ-LIMIT
  police output 4000000 10000

И, наконец, применим все к интерфейсу.

access-group FROMDMZ in interface DMZ
service-policy DMZ-LIMIT interface DMZ

RacoonVPN + Cisco ASA 5510 = Site-to-site IPSEC vpn

В связи с открытием нового офиса пришлось задуматься о канале связи между сетями. На основном офисе в качестве шлюза используется Cisco ASA 5510. На дополнительном необходимо было использовать решение «побюджетнее», т.к. офис сам по себе временный. Остановились на debian 7 :) Задача была простая: обеспечить полноценную работу удаленного офиса — доступ как в основную сеть без дополнительных настроек для пользователей, так и в сеть DMZ. При пробросе двух сетей есть некоторые нюансы, о которых речь пойдет чуть ниже.

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

Материалов по устройству IPSEC VPN в сети предостаточно. Вкратце могу напомнить, что есть 2 фазы установки соединения: защищенное IKE соединение и, собственно, ipsec-туннель.

Имеем:

  • Адреса локальной сети — 192.168.0.0/21
  • Адреса DMZ — 192.168.15.0/24
  • Адреса удаленного офиса — 192.168.30.0

Версия ПО на cisco asa — 8.2

Итак, приступим к настройкам на стороне Cisco. Создадим object-group для локальных сетей — так удобнее их добавлять/удалять в случае необходимости:

object-group network OUR-SUBNETS
 network-object 192.168.15.0 255.255.255.0
 network-object 192.168.0.0 255.255.248.0

Создадим access-list для выделения необходимого нам трафика:

access-list ISP1_cryptomap extended permit ip object-group OUR-SUBNETS 192.168.30.0 255.255.255.0

Пропишем параметры isakmp и ipsec, создадим crypto-map, transfrom-set и tunnel-group, укажем pre-shared-key:

crypto isakmp policy 10
 authentication pre-share
 encryption aes-256
 hash sha
 group 5
 lifetime 86400
crypto isakmp identity address
crypto isakmp enable ISP1
crypto ipsec transform-set ESP-AES-256-SHA esp-aes-256 esp-sha-hmac
crypto ipsec security-association lifetime seconds 28800
crypto ipsec security-association lifetime kilobytes 4608000
tunnel-group aaa.bbb.ccc.xxx type ipsec-l2l
tunnel-group aaa.bbb.ccc.xxx ipsec-attributes
 pre-shared-key A_VeRy_SeCuRe_KeY 
crypto map ISP1 1 match address ISP1_cryptomap
crypto map ISP1_map 1 set peer aaa.bbb.ccc.xxx
crypto map ISP1_map 1 set transform-set ESP-AES-256-SHA
crypto map ISP1_map interface ISP1

Не забываем прописать правило для NAT 0:

access-list LANVPN extended permit ip 192.168.30.0 255.255.255.0 192.168.0.0 255.255.248.0
access-list LANVPN extended permit ip 192.168.0.0 255.255.248.0 192.168.30.0 255.255.255.0
access-list DMZVPN extended permit ip 192.168.30.0 255.255.255.0 192.168.15.0 255.255.255.0
access-list DMZVPN extended permit ip 192.168.15.0 255.255.255.0 192.168.30.0 255.255.255.0
nat (LOCAL) 0 access-list LANVPN
nat (DMZ) 0 access-list DMZVPN

При настройке соединения на linux будет лучше отключить firewall совсем — проще дебажить

Теперь переместимся на debian. Начнем с установки необходимого софта.

apt-get install racoon ipsec-tools

Отредактируем в соответствии с выбранными параметрами /etc/racoon/racoon.conf:

path pre_shared_key "/etc/racoon/psk.txt";


padding {
    maximum_length 20;  # maximum padding length.
    randomize off;      # enable randomize length.
    strict_check off;   # enable strict check.
    exclusive_tail off; # extract last one octet.
}

listen {
    isakmp bbb.ccc.ddd.xxx[500];
}

timer {
    # These value can be changed per remote node.
    counter 5;          # maximum trying count to send.
    interval 10 sec;    # maximum interval to resend.
    persend 1;          # the number of packets per a send.

    # timer for waiting to complete each phase.
    phase1 30 sec;
    phase2 15 sec;

}

log warning;


remote aaa.bbb.ccc.ddd {
    my_identifier address bbb.ccc.ddd.xxx;
    peers_identifier address aaa.bbb.ccc.ddd;
    exchange_mode main;
    initial_contact on;
    doi ipsec_doi;
    proposal_check claim; 
    lifetime time 24 hour;
    proposal {
        encryption_algorithm aes 256;
        hash_algorithm sha1;
        authentication_method pre_shared_key;
        dh_group 5;
    }
    generate_policy off;
    nat_traversal on;
    passive off;
    dpd_delay 30; 
}

sainfo subnet 192.168.30.0/24 any subnet 192.168.0.0/21 any {
    encryption_algorithm aes 256;
    authentication_algorithm hmac_sha1;
    compression_algorithm deflate;
    lifetime time 24 hour; 
}

sainfo subnet 192.168.30.0/24 any subnet 192.168.15.0/24 any {
    encryption_algorithm aes 256;
    authentication_algorithm hmac_sha1;
    compression_algorithm deflate;
    lifetime time 24 hour;
}

Впишем наш pre-shared key в файл /etc/racoon/psk.txt:

# IPv4/v6 addresses
aaa.bbb.ccc.ddd A_VeRy_SeCuRe_KeY

Отредактируем /etc/ipsec-tools.conf:

#!/usr/sbin/setkey -f

# NOTE: Do not use this file if you use racoon with racoon-tool
# utility. racoon-tool will setup SAs and SPDs automatically using
# /etc/racoon/racoon-tool.conf configuration.
#

## Flush the SAD and SPD
#
 flush;
 spdflush;

 spdadd 192.168.30.0/24[any] 192.168.0.0/21[any] any -P out ipsec esp/tunnel/bbb.ccc.ddd.xxx-aaa.bbb.ccc.ddd/require;
 spdadd 192.168.0.0/21[any] 192.168.30.0/24[any] any -P in ipsec esp/tunnel/aaa.bbb.ccc.ddd-bbb.ccc.ddd.xxx/require;

 spdadd 192.168.30.0/24[any] 192.168.15.0/24[any] any -P out ipsec esp/tunnel/bbb.ccc.ddd.xxx-aaa.bbb.ccc.ddd/unique;
 spdadd 192.168.15.0/24[any] 192.168.30.0/24[any] any -P in ipsec esp/tunnel/aaa.bbb.ccc.ddd-bbb.ccc.ddd.xxx/unique; 

Есть один очень важный нюанс: при создании туннеля для 2 и более подсетей, только у одной подсети может быть указан параметр require в ipsec-tools.conf. У остальных он должен быть unique. Иначе будет поднят туннель только для одной подсети. Много времени ушло на то, чтобы выяснить эту маленькую особенность…

Перезапускаем racoon и setkey:

/etc/init.d/setkey restart
/etc/init.d/racoon restart

Прописываем маршруты:

route add -host aaa.bbb.ccc.ddd dev eth1
ip route add 192.168.0.0/21 via aaa.bbb.ccc.ddd
ip route add 192.168.15.0/24 via aaa.bbb.ccc.ddd
route del aaa.bbb.ccc.ddd dev eth1

И, если никаких ошибок и очепяток допущено не было, идем отдыхать. Если же туннель не поднимается — начинаем построчно сравнивать конфиги на линуксе и cisco. Полезно также будет включить debug в конфиге racoon (log debug; вместо log warning;) и проверить логи.

Проверить статус туннеля на cisco можно командой sh ipsec sa. Мы должны увидеть что-то вроде:

interface: ISP1
    Crypto map tag: ISP1_map, seq num: 1, local addr: aaa.bbb.ccc.ddd

      access-list ISP1_cryptomap extended permit ip 192.168.0.0 255.255.248.0 192.168.30.0 255.255.255.0
      local ident (addr/mask/prot/port): (192.168.0.0/255.255.248.0/0/0)
      remote ident (addr/mask/prot/port): (192.168.30.0/255.255.255.0/0/0)
      current_peer: bbb.ccc.ddd.xxx

      #pkts encaps: 162550535, #pkts encrypt: 162550493, #pkts digest: 162550493
      #pkts decaps: 84864900, #pkts decrypt: 84864899, #pkts verify: 84864899
      #pkts compressed: 0, #pkts decompressed: 0
      #pkts not compressed: 162550536, #pkts comp failed: 0, #pkts decomp failed: 0
      #pre-frag successes: 5, #pre-frag failures: 47, #fragments created: 10
      #PMTUs sent: 47, #PMTUs rcvd: 1, #decapsulated frgs needing reassembly: 0
      #send errors: 0, #recv errors: 0

      local crypto endpt.: aaa.bbb.ccc.ddd, remote crypto endpt.: bbb.ccc.ddd.xxx

      path mtu 1492, ipsec overhead 74, media mtu 1500
      current outbound spi: 0351F3AB
      current inbound spi : 462D7034

    inbound esp sas:
      spi: 0x462D7034 (1177382964)
         transform: esp-aes-256 esp-sha-hmac no compression
         in use settings ={L2L, Tunnel, }
         slot: 0, conn_id: 4915200, crypto-map: ISP1_map
         sa timing: remaining key lifetime (sec): 13076
         IV size: 16 bytes
         replay detection support: Y
         Anti replay bitmap:
          0xFFFFFFFF 0xFFFFFFFF
    outbound esp sas:
      spi: 0x0351F3AB (55702443)
         transform: esp-aes-256 esp-sha-hmac no compression
         in use settings ={L2L, Tunnel, }
         slot: 0, conn_id: 4915200, crypto-map: ISP1_map
         sa timing: remaining key lifetime (sec): 13076
         IV size: 16 bytes
         replay detection support: Y
         Anti replay bitmap:
          0x00000000 0x00000001

Tracert через Cisco ASA виндовым клиентом

В диагностике сетевых проблем сложно переоценить пользу такой простой утилиты как tracert (traceroute). Все мы знаем, что она в своей работе опирается на протокол icmp. И вполне логичным кажется обеспечение работы этого протокола на cisco asa путем «волшебного» inspect icmp. Однако, в случае с tracert это не помогает. Для ее нормального функционирования, необходимо разрешить на внешнем интерфейсе icmp типа time-exceeded от any к any:

access-list FROMOUTSIDE extended permit icmp any any time-exceeded
access-group FROMOUTSIDE in interface OUTSIDE

Только после этого вас ожидает полностью рабочий tracert.

Решение найдено здесь: http://www.cisco.com/en/US/products/hw/vpndevc/ps2030/products_tech_note09186a0080094e8a.shtml

Приоритезация трафика voip и skype на cisco asa 5510 или как мы переходили на Cisco ASA — часть 3

При большом количестве людей и отсутствии нормального, полноценного PBR (policy-based routing) на cisco asa, каким-то образом необходимо уменьшить потенциальные «тормоза» в передаче звука и видео по скайпу с компьютеров в переговорных комнатах, а также звука с ip-телефонов. Обладатели cisco-роутеров удивятся «сложности» постановки задачи. В роутерах практически любой трафик можно выделять по протоколу (match protocol skype и др.). Но не тут-то было. ASA «знает» только самые распространенные протоколы типа http, ftp и др. Также, она умеет выделять трафик по регулярным выражениям, но описать регулярными выражениями трафик скайпа довольно сложно.

Решение, в общем-то, нашлось довольно быстро. С наших IP-телефонов никакой трафик кроме голосового идти не может, поэтому приоритет будет отдаваться всему трафику с их айпишников. Для упрощения дальнейшего администрирования, самый простой способ — добавить все эти адреса в object-group.

object-group network IPPHONES
network-object host 192.168.1.25
network-object host 192.168.1.26

Далее создаем access-list:

 access-list IPPHONES extended permit ip object-group IPPHONES any

Этот access-list мы используем в class-map:

class-map IPPHONES
match access-list IPPHONES

А class-map, в свою очередь, в policy-map:

policy-map LOCAL
 class IPPHONES
  priority

Таким образом, при дополнении этого policy-map политиками ограничения скорости для других типов трафика, мы отдадим приоритет исходящему трафику с телефонов.

С трафиком скайпа в переговорных комнатах можно поступить таким же образом (выдать приоритет всему трафику), но в нашем случае нашелся более изящный вариант. В переговорных комнатах установлены компьютеры под управлением ОС Windows и они входят в домен. При помощи групповых политик можно назначать значения DSCP трафику, генерируемому конкретными приложениями. Для этого надо создать новую политику QoS (Computer Configuration -> Windows Settings -> Policy-based QoS) в новом объекте (или в одном из существующих) групповой политики и назначить эту групповую политику на необходимый нам OU. В политике QoS необходимо выставить отличное от нуля (например, 1) значение DSCP для трафика TCP и UDP, генерируемого приложением skype.exe. После этого мы можем создать class-map для выделения этого трафика из потока:

class-map SKYPE
 match dscp 1

И добавить этот класс в наш policy-map:

policy-map LOCAL
 class SKYPE
  priority

И не забываем применять policy-map к интерфейсу:

 service-policy LOCAL interface LOCAL

В итоге мы получаем минимальные задержки для интересующего нас трафика довольно простыми методами.

Ограничение скорости интернета для пользователей на Cisco ASA 5510 или как мы переходили на Cisco ASA — часть 2

Итак, с PBR на Cisco ASA кое-как разобрались. Пришло время взяться за ограничение скорости для пользователей. На дебиане оно было реализовано просто и эффективно: при помощи iptables + htb у всех были выставлены минимальная (гарантированная) и максимальная скорость. Все были довольны, всем всего хватало. По необходимости, скорость конкретным пользователям весьма просто увеличивалась или уменьшалась.

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

Первый и, как мне кажется, более правильный способ — шейпинг трафика (traffic shaping). Его прелесть в том, что при превышении разрешенной скорости пакеты не отбрасываются, а по возможности складываются в буфер, откуда в дальнейшем отправляются в точку назначения. Это может вносить небольшие задержки (которые зависят от размера буфера и наличия высокоприоритетного трафика), но при этом мы можем отдавать приоритет определенному (например, голосовому) трафику и передавать его максимально быстро. Шейпинг трафика может быть применен только по отношению к исходящим пакетам.

Второй способ — traffic policing. Основное его отличие от шейпинга состоит в отсутствии буфера, т.е. «лишние» пакеты просто отбрасываются. Еще одним отличием от шейпинга является то, что он может применяться как к входящим пакетам, так и к исходящим. Несмотря на отсутствие буфера, приоритезация трафика возможна и в этом случае. Осуществляется она благодаря использованию очереди LLQ (Low-latency queuing). Отличие от шейпинга в данном случае состоит в том, что задержки для любого типа трафика будут ниже, но при этом возможность потери пакетов гораздо выше.

С точки зрения качества обслуживания, было бы неплохо использовать шейпинг трафика. Но тут кроется основная проблема: ASA умеет шейпить трафик только для class-default, т.е. весь трафик, да и то только исходящий. По сути, эта «фишка» реализована тут только для приближения скорости передаваемых данных к ширине канала — передать максимум, пусть и с задержками, потерять минимум.

Таким образом, ограничить входящую скорость всем и каждому мы можем только при помощи полисинга. При этом, если мы желаем ограничить скорость именно для каждого айпишника, нам придется создать по одному acl (access-list) на каждый адрес. Далее, для каждого acl необходимо создать class-map. Вот тут-то и кроется загвоздка. Общее количество class-map’ов в ASA ограничено числом 255. Если общее количество работников/серверов превышает это значение, то вы не сможете ограничить всех и каждого. Так или иначе придется разбивать всех по определенным группам и выставлять скорость уже для группы. При этом, естественно, любители скачивать торренты будут «отбирать» у группы больше скорости, чем было в случае iptables + htb — соответственно качество обслуживания остальных будет ниже.

Рассмотрим конкретный пример ограничения входящей скорости до 10 Мбит/с.

Создать access-list для интересующих нас адресов (сеть 192.168.1.0/24):

access-list LIMITED extended permit tcp any 192.168.1.0 255.255.255.0

Создать соответствующий class-map:

class-map LIMITED
match access-list LIMITED

Создать policy-map:

policy-map LIMITED
class LIMITED
police output 10000000

И применить его к интерфейсу локальной сети:

service-policy LIMITED interface LOCAL

Несколько пояснений по вышеуказанной конфигурации:

  • направление трафика output соответствует трафику, исходящему с интерфейса внутрь сети, т.е. в нашем случае это будет входящий трафик из интернета;
  • скорость для полисинга указывается в битах в секунду;
  • policy-map применяется для локального интерфейса, т.к. на внешнем интерфейсе у нас будут видны только адреса, которые прошли через NAT;

Такой вариант ограничения скорости может быть хорошим в том случае, если список адресов, у которых скорость ограничена всегда укладывается в одну подсеть или редко меняется. На практике такое встречается не часто и поэтому гораздо удобнее пользоваться группами объектов. В группы можно добавлять адреса по одному или целыми подсетями. При этом, два одинаковых адреса добавить не получится (чего не скажешь о двух одинаковых правилах access-list). Создадим группу и добавим в нее несколько хостов:

object-group network LIMITED
network-object host 192.168.1.5
network-object host 192.168.1.7
network-object host 192.168.1.8

Создадим access-list для этой группы:

access-list LIMITED extended permit tcp any object-group LIMITED

Если же нам необходимо исключить из полисинга какой-то трафик (к примеру, трафик DMZ-сети), то мы должны добавить соответствующий access-list с действием deny до этого правила. Выглядеть это будет примерно так (допустим, DMZ-сеть имеет адреса 192.168.15.0/24):

access-list LIMITED extended deny tcp 192.168.15.0 255.255.255.0 object group LIMITED
access-list LIMITED extended permit tcp any object-group LIMITED

После этого применим такие же class-map и policy-map, которые были рассмотрены выше и сохраним конфигурацию краткой командой wr. При необходимости, можно посмотреть статистику полисинга:

show service-policy police

Эта команда выведет данные по ограничению скорости для каждого class-map, перечисленного в policy-map.

На этом простая настройка ограничения скорости завершена.