Архив рубрики: IPSEC

Route-based IPSEC VPN между Ubuntu 18.04 (libreswan) и Cisco Router. Часть 2

В этой статье (часть первую можно прочитать здесь) я опишу процесс настройки Cisco роутера на примере Cisco ISR 4331 для целей создания нашего VPN-соединения. Как мы помним, конечная цель настройки — отправлять интересующий нас трафик через VPN-туннель.

Для примера, я опишу настройку Cisco для отправки всего трафика к определенным серверам через туннель (например, для обхода блокировок по стране). Начнем с создания object-group — так в дальнейшем будет проще добавлять новые адреса назначения и сразу добавим туда адрес сервера, к которому надо ходить через туннель:

object-group network TOVPN
 host 3.3.3.3

Далее создаем ip access-list, которым мы будем ловить интересующий нас трафик:

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

Переходим к непосредственной настройке VPN:

crypto keyring VPN
 pre-shared-key address 11.11.11.11 key %908A2R5vX9O694aoxh1

crypto isakmp profile VPN
 keyring VPN
 match identity address 11.11.11.11 255.255.255.255

crypto ipsec transform-set ESP-AES256-SHA1 esp-aes 256 esp-sha-hmac
 mode tunnel

crypto ipsec profile VPN
 set transform-set ESP-AES256-SHA1

crypto isakmp policy 10
 encr aes 256
 authentication pre-share
 group 5

В этом коротком и всем понятном блоке указаны все необходимые данные по нашему VPN-соединению (в соответствии с первой частью статьи).

Далее необходимо создать виртуальный интерфейс, через который мы будем делать туннель.

interface Tunnel0
 ip address 172.16.0.21 255.255.255.252
 tunnel source 22.22.22.22
 tunnel mode ipsec ipv4
 tunnel destination 11.11.11.11
 tunnel protection ipsec profile VPN
 ip tcp adjust-mss 1300

Для корректной передачи данных по туннелю, чтобы в стандартный MTU пролазил пакет с «оберткой IPSEC» — нам необходимо ограничить размер MTU на интерфейсе. Делается это командой ip tcp adjust-mss MTU. В данном примере установлен MTU — 1300. Число 1300 не подбиралось экспериментальным путем, а было установлено таким, чтобы точно подходило в любых конфигурациях. На самом деле, вам, скорее всего, достаточно будет указать 1376. Если этого не сделать — обратный трафик будет проходить «частично». Если быть более точным — другой конец нашего туннеля при получении «ответных» пакетов (на наш трафик через туннель) «нормального» размера (т.е. 1476 байт) не сможет отправить их через туннель из-за превышения размера MTU. При этом мелкие пакеты будут бегать туда-сюда без особых проблем. Например, пинг и трэйсроут будут показывать наличие связи, а странички из интернета грузиться не будут.

Итак, туннель поднят, осталось отправить в него трафик. Для этого задействуем route-map:

route-map LOCAL permit 10
 match ip address TOVPN
 set interface Tunnel0

Не забываем применить этот route map к интерфейсу, к которому подключена локальная сеть.

Если все сделано по инструкции, но туннель не поднялся, проверяем:
— разрешен ли доступ снаружи к маршрутизатору по протоколам udp и gre;
— разрешен ли маршрутизатору доступ в сеть по протоколам udp и gre;

Если туннель поднялся, но трафик в него не ходит (или обратно не приходит):
— пробуем сделать ipsec restart на сервере с ubuntu;
— проверяем правила доступа с интерфейса Tunnel0 и на него (выбрана ли правильная зона для ZBFW при его использовании).

Route-based IPSEC VPN между Ubuntu 18.04 (libreswan) и Cisco Router

В корпоративном секторе, особенно в больших компаниях с более, чем одним офисом зачастую возникает необходимо в site-to-site VPN-соединениях. Конечно, большинство провайдеров предлагает вам «прямую связь» через их оборудование. Но как-то так сложилось, что надежность этого решения зависит только от самого провайдера и из-за некорректных действий одного-единственного админа может зависеть целостность вашей сети. Такие объединения сетей частенько выполняются просто на уровне отдельного тегированного VLAN. И если кто-то внезапно (вполне может быть по неосторожности) скрестит вашу сеть с другими или просто снимет теги на портах — вы рискуете получить в свою сеть трафик от многих клиентов провайдера, а они, в свою очередь, получат беспрепятственный доступ в вашу сеть. Именно по этой причине доверять стоит только собственноручно поднятому IPSEC VPN. Если что-то пойдет не так — VPN просто развалится и сети будут изолированы друг от друга.

В каких случаях Route-based VPN удобнее, чем обычный site-to-site? Например, если вы хотите предоставить N хостам из одной сети доступ к ресурсам в другой сети, но создавать для этого клиентские соединения неудобно. Также, если у вас много подсетей с одной из сторон (или с обеих) и вы не хотите плодить IPSEC SA (как произойдет в случае обычного Policy-based IPSEC VPN). Или, например, вы хотите пробросить весь трафик нескольких клиентов через роутер в другой стране. Во всех этих случаях полезно и удобно будет использовать Route-based VPN.

