четверг, 10 июня 2010 г.

Настройка 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.

2 комментария:

Sergey комментирует...

Подскажите, а нужно ли предварительно поднимать туннель до циски через gif ? Настраивал по этой статье, запускаю racoon и не вижу вообще никакого трафика. В логах, всего три строчки. Сейчас под рукой нет, но заканчивается он примерно так: читаю конфигурационный файл.

morbo комментирует...

Тунель поднимать не нужно. Сразу после запуска связь не устанавливается сама по себе - нужно чтобы пошёл трафик в направлении IPSec-туннеля. Можно попробовать сделать пинг, удовлетворяющий правилам для шифруемого трафика.