В этой статье я покажу как настроить IPSec между двумя удаленными серверами FreeBSD. Для чего это нужно? Например, есть у Вас (и у меня) главный офис предприятия в каком-то городе и есть в этого предприятия филиалы или предприятия в других городах. Значит нужно между этими филиалами, офисами и предприятиями организовать постоянную связь, чтобы локальные сети этих точек были соединены и данные между ними были зашифрованы (т.к. соединение происходит через Интернет). Вот для этого служит IPSec, с помощью которого можно сделать этот канал зашифрованным.
И так, IPsec (сокращение от IP Security ) — набор протоколов для обеспечения защиты данных, передаваемых по межсетевому протоколу IP, позволяет осуществлять подтверждение подлинности и/или шифрование IP-пакетов. IPsec также включает в себя протоколы для защищённого обмена ключами в сети Интернет.
Для организации канала передачи данных с шифрованием нам нужно:
1. Два системных блока (по одному с каждой стороны) с двумя сетевыми картами в каждом и с ОС FreeBSD;
2. Широкополосный (желательно) Интернет;
3. Прямые руки
Ядро в FreeBSD должно быть пересобрано с этими параметрами:
# firewall options IPFIREWALL
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=1000
# IPSEC options IPSEC
options IPSEC_DEBUG
device crypto
Как пересобрать ядро смотрите
здесь .
Затем необходимо установить пакет ipsec-tools из портов FreeBSD.
Устанавливаем:
yurasik# cd /usr/ports/security/ipsec-tools/
yurasik# make install clean
Во время установки будут появляться окна где нажимаем ОК оставляя все по умолчанию.
После установки в rc.conf добавляем следующее содержание:
firewall_enable="YES"
firewall_type="/etc/ipfw.rules"
firewall_quiet="NO"
firewall_logging="YES"
racoon_enable="YES"
ipsec_enable="YES"
ipsec_file="/etc/ipsec.conf"
gif_interfaces="gif0"
gifconfig_gif0="192.168.2.130 192.168.1.130"
ifconfig_gif0="inet 192.168.200.200 192.168.201.10 netmask 255.255.255.0"
static_routes="RemoteLan"
route_RemoteLan="192.168.201.0/24 -interface gif0"
У меня файл rc.conf получился следующего содержания:
# -- sysinstall generated deltas -- # Mon Dec 13 01:18:08 2010
# Created: Mon Dec 13 01:18:08 2010
# Enable network daemons for user convenience.
# Please make all changes to this file, not to /etc/defaults/rc.conf.
# This file now contains just the overrides from /etc/defaults/rc.conf. gateway_enable="YES"
sshd_enable="YES"
ifconfig_rl1="inet 192.168.2.130 netmask 255.255.255.0"
ifconfig_re0="inet 192.168.200.200 netmask 255.255.255.0" defaultrouter="192.168.2.1" hostname="AVTO"
firewall_enable="YES"
firewall_type="/etc/ipfw.rules"
firewall_quiet="NO"
firewall_logging="YES"
racoon_enable="YES"
ipsec_enable="YES"
ipsec_file="/etc/ipsec.conf"
gif_interfaces="gif0"
gifconfig_gif0="192.168.2.130 192.168.1.130"
ifconfig_gif0="inet 192.168.200.200 192.168.201.10 netmask 255.255.255.0"
static_routes="RemoteLan"
route_RemoteLan="192.168.201.0/24 -interface gif0"
Cоздаем каталоги и конфигурационные файлы:
Для racoon:
AVTO# cd /usr/local/etc/ AVTO# mkdir racoon AVTO# cd racoon/ AVTO# touch racoon.conf AVTO# touch psk.txt
В файл racoon.conf необходимо вставить это:
# $KAME: racoon.conf.in,v 1.18 2001/08/16 06:33:40 itojun Exp $
# "path" affects "include" directives. "path" must be specified before any
# "include" directive with relative file path.
# you can overwrite "path" directive afterwards, however, doing so may add
# more confusion.
path include "/usr/local/etc/racoon/racoon.conf";
#include "remote.conf";
# the file should contain key ID/key pairs, for pre-shared key authentication.
path pre_shared_key "/usr/local/etc/racoon/psk.txt";
# racoon will look for certificate file in the directory,
# if the certificate/certificate request payload is received.
# path certificate "/usr/local/etc/racoon/cert";
# "log" specifies logging level. It is followed byeither "notify", "debug"
# or "debug2".
log debug2;
# "padding" defines some padding parameters. You should not touch these. 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 on all
# available interface addresses.
listen {
#isakmp ::1 [7000];
isakmp 192.168.2.130 [500];
#admin [7002]; # administrative port for racoonctl.
#strict_address;
# requires that all addresses must be bound.
}
# Specify various default timers.
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 send. # maximum time to wait for completing each phase.
phase1 60 sec;
phase2 30 sec;
}
remote 192.168.1.130
{
exchange_mode main;
passive off;
my_identifier address 192.168.2.130;
verify_identifier off;
verify_cert off;
lifetime time 1440 min;
initial_contact on;
dpd_delay 20;
proposal
{
encryption_algorithm 3des;
hash_algorithm sha1;
authentication_method pre_shared_key;
# authentication_method rsasig;
dh_group 2;
}
}
sainfo address 192.168.2.130[500] 4 address 192.168.1.130[500] 4 {
pfs_group 2;
lifetime time 90 min;
encryption_algorithm 3des;
authentication_algorithm hmac_sha1;
compression_algorithm deflate;
}
- где,
192.168.1.130 – удаленная фряха (тут обычно реальный IP который виден через интернет);
192.168.2.130 – текущая фряха.
В файл psk.txt вставляем IP удаленной машины и пароль (через пробел):
Далее необходимо в каталоге /etc создать два файла:
AVTO# touch ipsec.conf AVTO# touch ipfw.rules
В файл ipsec.conf вставляем это (без переносов):
spdadd 192.168.2.130/32 192.168.1.130/32 ipencap -P out ipsec esp/tunnel/192.168.2.130-192.168.1.130/require; spdadd 192.168.1.130/32 192.168.2.130/32 ipencap -P in ipsec esp/tunnel/192.168.1.130-192.168.2.130/require;
В файл ipfw.rules необходимо вставить правила разрешающие ipsec "общаться" между собой. В моем случае это выглядит так:
${fw} add allow icmp from any to any via gif0 ${fw} add allow ipencap from 192.168.1.130 to me ${fw} add allow ipencap from me to 192.168.1.130 ${fw} add allow esp from me to 192.168.1.130 ${fw} add allow esp from 192.168.1.130 to me ${fw} add allow udp from me 500 to 192.168.1.130 500 via rl1 ${fw} add allow udp from 192.168.1.130 500 to me 500 via rl1
И так-же правила которые будут разрешать обмениваться пакетами внутри тоннеля между подсетями которые мы объединяем:
${fw} add allow all from 192.168.200.0/24 to 192.168.201.0/24 via gif0 ${fw} add allow all from 192.168.201.0/24 to 192.168.200.0/24 via gif0
То-же самое делаем на второй машине с тем отличием, что нужно поменять айпишки в конфигурационных файлах. У меня на второй машине, как видно из конфигов, айпишка 192.168.1.130 и локальный 192.168.201.10, значит вместо 192.168.2.130 я ставлю 192.168.1.130, вместо 192.168.1.130 - 192.168.2.130, вместо 192.168.200.200 - 192.168.201.10 и наоборот…..
Напоминаю, что это конфиги взяты из реально работающих серверов и они рабочие 100%.
В следующей статье будет немного теории и практики….