Не очень люблю дублировать лишний раз информацию, поэтому просто сошлюсь на статью, по которой я настроил IPSec-туннель между Cisco и FreeBSD: Настройка IPSEC туннеля между Cisco и FreeBSD
От себя лишь хочу добавить вот что.
Если все соединения настроены по данной статье, тогда 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; }
Реальные таблицы маршрутизации бывают много сложнее выдуманных книжных.
Во всех найденных мной статьях между собой связываются два не пересекающихся диапазона IP-адресов. Например, сети 192.168.0.0/24 и 172.16.1.0/25 или 10.0.1.0/24 и 10.0.2.0/24 и т.п.
Но реальные ситуации могут оказаться гораздо сложнее. Например, на одном из маршрутизаторов под управлением FreeBSD могут оказаться три интерфейса:
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.