IPsec (сокращение от IP Security) — набор протоколов для обеспечения защиты данных, передаваемых по межсетевому протоколу IP. Позволяет осуществлять подтверждение подлинности (аутентификацию), проверку целостности и/или шифрование IP-пакетов. IPsec также включает в себя протоколы для защищённого обмена ключами в сети Интернет. В основном, применяется для организации VPN-соединений.
У нас есть два удаленных друг от друга офиса (естественно с выходом в интернет). Шлюзами в которых выступают FreeBSD.
Основные моменты:
Шлюз FreeBSD с двумя сетевыми картами (em0 и em1).
em0 — смотрит к провайдеру интернета
em1 — в локальную сеть.
К этой схеме можно соединять другие устройства (cisco. и.т.д)
Забегая вперед скажу, что можно добавлять огромное количество разных маршрутов. ВАЖНО: Все равно не забывайте, что все зависит от пропускной способности Вашего канала. Да и скорость работы будет ниже, чем в локальной сети.
И так еще раз основные данные:
- Внешние статичные («Белый IP») IP : 10.1.1.20 и 10.1.1.21
- Lan удаленных офисов : 192.168.10.0/24 и 192.168.30.0/24
В FreeBSD 11 Ядро уже скомпилированно с поддержкой ipsec, но проверим
options IPSEC #IP security
device crypto
Добавим только. Как собрать свое ядро описано здесь
options IPSEC_DEBUG #debug for IP security
Редактируем rc.conf
nano /etc/rc.conf
Добавляем
cloned_interfaces="gif0"
ifconfig_gif0="192.168.10.1 192.168.30.1 netmask 255.255.255.252 tunnel 10.1.1.20 10.1.1.21"
Дописываем статичный маршрут. Иначе клиенты локальных сетей не будут видеть друг друга.
static_routes="vpn"
route_vpn="-net 192.168.30.0 192.168.30.1"
Добавим еще
ipsec_enable="YES"
ipsec_file="/etc/ipsec.conf"
Сохраняемся
Создаем файл ipsec.conf
touch ipsec.conf
Редактируем
nano /etc/ipsec.conf
flush;
spdflush;
#OPC (Local IP)
spdadd 192.168.10.1/30 192.168.30.1/30 any -P out ipsec esp/tunnel/10.1.1.20-10.1.1.21/unique;
spdadd 192.168.30.1/30 192.168.10.1/30 any -P in ipsec esp/tunnel/10.1.1.21-10.1.1.20/unique;
Устанавливаем racoon
cd /usr/ports/security/ipsec-tools/
make && make install && make clean
Добавляем в rc.conf
racoon_enable="YES"
racoon_flags="-l /var/log/racoon.log"
Редактируем racoon.conf
nano /usr/local/etc/racoon/racoon.conf
path include "/usr/local/etc/racoon" ;
path pre_shared_key "/usr/local/etc/racoon/psk.txt" ;
log notify;
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.
}
# if no listen directive is specified, racoon will listen to all
# available interface addresses.
listen
{
#isakmp ::1 [7000];
isakmp 10.1.1.20 [500];
#admin [7002]; # administrative's port by kmpstat.
#strict_address; # required all addresses must be bound.
}
# Specification of default various timer.
timer
{
# These value can be changed per remote node.
counter 5; # maximum trying count to send.
interval 20 sec; # maximum interval to resend.
persend 1; # the number of packets per a send.
# timer for waiting to complete each phase.
phase1 60 sec;
phase2 30 sec;
}
remote anonymous
{
exchange_mode main,aggressive;
doi ipsec_doi;
situation identity_only;
nonce_size 16;
lifetime time 240 min; # sec,min,hour
initial_contact on;
# support_mip6 on;
support_proxy on;
proposal_check obey; # obey, strict or claim
proposal {
encryption_algorithm 3des;
hash_algorithm md5;
authentication_method pre_shared_key ;
dh_group 5 ;
}
}
sainfo anonymous
{
pfs_group 5;
lifetime time 24 hour;
encryption_algorithm 3des,des,cast128,blowfish;
authentication_algorithm hmac_sha1,hmac_md5;
compression_algorithm deflate;
}
Создаем файл с паролями psk.txt
touch /usr/local/etc/racoon/psk.txt
Редактируем
nano /usr/local/etc/racoon/psk.txt
10.1.1.21 AbraKaDabRa11 (создаем свой ключ, чем сложнее тем лучше)
Обязательно выставляем права для psk.txt
chmod 600 /usr/local/etc/racoon/psk.txt
Проделываем теже действия на втором шлюзе, только меняем местами ip адреса, как внешние так и внутренние.
Перезагружаемся и проверяем. В результате шлюзы должны видеть друг друга, а также клиенты должны друг друга видеть.
Если не работает, проверяем
/usr/local/sbin/racoon -F -f /usr/local/etc/racoon/racoon.conf -l /var/log/racoon.log
Открываем порты в ipfw
Допишем в firewall эти правила для ipsec
$cmd 382 allow ip from any to any via gif0
$cmd 383 allow udp from 10.1.1.20 to 10.1.1.21 isakmp
$cmd 384 allow udp from 10.1.1.21 to 10.1.1.20 isakmp
$cmd 385 allow esp from 10.1.1.20 to 10.1.1.21
$cmd 386 allow esp from 10.1.1.21 to 10.1.1.20
$cmd 387 allow ipencap from 10.1.1.20 to 10.1.1.21
$cmd 388 allow ipencap from 10.1.1.21 to 10.1.1.20