Итак, начнем с оборудования. В моем случае это был Cisco Router серии ASR с одной стороны и сервер с Ubuntu 18.04 с другой. Цель — пустить трафик N клиентов в интернет через удаленный сервер. Начнем с Ubuntu:

  1.  Установим libreswan.
    apt-get install libreswan
  2. Разрешим форвардинг пакетов и отключим редиректы.
    echo "net.ipv4.ip_forward = 1" | tee -a /etc/sysctl.conf
    echo "net.ipv4.conf.all.accept_redirects = 0" | tee -a /etc/sysctl.conf
    echo "net.ipv4.conf.all.send_redirects = 0" | tee -a /etc/sysctl.conf
    for vpn in /proc/sys/net/ipv4/conf/*; do echo 0 > $vpn/accept_redirects; echo 0 > $vpn/send_redirects; done
  3. Применим настройки.
    sysctl -p
  4. Создадим в /etc/ipsec.d/ файл с конфигурацией нашего VPN и поместим в него следующий контент:
    nano /etc/ipsec.d/route-based-ipsec-vpn.conf
    
    config setup
        protostack=netkey
    conn vpn
        authby=secret
        pfs=no
        rekey=yes
        keyingtries=3
        type=tunnel
        auto=start
        ike=aes256-sha1;modp1536
        phase2alg=aes256-sha1;modp1536
        left=11.11.11.11
        right=22.22.22.22
        leftsubnet=0.0.0.0/0
        rightsubnet=0.0.0.0/0
        mark=5/0xffffffff
        vti-interface=vti01
        vti-routing=no

    Если один из ваших роутеров находится за NAT (например left), вам необходимо заменить в директиве left адрес на внутренний адрес интерфейса (left=10.0.0.1) и добавить директиву leftid с реальным адресом (leftid=11.11.11.11).  И, конечно, пробросить порты UDP 500, 1701 и 5000 на этот роутер. В противном случае туннель не поднимется.

    Краткие пояснения по конфигурационному файлу:
    authby=secret — авторизация по паролю, а не по сертификатам;
    vti-interface=vti01 — интерфейс, который будет создан автоматически при создании туннеля;
    vti-routing=no — не создавать маршруты на интерфейс туннеля автоматически.

  5. Далее необходимо придумать сгенерировать стойкий пароль на много символов (все равно вам его запоминать не надо) и внести его в файл.
    nano /etc/ipsec.d/route-based-ipsec-vpn.secrets
    
    11.11.11.11 22.22.22.22: PSK "%908A2R5vX9O694aoxh1"
  6. Делаем ipsec restart и ipsec verify. После ipsec verify у нас должно появиться что-то типа этого:
    Verifying installed system and configuration files
    
    Version check and ipsec on-path                         [OK]
    Libreswan 3.23 (netkey) on 4.15.0-1021-aws
    Checking for IPsec support in kernel                    [OK]
     NETKEY: Testing XFRM related proc values
             ICMP default/send_redirects                    [OK]
             ICMP default/accept_redirects                  [OK]
             XFRM larval drop                               [OK]
    Pluto ipsec.conf syntax                                 [OK]
    Two or more interfaces found, checking IP forwarding    [OK]
    Checking rp_filter                                      [ENABLED]
     /proc/sys/net/ipv4/conf/all/rp_filter                  [ENABLED]
     /proc/sys/net/ipv4/conf/default/rp_filter              [ENABLED]
     /proc/sys/net/ipv4/conf/eth0/rp_filter                 [ENABLED]
     /proc/sys/net/ipv4/conf/ip_vti0/rp_filter              [ENABLED]
      rp_filter is not fully aware of IPsec and should be disabled
    Checking that pluto is running                          [OK]
     Pluto listening for IKE on udp 500                     [OK]
     Pluto listening for IKE/NAT-T on udp 4500              [OK]
     Pluto ipsec.secret syntax                              [OK]
    Checking 'ip' command                                   [OK]
    Checking 'iptables' command                             [OK]
    Checking 'prelink' command does not interfere with FIPS [OK]
    Checking for obsolete ipsec.conf options                [OK]
    

    Если failed нигде не написано — можно жить.

  7. Заставляем трафик прятаться за айпишник нашего интерфейса при выходе наружу (в данном примере внешний интерфейс — eth0) при помощи iptables:
    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
  8. Прописываем маршруты в нашу удаленную сеть (предположим, что на другом конце есть сети 192.168.0.0/24 и 192.168.10.0/24).
    ip route add 192.168.0.0/24 dev vti01
    ip route add 192.168.10.0/24 dev vti01
  9. На этом этапе настройка Ubuntu закончена и мы переходим к настройке Cisco ASR. Продолжение следует (линк на него будет в конце этой статьи).

При написании этого материала помог личный опыт, статья https://libreswan.org/wiki/Route-based_VPN_using_VTI и гугл.

UPD: Для автоматического прописывания маршрутов можно воспользоваться конфигурацией netplan. Для этого необходимо внести изменения в файл /etc/netplan/50-cloud-init.yaml:

        vti01:
dhcp4: no
addresses: [172.16.0.22/30]
routes:
- to: 192.168.0.0/24
via: 172.16.0.22
- to: 192.168.10.0/24
via: 172.16.0.22

Не забудьте применить изменения командой netplan apply

В этом случае интерфейсу vti01 назначается ip-адрес и через него прописываются маршруты в наши подсети.

Вторая часть статьи с настройкой туннеля ждет вас здесь: https://kulmaks.by/route-based-ipsec-vpn-%d0%bc%d0%b5%d0%b6%d0%b4%d1%83-ubuntu-18-04-libreswan-%d0%b8-cisco-router-%d1%87%d0%b0%d1%81%d1%82%d1%8c-2/

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