Инструменты пользователя

Инструменты сайта


freebsd:network:ipsec_racoon

Это старая версия документа!


Racoon: настройка VPN туннеля между несколькими серверами


Введение

Есть три сервера c FreeBSD 12.1. Необходимо объединить приватные сети, которые расположены за этими сервера, следующим образом:

  1. сервер A ( берлога админа): должен иметь доступ везде;
  2. сервер B ( офис): определенным компьютерам нужно предоставить доступ к компьютеру с 1С, который стоит в другом офисе;
  3. сервер 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"

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 <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

Осталось только прописать правила хождения траффика между приватными сетями. Вот небольшой пример конфига 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
freebsd/network/ipsec_racoon.1592086329.txt.gz · Последнее изменение: andrei