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