Как прокинуть туннель VPN с использованием IPsec на FreeBSD я уже рассказывал - вот ссылка. Поэтому повторять все подряд не буду. Данный конкретный топик посвящен ситуации несколько более сложной, чем была описана. Здесь мы рассмотрим - что делать, если соединять необходимо не 2 подсети, а сразу несколько. А так-же - что делать, если FreeBSD - это центральный маршрутизатор, который роутит подсети более высокого класса, чем на другой стороне, но при этом подсети на другой стороне входят в этот класс.
Ситуация 1. Настраиваемый FreeBSD - это центральный маршрутизатор.Условия:
- Сети на стороне настраиваемого FreeBSD: 10.0.0.0/16 (т.е. все класса 10.0B)
- Удаленная подсеть (через IPsec): 10.0.15.0/24
- Внешний IP местного центрального шлюза: 88.77.66.55
- Внешний IP удаленного филиала: 55.44.33.22
В данном сценарии: настраиваемый маршрутизатор - это центральный роутер, к которому стекаются потоки через другие VPN, через оптоволокно, медные каналы связи и т.д. Поэтому он маршрутизирует кучу подсетей (для примера, пусть это будут подсети 10.0.1.0/24, 10.0.2.0/24, 10.0.3.0/24 и т.д.) И среди прочего к ему нужно прокинуть VPN канал IPsec с подсетью 10.0.15.0/24.
Итак, как видно - у нас есть маааленький нюансик: подсеть 10.0.15.0/24 входит в подсеть 10.0.0.0/16.
Вот конфиги racoon.conf и ipsec.conf, соответствующие данной ситуации (не всякий случай уточню - это рабочие конфиги с измененными IP адресами, т.е. по ним все работает).
racoon.conf:
path include "/usr/local/etc/racoon";
path pre_shared_key "/usr/local/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 88.77.66.55 [500];
}
# Specify various default timers.
timer
{
counter 5; # maximum trying count to send.
interval 20 sec; # maximum interval to resend.
persend 1; # the number of packets per send.
phase1 30 sec;
phase2 15 sec;
}
#############
# NET 1
#############
remote 55.44.33.22
{
exchange_mode main,base;
lifetime time 28800 sec;
generate_policy on;
proposal_check strict;
proposal {
encryption_algorithm 3des;
hash_algorithm sha1;
authentication_method pre_shared_key;
dh_group 2;
}
}
sainfo subnet 10.0.0.0/16 any address 10.0.15.0/24 any
{
lifetime time 28800 sec;
encryption_algorithm aes128, 3des, cast128, blowfish 448, des, rijndael;
authentication_algorithm hmac_md5, hmac_sha1;
compression_algorithm deflate;
}
ipsec.conf:
flush;
spdflush;
spdadd 10.0.0.0/16 10.0.15.0/24 any -P out ipsec esp/tunnel/88.77.66.55-55.44.33.22/unique;
spdadd 10.0.15.0/24 10.0.0.0/16 any -P in ipsec esp/tunnel/55.44.33.22-88.77.66.55/unique;
Ситуация 2. Настраиваемый FreeBSD - центральный роутер, но на стороне филиала несколько подсетей.Условия:
- Сети на стороне настраиваемого FreeBSD: 10.0.0.0/16 (т.е. все класса 10.0B)
- Удаленные подсети (через IPsec): 10.0.15.0/24, 10.0.16.0/24
- Внешний IP местного центрального шлюза: 88.77.66.55
- Внешний IP удаленного филиала: 55.44.33.22
Конфиги очень похожи.
racoon.conf:
path include "/usr/local/etc/racoon";
path pre_shared_key "/usr/local/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 88.77.66.55 [500];
}
# Specify various default timers.
timer
{
counter 5; # maximum trying count to send.
interval 20 sec; # maximum interval to resend.
persend 1; # the number of packets per send.
phase1 30 sec;
phase2 15 sec;
}
#############
# BRANCH 1; NETS 15, 16
#############
remote 55.44.33.22
{
exchange_mode main,base;
lifetime time 28800 sec;
generate_policy on;
proposal_check strict;
proposal {
encryption_algorithm 3des;
hash_algorithm sha1;
authentication_method pre_shared_key;
dh_group 2;
}
}
sainfo subnet 10.0.0.0/16 any address 10.0.15.0/24 any
{
lifetime time 28800 sec;
encryption_algorithm aes128, 3des, cast128, blowfish 448, des, rijndael;
authentication_algorithm hmac_md5, hmac_sha1;
compression_algorithm deflate;
}
sainfo subnet 10.0.0.0/16 any address 10.0.16.0/24 any
{
lifetime time 28800 sec;
encryption_algorithm aes128, 3des, cast128, blowfish 448, des, rijndael;
authentication_algorithm hmac_md5, hmac_sha1;
compression_algorithm deflate;
}
ipsec.conf:
flush;
spdflush;
spdadd 10.0.0.0/16 10.0.15.0/24 any -P out ipsec esp/tunnel/88.77.66.55-55.44.33.22/unique;
spdadd 10.0.15.0/24 10.0.0.0/16 any -P in ipsec esp/tunnel/55.44.33.22-88.77.66.55/unique;
spdadd 10.0.0.0/16 10.0.16.0/24 any -P out ipsec esp/tunnel/88.77.66.55-55.44.33.22/unique;
spdadd 10.0.16.0/24 10.0.0.0/16 any -P in ipsec esp/tunnel/55.44.33.22-88.77.66.55/unique;
Ситуация 3. Настраиваемый роутер FreeBSD - это шлюз филиала.Условия:
- Сети на стороне настраиваемого FreeBSD: 10.0.15.0/24, 10.0.16.0/24
- Удаленные подсети (через IPsec): 10.0.0.0/16 (все через центральный шлюз)
- Внешний IP местного роутера филиала: 55.44.33.22
- Внешний IP удаленного центрального роутера: 88.55.44.33
Как видим, здесь ситуация поменялась на обратную - мы настраиваем роутер FreeBSD, находящийся на стороне филиала, маршрутизирующий две локальные сети и ломящийся через IPsec через центральный шлюз к остальным корпоративным сетям.
racoon.conf:
path include "/usr/local/etc/racoon";
path pre_shared_key "/usr/local/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 55.44.33.22 [500];
}
# Specify various default timers.
timer
{
counter 5; # maximum trying count to send.
interval 20 sec; # maximum interval to resend.
persend 1; # the number of packets per send.
phase1 30 sec;
phase2 15 sec;
}
#############
# CENTRAL
#############
remote 88.77.66.55
{
exchange_mode main,base;
lifetime time 28800 sec;
generate_policy on;
proposal_check strict;
proposal {
encryption_algorithm 3des;
hash_algorithm sha1;
authentication_method pre_shared_key;
dh_group 2;
}
}
sainfo subnet 10.0.15.0/24 any address 10.0.0.0/16 any
{
lifetime time 28800 sec;
encryption_algorithm aes128, 3des, cast128, blowfish 448, des, rijndael;
authentication_algorithm hmac_md5, hmac_sha1;
compression_algorithm deflate;
}
sainfo subnet 10.0.16.0/24 any address 10.0.0.0/16 any
{
lifetime time 28800 sec;
encryption_algorithm aes128, 3des, cast128, blowfish 448, des, rijndael;
authentication_algorithm hmac_md5, hmac_sha1;
compression_algorithm deflate;
}
ipsec.conf:
flush;
spdflush;
spdadd 10.0.15.0/24 10.0.15.0/24 any -P out none;
spdadd 10.0.15.0/24 10.0.15.0/24 any -P in none;
spdadd 10.0.16.0/24 10.0.16.0/24 any -P out none;
spdadd 10.0.16.0/24 10.0.16.0/24 any -P in none;
spdadd 10.0.15.0/24 10.0.16.0/24 any -P out none;
spdadd 10.0.15.0/24 10.0.16.0/24 any -P in none;
spdadd 10.0.16.0/24 10.0.15.0/24 any -P out none;
spdadd 10.0.16.0/24 10.0.15.0/24 any -P int none;
spdadd 10.0.15.0/24 10.0.0.0/16 any -P out ipsec esp/tunnel/55.44.33.22-88.77.66.55/unique;
spdadd 10.0.0.0/16 10.0.15.0/24 any -P in ipsec esp/tunnel/88.77.66.55-55.44.33.22/unique;
spdadd 10.0.16.0/24 10.0.0.0/16 any -P out ipsec esp/tunnel/55.44.33.22-88.77.66.55/unique;
spdadd 10.0.0.0/16 10.0.16.0/24 any -P in ipsec esp/tunnel/88.77.66.55-55.44.33.22/unique;
Опа, здесь мы видим отличие! Мы прописали опции с активом "none" в файле ipsec.conf.
Сделано это из-за того, что 10.0.15.0/24 и 10.0.16.0/24 входят в подсеть 10.0.0.0/16, и если на стороне центрального маршрутизатора, передавая пакеты ИЗ подсети 10.0.0.0/16 В подсеть 10.0.15.0/24 (или 10.0.16.0/24) мы не сталкивались с проблемами, то в данном конкретном случае мы имеем ситуацию, когда все, что выходит из подсетей 10.0.15.0/24 и 10.0.16.0/24 в подсеть 10.0.0.0/16 должно шифроваться. А значит, что шифроваться будет и все, что идет даже мимо туннеля (например, между подсетями). Соответственно, работать вообще все перестанет!
Для того, чтобы избежать такую подставу - мы рисуем правила "пропусти, не шифруй" для все, что входит или выходит из самой подсети 10.0.15.0/24 (ну и для 10.0.16.0/24), а также правила для пропуска пакетов между подсетями.
В более простом случае, когда на стороне филиала подсеть только одна (пусть это будет 10.0.15.0/24) мы может обойтись такой записью в ipsec.conf:
flush;
spdflush;
spdadd 10.0.15.0/24 10.0.15.0/24 any -P out none;
spdadd 10.0.15.0/24 10.0.15.0/24 any -P in none;
spdadd 10.0.15.0/24 10.0.0.0/16 any -P out ipsec esp/tunnel/55.44.33.22-88.77.66.55/unique;
spdadd 10.0.0.0/16 10.0.15.0/24 any -P in ipsec esp/tunnel/88.77.66.55-55.44.33.22/unique;
Комментарии
Оставить комментарий
Компьютерные сети
Термины: Компьютерные сети