четверг, 15 ноября 2018 г.

pfSense и GRE over IPSec - костыль для транспортного режима

Как оказалось, в pfSense при настройке IPSec в транспортном режиме нельзя указать какой именно протокол будем шифровать, он шифрует все. Это не так уже и плохо, с MikroTik и strongswan с ним работают, если на второй стороне указан только GRE, но в случаи с racoon никак. Только на стороне racoon так же прописывать any, но это нам не подходит - нам же только GRE необходимо криптовать.
Мой костыль заключается в том, чтобы в конфиг файле /var/etc/ipsec/ipsec.conf дописать нужный нам протокол. Кстати, в документации по strongswan, который используется в pfSense, так и сказано, что необходимо дописывать протокол в полях rightsubnet и leftsubnet. Почему этого не сделали в интерфейсе pfSense - загадка. Хочу отметить, что редактировать файл ipsec.conf бесполезно - он каждый раз перезаписывается при любых изменениях в IPSec. Поэтому, мы будет править файл отвечающий за генерацию самого конфига IPSec, и он расположен в /etc/inc/vpn.inc. Данный файл на самом деле код написанный на PHP.
В файле ищем единственное вхождение слова "transport", вот пример блока с pfSense 2.4.4:

} else {
    $tunneltype = "type = transport";
    $installpolicy = "installpolicy = yes";

    if ((($ph1ent['authentication_method'] == "xauth_psk_server") ||
        ($ph1ent['authentication_method'] == "pre_shared_key")) &&
        isset($ph1ent['mobile'])) {
        $left_spec = "%any";
    } else {
        $tmpsubnet = ipsec_get_phase1_src($ph1ent);
        $leftsubnet_spec[] = $tmpsubnet;
    }

    if (!isset($ph2ent['mobile'])) {
        $rightsubnet_spec[] = $right_spec;
    }
}


К $leftsubnet_spec[] = $tmpsubnet; и $rightsubnet_spec[] = $right_spec; перед точкой с запятой дописываем ."[gre]". В итоге наш код выглядит так:

} else {
    $tunneltype = "type = transport";
    $installpolicy = "installpolicy = yes";

    if ((($ph1ent['authentication_method'] == "xauth_psk_server") ||
        ($ph1ent['authentication_method'] == "pre_shared_key")) &&
        isset($ph1ent['mobile'])) {
        $left_spec = "%any";
    } else {
        $tmpsubnet = ipsec_get_phase1_src($ph1ent);
        $leftsubnet_spec[] = $tmpsubnet."[gre]";
    }

    if (!isset($ph2ent['mobile'])) {
        $rightsubnet_spec[] = $right_spec."[gre]";
    }
}


Данный костыль заставит всегда дописывать GRE, если выбрал транспортный режим! Другие протоколы в транспортном режиме не будут шифроваться!
Файл vpn.inc перезаписывается после каждого обновления pfSense - необходимо будет заново внести изменения!

Комментариев нет: