Соединяем две сети через VPN IPSEC
Цель: подсоединить к локальной сети 6-го микрорайона свою домашнюю сеть из нескольких машин.
Исходные данные: в обоих сетях есть сервер с FreeBSD 6.2 имеющий две сетевых карты (одна смотрит в локалку, в другую подсоединен модем). Выход в Интернет осуществляется через ADSL модем, настроенный в режиме bridge.
Топология сети выглядит так:
1-ая сеть:
10.11.0.0/16
|
10.11.0.201
Сервер
85.192.х.х
|
|
Интернет
|
|
2-ая сеть
92.49.х.х
Сервер
10.10.38.50
|
10.10.0.0/16
Первоначально нужно пересобрать ядро с дополнительными опциями:
options IPSEC #IP security
options IPSEC_ESP #IP security (crypto; define w/ IPSEC)
device gif
Компилируем новое ядро, инсталлируем и перезагружаемся.
Теперь создаем туннель и добавляем маршрутизацию:
На шлюзе 1:
ifconfig gif0 create
ifconfig gif0 10.11.0.201 10.10.38.50
ifconfig gif0 tunnel 85.192.x.x 92.49.x.x
route add 10.10.0.0/16 10.10.38.50
На шлюзе 2:
ifconfig gif0 create
ifconfig gif0 10.10.38.50 10.11.0.201
ifconfig gif0 tunnel 92.49.x.x 85.192.x.x
route add 10.11.0.0/16 10.11.0.201
По сути, после этих команд между сетями уже есть связь. Т.е. можно из подсети 1 зайти на компьютеры в сети 2. Единственный нюанс на компьютерах во 2 сети должен быть прописан шлюз по умолчанию — 10.10.38.50 иначе достучаться до них будет нельзя. Как подсказали знающие люди — выходом из этой ситуации является установка SNAT на втором шлюзе, но это не входило в мои планы.
Теперь можно приступать к шифрованию трафика. Для этого установим из портов — security/ipsec-tools. По идее после установки должна была создаться папка /usr/local/etc/racoon/ с конфигурационными файлами, но этого не произошло. Не беда, создадим их вручную:
/usr/local/etc/racoon/racoon.conf
path include «/usr/local/etc/racoon» ;
path pre_shared_key «/usr/local/etc/racoon/psk.txt» ;
path certificate «/usr/local/etc/racoon/cert» ;
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 222.222.222.222 [500]; #IP компьютера где расположен данный файл
}
timer
{
counter 5; # maximum trying count to send.
interval 20 sec; # maximum interval to resend.
persend 1; # the number of packets per a send.
phase1 30 sec;
phase2 15 sec;
}
remote anonymous
{
exchange_mode aggressive,main,base;
doi ipsec_doi;
situation identity_only;
nonce_size 16;
lifetime time 24 hour; # sec,min,hour
initial_contact on;
proposal_check obey; # obey, strict or claim
proposal {
encryption_algorithm 3des;
hash_algorithm sha1;
authentication_method pre_shared_key ;
dh_group 2 ;
}
}
sainfo anonymous
{
pfs_group 1;
lifetime time 24 hour;
encryption_algorithm 3des ;
authentication_algorithm hmac_sha1;
compression_algorithm deflate ;
}
#End of racoon.conf
/usr/local/etc/racoon/psk.txt
#На шлюзе 1 (secret — пароль):
92.49.х.х secret
#На шлюзе 2 (secret — пароль):
85.192.х.х secret
Ставим права на эти файлы:
# chmod 600 *
Создаем файл /etc/ipsec.conf:
#На шлюзе 1 (85.192.х.х):
spdadd 85.192.х.х/32 92.49.х.х/32 ipencap -P out ipsec esp/tunnel/85.192.х.х-92.49.х.х/require;
spdadd 92.49.х.х/32 85.192.х.х/32 ipencap -P in ipsec esp/tunnel/92.49.х.х-85.192.х.х/require;
На шлюзе 2 (92.49.х.х):
spdadd 92.49.х.х/32 85.192.х.х/32 ipencap -P out ipsec esp/tunnel/92.49.х.х-85.192.х.х/require;
spdadd 85.192.х.х/32 92.49.х.х/32 ipencap -P in ipsec esp/tunnel/85.192.х.х-92.49.х.х/require;
Выполняем на обоих шлюзах команды:
# racoon
# setkey -f /etc/ipsec.conf
Проверка работы racoon на шлюзе 1:
# sockstat | grep raco
root racoon 4527 3 dgram -> /var/run/logpriv
root racoon 4527 6 udp4 85.192.х.х:500 *:*
Проверяем работу командой setkey -D на шлюзе 1. Если ничего не вывелось, значит, шифрование не настроено.
# setkey -D
85.192.х.х 92.49.х.х
esp mode=tunnel spi=165916838(0x09e3b0a6) reqid=0(0x00000000)
E: 3des-cbc aecfd117 0739d66d 3400f094 e9411901 aa33570b ce7c2130
A: hmac-sha1 d1bc9b8f aa0c0bdc 795c800a 8ff4bc1d b3bd87a5
seq=0x00000375 replay=4 flags=0x00000000 state=mature
created: Nov 13 15:41:53 2008 current: Nov 13 15:55:10 2008
diff: 797(s) hard: 86400(s) soft: 69120(s)
last: Nov 13 15:55:09 2008 hard: 0(s) soft: 0(s)
current: 141600(bytes) hard: 0(bytes) soft: 0(bytes)
allocated: 885 hard: 0 soft: 0
sadb_seq=1 pid=4585 refcnt=2
92.49.х.х 85.192.х.х
esp mode=tunnel spi=42651354(0x028aceda) reqid=0(0x00000000)
E: 3des-cbc 85fe3e51 1c251e7d 22c51fbd 52a9a31c 769758ac c3c69b03
A: hmac-sha1 d90dc2db 8f56a6f0 cdd9fc17 5acae5a4 8c043102
seq=0x0000036e replay=4 flags=0x00000000 state=mature
created: Nov 13 15:41:53 2008 current: Nov 13 15:55:10 2008
diff: 797(s) hard: 86400(s) soft: 69120(s)
last: Nov 13 15:55:09 2008 hard: 0(s) soft: 0(s)
current: 91312(bytes) hard: 0(bytes) soft: 0(bytes)
allocated: 878 hard: 0 soft: 0
sadb_seq=0 pid=4585 refcnt=1
Для пущей достоверности запускаем со шлюза 1 команду:
# ping 10.10.38.50
На втором шлюзе запускаем:
# tcpdump -i tun0 host 85.192.х.х
Если трафик шифруется, то увидим примерно такой вывод:
17:51:34.927576 IP 85-192-x-x.dsl.esoo.ru > 92.49.x.x: ESP(spi=0x0f6188d3,seq=0x12e), length 140
17:51:35.056984 IP 92.49.x.x > 85-192-x-x.dsl.esoo.ru: ESP(spi=0x0b7e205d,seq=0x126), length 140
Для того чтобы VPN поднимался автоматически при загрузке сервера нужно прописать в /etc/rc.conf следующие строчки:
Для шлюза 1:
gif_interfaces=»gif0″
gifconfig_gif0=»85.192.x.x 92.49.x.x»
ifconfig_gif0=»inet 10.11.0.201 10.10.38.50 netmask 0xffffffff»
static_routes=»vpn»
route_vpn=»-net 10.10.0.0/16 10.10.38.50″
ipsec_enable=»YES»
ipsec_file=»/etc/ipsec.conf»
racoon_enable=»YES»
Для шлюза 2:
gif_interfaces=»gif0″
gifconfig_gif0=»92.49.x.x 85.192.x.x»
ifconfig_gif0=»inet 10.10.38.50 10.11.0.201 netmask 0xffffffff»
static_routes=»vpn»
route_vpn=»-net 10.11.0.0/16 10.11.0.201″
ipsec_enable=»YES»
ipsec_file=»/etc/ipsec.conf»
racoon_enable=»YES»
К сожалению, как показала практика, racoon не захотел стартовать автоматически, поэтому в crontab на обоих шлюзах была добавлена новая сточка:
@reboot /usr/local/etc/rc.d/racoon start
После повторной перезагрузки всё завелось. Как видим настройка VPN не так уж сложна.
Ссылки на наиболее интересные материалы по данной теме:
- http://www.lissyara.su/?id=1050
- http://www.freebsd.org/doc/ru_RU.KOI8-R/books/handbook/ipsec.html (статья в рускоязычном хендбуке)
- http://www.freebsd.org/doc/en/books/handbook/ipsec.html (статья в англоязычном хэндбуке)