Это старая версия документа!
Содержание
Racoon: настройка VPN туннеля между несколькими серверами
Введение
Есть три сервера c FreeBSD 12.1. Необходимо объединить приватные сети, которые расположены за этими сервера, следующим образом:
- сервер A ( берлога админа): должен иметь доступ везде;
- сервер B ( офис): определенным компьютерам нужно предоставить доступ к компьютеру с 1С, который стоит в другом офисе;
- сервер C ( удаленный офис): тут стоит компьютер с 1C;
Выглядит это будет примерно вот так:
Поскольку никаких сложный маршрутов у нас не будет, поэтому хочется обойтись без использования дополнительных интерфейсов. Как роутить траффик между локалками пропишем при помощи политик ipsec и racoon-а.
Вводные данные
- Сервер A: IP: A.A.A.A LAN: 10.0.1.0/24
- Сервер B: IP: B.B.B.B LAN: 10.0.2.0/24
- Сервер C: IP: C.C.C.C LAN: 10.0.3.0/24
Настройка
Устанавливаем ipsec-tools
# pkg install ipsec-tools
Добавляем в /etc/rc.conf:
ipsec_enable="YES" ipsec_file="/etc/ipsec.conf" racoon_enable="YES" racoon_flags="-l /var/log/racoon.log"
Далее будем производить настройку сервера A. Два других сервера настраиваются по образу и подобию.
Файл /etc/ipsec.conf приводим вот к такому виду:
#!/usr/sbin/setkey -f flush; spdflush; # сервер B spdadd 10.0.1.0/24 10.0.2.0/24 any -P out ipsec esp/tunnel/A.A.A.A-B.B.B.B/unique; spdadd 10.0.2.0/24 10.0.1.0/24 any -P in ipsec esp/tunnel/B.B.B.B-A.A.A.A/unique; # сервер C spdadd 10.0.1.0/24 10.0.3.0/24 any -P out ipsec esp/tunnel/A.A.A.A-C.C.C.C/unique; spdadd 10.0.3.0/24 10.0.1.0/24 any -P in ipsec esp/tunnel/C.C.C.C-A.A.A.A/unique;
Далее настраиваем Racoon. Объясняем ему какой траффик надо шифровать. Файл /usr/local/etc/racoon/racoon.conf:
path include "@sysconfdir_x@/racoon";
path pre_shared_key "/usr/local/etc/racoon/psk.txt";
path certificate "@sysconfdir_x@/cert";
padding
{
}
listen
{
isakmp A.A.A.A [500];
}
timer
{
phase1 30 sec;
phase2 15 sec;
}
# сервер B
remote B.B.B.B
{
my_identifier address A.A.A.A;
peers_identifier address B.B.B.B;
exchange_mode main;
doi ipsec_doi;
situation identity_only;
nonce_size 16;
lifetime time 86400 sec;
initial_contact on;
support_proxy on;
proposal {
encryption_algorithm aes 256;
hash_algorithm sha1;
authentication_method pre_shared_key;
dh_group 5;
}
}
sainfo subnet 10.0.1.0/24 any subnet 10.0.2.0/24 any
{
pfs_group 5;
lifetime time 24 hour;
encryption_algorithm aes 256;
authentication_algorithm hmac_sha1, hmac_md5;
compression_algorithm deflate;
}
# сервер C
remote C.C.C.C
{
my_identifier address A.A.A.A;
peers_identifier address C.C.C.C;
exchange_mode main;
doi ipsec_doi;
situation identity_only;
nonce_size 16;
lifetime time 86400 sec;
initial_contact on;
support_proxy on;
proposal {
encryption_algorithm aes 256;
hash_algorithm sha1;
authentication_method pre_shared_key;
dh_group 5;
}
}
sainfo subnet 10.0.1.0/24 any subnet 10.0.3.0/24 any
{
pfs_group 5;
lifetime time 24 hour;
encryption_algorithm aes 256;
authentication_algorithm hmac_sha1, hmac_md5;
compression_algorithm deflate;
}
Теперь необходимо создать файл с паролями:
# touch /usr/local/etc/racoon/psk.txt # chmod 600 /usr/local/etc/racoon/psk.txt # chown root:wheel /usr/local/etc/racoon/psk.txt
В файл прописываем адреса и пароли для серверов B и C:
B.B.B.B serverB_password C.C.C.C serverC_password
Последним шагом настройки будет редактирование firewall-а. Необходимо открыть на вход UDP port 500, и разрешить проход трафика по протоколу esp и ipencap от серверов B и C. Я использую pf поэтому в /etc/pf.conf я добавил следующее:
table <ipsec> persist { B.B.B.B, C.C.C.C }
pass in on $ext_if proto udp from <ipsec> to ($ext_if) port isakmp keep state
pass in on $ext_if proto esp from <ipsec> to ($ext_if) keep state
pass in on $ext_if proto ipencap from <ipsec> to ($ext_if) keep state
pass out on $ext_if proto udp from A.A.A.A to <ipsec> port isakmp keep state
pass out on $ext_if proto esp from A.A.A.A to <ipsec> keep state
pass out on $ext_if proto ipencap from A.A.A.A to <ipsec> keep state
Запуск
После того как мы настроили все три сервера можно приступать к проверке как все это работает.
Запускаем racoon и ipsec:
# service ipsec start # service racoon start
Проверяем:
# setkey -DP # setkey -D
Последний штрих
Нам осталось только прописать в firewall правила хождения траффика между приватными сетями. Вот небольшой пример конфига pf на сервере B:
# те кому можно ходить на сервер с 1C
table <1C> persist { 10.0.2.2, 10.0.2.3 }
# разрешить админу ходить везде
pass from 10.0.1.2 to 10.0.2.0/24 keep state
# запретить всем ходить в другие приватные сети
block from 10.0.2.0/24 to { 10.0.1.0/24, 10.0.3.0/24 }
# доступ к удаленному серверу по RDP
pass inet proto tcp from <1C> to 10.0.3.2 port 3389 flags S/SA modulate state

