====== Racoon: настройка VPN туннеля между несколькими серверами ======
----
===== Введение =====
Есть три сервера c FreeBSD 12.1. Необходимо объединить приватные сети, которые расположены за этими серверами, следующим образом:
- сервер **A** ( берлога админа): должен иметь доступ везде;
- сервер **B** ( офис): определенным компьютерам нужно предоставить доступ к компьютеру с 1С, который стоит в другом офисе;
- сервер **C** ( удаленный офис): тут стоит компьютер с 1C;
Выглядит это будет примерно вот так:
{{ :freebsd:network:racoon_shema.png |}}
Поскольку никакой динамической маршрутизации у нас не будет, поэтому хочется обойтись без использования дополнительных интерфейсов. Как роутить трафик между сетями пропишем при помощи политик 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"
==== ipsec ====
Далее будем производить настройку сервера **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 ====
Последним шагом настройки будет редактирование firewall-а. Необходимо открыть на вход UDP port 500, и разрешить проход трафика по протоколу esp и ipencap от серверов **B** и **C**. Я использую **pf** поэтому в /etc/pf.conf я добавил следующее:
table persist { B.B.B.B, C.C.C.C }
pass in on $ext_if proto udp from to ($ext_if) port isakmp keep state
pass in on $ext_if proto esp from to ($ext_if) keep state
pass in on $ext_if proto ipencap from to ($ext_if) keep state
pass out on $ext_if proto udp from A.A.A.A to port isakmp keep state
pass out on $ext_if proto esp from A.A.A.A to keep state
pass out on $ext_if proto ipencap from A.A.A.A to keep state
Осталось только прописать правила прохождения трафика между приватными сетями. Вот небольшой пример конфига 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
===== Запуск =====
После того как мы настроили все три сервера можно приступать к проверке того, как все это работает.
Запускаем racoon и ipsec:
# service ipsec start
# service racoon start
Проверяем:
# setkey -DP
# setkey -D