Архив за месяц: Май 2014

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

Zabbix и счетчики производительности (perf counters)

Понадобилось недавно мониторить некоторые параметры виндовых серверов. Т.к. система мониторинга, а именно Zabbix, уже была установлена и активно использовалась, решено было не изобретать велосипед и попользовать ее с этой целью. Благо, по заверениям разработчиков, она это легко умеет. Все было бы легко, если бы документация по этому вопросу была полноценной.

Стоит начать с того, что имя счетчика пишется в двойных кавычках, начиная с бэкслэша (\). В точности так, как выводит его команда typeperf -qx. Т.е. правильный вид для мониторинга загрузки всех ядер CPU будет выглядеть примерно так:

perf_counter["\Processor(_Total)\% Processor Time"]

Все бы ничего, но при вводе такого счетчика и довольных мыслях («ща всё замониторю с красивыми графиками») мы получаем ответ от заббикса в виде Not supported. Начинаем долго и нудно гуглить по этому вопросу и никак не натыкаемся на ответ. В качестве одной из предполагаемых причин такого поведения может быть запуск 32-битного агента на 64-битном хосте. Но даже при запуске правильного, 64-битного клиента, мы не получаем удовлетворения и видим Not supported.

А все потому, что по умолчанию, у вновь создаваемых элементов (item) мониторинга выставлен тип информации (type of information) — numeric(unsigned). Казалось бы, ничего в этом страшного нет. Загрузка процессора не может быть отрицательной. Так и есть. Но почему-то, разработчики заббикса посчитали, что под понятие numeric(unsigned) попадают ТОЛЬКО целые числа. О чем, в принципе, они честно сообщают в докахNumeric (unsigned) — 64bit unsigned integer. Выставляем numeric(float) и тихо радуемся работающему мониторингу.