В связи с открытием нового офиса пришлось задуматься о канале связи между сетями. На основном офисе в качестве шлюза используется 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. Создадим 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
Теперь переместимся на 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