Настройка IPSEC туннеля между Cisco и FreeBSD

Не очень люблю дублировать лишний раз информацию, поэтому просто сошлюсь на статью, по которой я настроил IPSec-туннель между Cisco и FreeBSD: Настройка IPSEC туннеля между Cisco и FreeBSD

От себя лишь хочу добавить вот что.

  1. Если все соединения настроены по данной статье, тогда sainfo в конфигурации racoon будет везде совпадать. А это значит, что вместо повторения одной и той же секции, можно написать секцию sainfo один раз, заменив секции вида:

    sainfo subnet 10.5.3.0/24 any address 10.11.16.0/23 any {
      pfs_group 2;
      lifetime time 24 hour;
      encryption_algorithm aes;
      authentication_algorithm hmac_sha1;
      compression_algorithm deflate;
    }

    на одну секцию вида

    sainfo anonymous{
      pfs_group 2;
      lifetime time 24 hour;
      encryption_algorithm aes;
      authentication_algorithm hmac_sha1;
      compression_algorithm deflate;
    }
  2. Реальные таблицы маршрутизации бывают много сложнее выдуманных книжных.

    Во всех найденных мной статьях между собой связываются два не пересекающихся диапазона IP-адресов. Например, сети 192.168.0.0/24 и 172.16.1.0/25 или 10.0.1.0/24 и 10.0.2.0/24 и т.п.

    Но реальные ситуации могут оказаться гораздо сложнее. Например, на одном из маршрутизаторов под управлением FreeBSD могут оказаться три интерфейса:

    1. Интернет-интерфейс, через который идёт трафик по-умолчанию, и трафик на сеть 192.168.1.0/24,
    2. Локальный интерфейс, к которому подключена сеть 10.0.0.0/25,
    3. Некий дополнительный интерфейс, через который нужно направлять шифрованный трафик из локальной сети в сеть 192.168.0.0/16.
    LAN 10.0.0.0/25
          |
          |
      ____|______
     |           |
     |  FreeBSD  |------> Internet, LAN 192.168.1.0/24
     |___________|
          ||
          || IPSec
     _____||_____
    |            |
    |   Cisco    |
    |____________|
          |
          |
          |  
    LAN 192.168.0.0/16

    Что мы видим в этом случае? Два пересекающихся диапазона IP-адресов: 192.168.1.0/24 и 192.168.0.0/16. В файле ipsec.conf FreeBSD можно указать лишь сети, для которых будет осуществляться шифрование, но нельзя указать интерфейс, для которого действует это правило. В итоге может получиться, что будет шифроваться весь трафик из сети 10.0.0.0/25 в сеть 192.168.0.0/16, включая трафик на сеть 192.168.1.0/24, уходящий через Интернет-интерфейс, где никто не ожидает, что он будет зашифрован.

    Или другой подобный случай. Есть большая IPSec-сеть, в которой филиальные маршрутизаторы FreeBSD соединяются только с центральным офисом компании. Маршрутизаторов много, скажем три-четыре десятка, за каждым из них закреплён свой диапазон 10.0.x.0/24. Что делать, если к центральному офису будет подключен ещё один филиальный маршрутизатор? Нужно будет прописывать эту сеть в политики шифрования каждого из остальных филиальных маршрутизаторов? А не устанешь?

    LAN 10.0.x.0/24
          |
          |
      ____|______
     |           |
     |  FreeBSD  |
     |  10.1.0.x |
     |___________|
          ||
          || IPSec
     _____||_____           ___________
    |            |         |           |
    |   Cisco    |  IPSec  |  FreeBSD  |
    |  10.1.0.1  |=========| 10.1.0.y  |--------LAN 10.0.y.0/24
    |____________|         |___________|
          ||
          || IPSec
      ____||_____
     |           |
     |  FreeBSD  |
     | 10.1.0.z  |
     |___________|
          |
          |
          |
    LAN 10.0.z.0/24

    В таком случае было бы хорошо настроить на маршрутизаторах филиалов некое подобие маршрута по умолчанию. Например, прописать, что филиальный маршрутизатор должен шифровать трафик между сетями 10.0.0.0/8 в центральном офисе и 10.0.x.0/24 в филиале. Но если написать так в ipsec.conf, то маршрутизатор будет шифровать трафик между своей локальной сетью 10.0.x.0/24 и собой 10.0.x.1, поскольку его собственный адрес 10.0.x.1 формально тоже находится в "большой сети" 10.0.0.0/8. А ведь FreeBSD может быть не только маршрутизатором, а и, например, почтовым сервером. В таком случае почтой в локальной сети филиала пользоваться не смогут.

    Именно на такую ловушку я и попался. Хорошо, что я перед настройкой на реальном оборудовании собрал тестовый стенд, на котором и выявил такую проблему.

    В подобных случаях можно исключить некую подсеть из большой сети следующим образом:

    spdadd 10.0.8.0/24 10.0.8.0/24 any -P out none;
    spdadd 10.0.8.0/24 10.0.8.0/24 any -P in none;
    spdadd 10.0.8.0/24 10.0.0.0/8 any -P out ipsec esp/tunnel/10.1.0.8-10.1.0.1/unique;
    spdadd 10.0.0.0/8 10.0.8.0/24 any -P in ipsec esp/tunnel/10.1.0.1-10.1.0.8/unique;

    В этом примере мы исключаем из шифрования сети 10.0.0.0/8 подсеть 10.0.8.0/24.

Написать автору