Задача:
Настройка VPN между локальной сетью организации и домашним ПК, подключенным к "домашней" сети с фейковыми адресами 192.168.0.0. Сразу хочу оговорить, что и "домашняя" сеть, и офис фирмы подключены к одному ISP. Поэтому, в результате пинания оного, была достигнута договорённость о настройке маршрутизации трафика между адресами 192.168.64.x и 217.117.x.x на стороне ISP.
И ещё одно замечание. С целью максимально обезопасить комп, стоящий в "домашней" сети, я настоял на том, чтобы спрятать Windows 2000 Pro за шлюзом на базе всё той же FreeBSD. Заодно появилась возможность сплавить старый P-166 с 64RAM на симах.
Исходные данные:
Оба шлюза имеют схожую конфигурацию в плане установленных FreeBSD 4.10, racoon, natd, etc.
Схематический набросок топологии сети
A - шлюз провайдера.
B - свич/хаб в локальной сети.
Установка и настройка.
1.
Конфигурация ядра.
2.
Настройка туннеля.
3.
Установка и настройка racoon.
4.
Настройка nat, ipfw etc.
1. Конфигурация ядра.
Для поддержки IPSec добавляем в ядро FreeBSD следующие опции:
Код:
# ee /usr/src/sys/i386/conf/KERNEL
..
options IPDIVERT # Включаем поддержку NAT
options IPFIREWALL # Firewall. По умолчанию правило add deny all from any to any !!!
..
options IPSEC
options IPSEC_ESP
options IPSEC_DEBUG
..
По желанию добавляем дополнительные опции, как то
Код:
options IPSTEALTH
options RANDOM_IP_ID
options ICMP_BANDLIM
options TCP_DROP_SYNFIN
options IPSEC_FILTERGIF
и т.д. Последняя опция справедлива для ipfw2 и включает фильтрацию пакетов проходащих через ipsec. Подробнее в /usr/src/sys/i386/conf/LINT для FreeBSD 4.x или /usr/src/sys/conf/NOTES для FreeBSD 5.x .Для работы туннеля необходимо добавить (если отсутствует)
Код:
pseudo-device gif # IPv6 and IPv4 tunneling
Далее пересобираем ядро.
# config KERNEL
# cd ../../compile/KERNEL
# make depend && make && make install
# shutdown -r now
2. Настройка туннеля.Собственно сам VPN настраивается 'поднятием' туннеля между двумя сетями с помощью gif (generic tunnel interface). После добавления оного в ядро и перезагрузки можно приступить к конфигурации интерфейса.
Для шлюза с IP 217.117.x.x
# ifconfig gif0 create
# gifconfig gif0 217.117.x.x 192.168.64.x
# ifconfig gif0 inet 192.168.10.1 10.10.10.1 netmask 0xffffffff
# route add 10.10.10.0/24 10.10.10.1
Если всё прошло успешно, то ifconfig -a выдаст следующее:
...
gif0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1280
tunnel inet 217.117.x.x --> 192.168.64.x
inet 192.168.10.1 --> 10.10.10.1 netmask 0xffffffff
Для автоматизации данного процесса можно пойти двумя путями. Прописав все в /etc/rc.conf
Код:
cloned_interfaces="gif0"
gifconfig_gif0="217.117.x.x 192.168.64.x"
ifconfig_gif0="inet 192.168.10.1 10.10.10.1 netmask 0xffffffff"
static_routes="vpn"
route_vpn="10.10.10.0/24 10.10.10.1"
что является правильным с "идеологической" точки зрения, или в виде скрипта в /usr/local/etc/rc.d/001_if_gif.sh
Код:
#!/bin/sh
/sbin/ifconfig gif0 create && \
/usr/sbin/gifconfig gif0 217.117.x.x 192.168.64.x && \
/sbin/ifconfig gif0 inet 192.168.10.1 10.10.10.1 netmask 0xffffffff && \
/sbin/route add 10.10.10.0/24 10.10.10.1
Для шлюза с IP 192.168.64.x/etc/rc.conf
Код:
cloned_interfaces="gif0"
gifconfig_gif0="192.168.64.x 217.117.x.x"
ifconfig_gif0="inet 10.10.10.1 192.168.10.1 netmask 0xffffffff"
static_routes="vpn"
route_vpn="192.168.10.0/24 192.168.10.1"
или /usr/local/etc/rc.d/001_if_gif.sh
Код:
#!/bin/sh
/sbin/ifconfig gif0 create && \
/usr/sbin/gifconfig gif0 192.168.64.x 217.117.x.x&& \
/sbin/ifconfig gif0 inet 10.10.10.1 192.168.10.1 netmask 0xffffffff && \
/sbin/route add 192.168.10.0/24 192.168.10.1
Дабы закрыть весь трафик, проходящий между адресами 217.117.x.x и 192.168.64.x, от посторонних глаз (а ля tcpdump), необходимо установить и настроить racoon - IKE (ISAKMP/Oakley) key management daemon.
3. Установка и настройка racoon.Устанавливаем racoon из портов:
# cd /usr/ports/security/racoon/
# make && make install
После чего можно приступить к настройке. После установки все конфиги хранятся в каталоге /usr/local/etc/racoon/. Если быть точным, то файлов конфигурации всего два
racoon.conf.dist
psk.txt.dist
Скопируем их в рабочие конфиги
cp racoon.conf.dist > racoon.conf
cp psk.txt.dist > psk.txt
Первый отвечает за работу самого демона racoon, а во втором хранятся 'связки' host password необходимые для первичной авторизации между машинами, устанавливающими соединение, т.н. 'phase 1'. Сам метод авторизации и файл со 'связками' определяются в racoon.conf
Код:
...
path pre_shared_key "/usr/local/etc/racoon/psk.txt";
...
proposal {
...
authentication_method pre_shared_key;
...
}
...
Формат файла предельно прост. В нашем случае: На машине с IP 217.117.x.x
Код:
192.168.64.x SupER_Pa$woRD
На машине с IP 192.168.64.x
Код:
217.117.x.x SupER_Pa$word
И ещё одно важное замечание. Права доступа на файл psk.txt должны быть установлены в 0600. т.е.
# chmod 0600 psk.txt
# ls -l
-rw------- 1 root wheel 42 12 окт 10:54 psk.txt
...
Иначе racoon откажется стартовать.
Ниже приводится 'работающий' racoon.conf с комментариями по мере возможности.
Код:
######################################
## /usr/local/etc/racoon/racoon.conf #
######################################
path include "/usr/local/etc/racoon" ;
path pre_shared_key "/usr/local/etc/racoon/psk.txt" ;
padding
{
maximum_length 20;
randomize on;
strict_check on;
exclusive_tail off;
}
listen
{
#isakmp ::1 [7000];
#isakmp 202.249.11.124 [500];
#admin [7002];
#strict_address;
}
timer
{
counter 5;
interval 10 sec;
persend 1;
phase1 30 sec;
phase2 15 sec;
}
remote anonymous
{
exchange_mode aggressive,main;
nonce_size 16;
lifetime time 10 min; # sec,min,hour
initial_contact on;
support_proxy off;
proposal_check obey; # obey, strict or claim
proposal {
encryption_algorithm 3des;
hash_algorithm sha1;
authentication_method pre_shared_key ;
dh_group 2 ;
}
}
sainfo anonymous
{
lifetime time 10 min;
encryption_algorithm rijndael;
authentication_algorithm hmac_sha1;
compression_algorithm deflate ;
}
Proposal
authentication_method Алгоритм шифрования используемый в первой фазе (phase 1).
Допусимые значения des,
3des, blowfish, cast128.
hash_algorithm Хэш алгоритм использаемый в фазе 1.
Допустимые значения md5,
sha1.
authentication_method Допустимые значения: pre_shared_key (
в нашем случае), rsasig, gssapi_krb.
rsasig - сокращённое от "RSA Signature". Метод авторизации с использованием сертификатов. Если вы будете использовать данную опцию, то в файле конфигурации необходимо указать каталог в котором они расположены.
Код:
path certificate "/usr/local/etc/cert";
Сертификаты и RSA-ключи создаються с помощью пакета OpenSSL.
dh_group Параметр указывает группу используемую для Diffie-Hellman exponentiations.
exponentiations - возвдение в степень.
"Криптосистемы Diffie-Hellman основываются на односторонней функции возведения в степень по модулю. Обратная задача дискретного логарифмирования решается только перебором."
Данная деректива может принимать одно из значений modp768, modp1024, modp1536. Или 1, 2, 5.
Более подробно в man racoon.conf. Тут приведены минимальные нстройки необходимые для запуска racoon.
Далее необходимо создать стартовые скрипты. Первым делом подготовим к запуску setkey - утилиты управляющей базой Security Association Database. Для этого полезно в каталог, откуда читаются стартовые скрипты (/usr/local/etc/rc.d/), добавить следующий файл
Для шлюза с IP 217.117.x.xКод:
[/usr/local/etc/rc.d]# cat 000_ipsec.sh
#!/bin/sh
setkey -FP
setkey -F
setkey -c << END
spdadd 217.117.x.x/32 192.168.64.x/32 any -P out ipsec
esp/transport/217.117.x.x-192.168.64.x/require;
spdadd 192.168.64.x/32 217.117.x.x/32 any -P in ipsec
esp/transport/192.168.64.x-217.117.x.x/require;
END
#
[/usr/local/etc/rc.d]#
Для шлюза с IP 192.168.64.xКод:
[/usr/local/etc/rc.d]# cat 000_ipsec.sh
#!/bin/sh
setkey -FP
setkey -F
setkey -c << END
spdadd 192.168.64.x/32 217.117.x.x/32 any -P out ipsec
esp/transport/192.168.64.x-217.117.x.x/require;
spdadd 217.117.x.x/32 192.168.64.x/32 any -P in ipsec
esp/transport/217.117.x.x-192.168.64.x/require;
END
#
[/usr/local/etc/rc.d]#
Имя файла выбираем на свой вкус. Единственные правила - это а) файл должен иметь расширение .sh б) должен быть установлен бит 'x'. Подробнее man setkey
И второй скрипт
Код:
[/usr/local/etc/rc.d]# cat 010_racoon.sh
#!/bin/sh
case "$1" in
start)
if [ -x /usr/local/sbin/racoon ]; then
/usr/local/sbin/racoon -f /usr/local/etc/racoon/racoon.conf -l /var/log/racoon && \
echo -n ' racoon'
fi
;;
stop)
/usr/bin/killall racoon && echo -n ' racoon'
;;
*)
echo "Usage: `basename $0` { start | stop }"
exit 64
;;
esac
exit 0
[/usr/local/etc/rc.d]#
Сам файл не претендует на полноту, но для запуска и остановки этого хватит. Проверяем
[/usr/local/etc/rc.d]# sh 000_ipsec.sh
[/usr/local/etc/rc.d]# sh 010_racoon.sh
[/usr/local/etc/rc.d]# ps -ax | grep -v grep | grep racoon
220 ?? Ss 0:09,63 /usr/local/sbin/racoon -f /usr/local/etc/racoon/racoon.conf -l /var/log/racoon
[/usr/local/etc/rc.d]#
И внимательно читаем /var/log/racoon ...
4. Настройка natd, ipfw, etc.Не буду описывать настройи ipfw в целом. Так как топология и политика безопасности у каждого своя, то в данном случае будем придерживаться правила "не навреди", т.е. затронем только те аспекты, которые касаются непосредственно работы нашего vpn.
Итак /etc/rc.firewall. Первое правило которое добавляем
Для шлюза с IP 217.117.x.xКод:
${fwcmd} add pass all from 10.10.10.2/32 to 192.168.10.0/24 in via gif0
${fwcmd} add pass all from 192.168.10.0/24 to 10.10.10.2/32 out via gif0
Для шлюза с IP 192.168.64.xКод:
${fwcmd} add pass all from 192.168.10.0/24 to 10.10.10.2/32 in via gif0
${fwcmd} add pass all from 10.10.10.2/32 to 192.168.10.0/24 out via gif0
т.е. разрешаем работать с локальной сетью организации только компьютеру с адресом 10.10.10.2 (см. топологию сети)
Далее добавляем правила для обмена ключами и работы racoon
Для шлюза с IP 217.117.x.xКод:
${fwcmd} add pass udp from 217.117.x.x to 192.168.64.x isakmp
${fwcmd} add pass udp from 192.168.64.x to 217.117.x.x isakmp
${fwcmd} add pass esp from 217.117.x.x to 192.168.64.x
${fwcmd} add pass esp from 192.168.64.x to 217.117.x.x
Для шлюза с IP 192.168.64.xКод:
${fwcmd} add pass udp from 192.168.64.x to 217.117.x.x isakmp
${fwcmd} add pass udp from 217.117.x.x to 192.168.64.x isakmp
${fwcmd} add pass esp from 192.168.64.x to 217.117.x.x
${fwcmd} add pass esp from 217.117.x.x to 192.168.64.x
Теперь было бы не плохо дать возможность работать с HOME_NET компьютеру с IP 10.10.10.2. Для этого поднимаем обычный natd на интерфейсе с адресом 192.168.64.x
Код:
[/etc]# cat rc.conf
...
natd_enable="YES"
natd_flags="-n xl1"
...
[/etc]#
и правила для ipfw
Код:
[/etc]# cat rc.conf
...
${fwcmd} add divert natd all from 10.10.10.2/32 to any out via rl0
${fwcmd} add divert natd all from any to 192.168.64.x in via rl0
...
[/etc]#
ИТОГВ итоге имеем компьютер с адресом 10.10.10.2 подключенный к локальной сети организации через туннель gif0, и к сети HOME_NET через natd. Для всей 'заразы', а ля вирусы черви, из HOME_NET IP 10.10.10.2 становится не досягаем. Посмотрев трафик между адресами 217.117.x.x. <--> 192.168.64.x
[~]# tcpdump -X -i rl0 host 217.117.x.xполучим
Код:
01:03:21.723011 192.168.64.x > 217.117.x.x: ESP(spi=0x041e7993,seq=0x989)
0x0000 4500 0068 3750 0000 1e32 35d4 c0a8 42f8 E..h7P...25...B.
0x0010 d975 522a 041e 7993 0000 0989 0d1f d772 .uR*..y........r
0x0020 62c9 3709 a845 862d f12f 474a c2aa 6be3 b.7..E.-./GJ..k.
0x0030 52b3 0ba7 bc15 e785 8b2a bc92 79bd cdf0 R........*..y...
0x0040 d767 6c0e a6ad bfe9 86d7 57f6 b3ec 5a79^C
1715 packets received by filter
750 packets dropped by kernel
[/etc]#
Наличие
ESP(spi=0x041e7993,seq=0x989) и нечетабельных кракозябр в поле DATA говорит о том что трафик зашифрован. Собственно говоря нечетабельные кракозябры и были причиной всех вышеперечисленных действий.