Собственнло вот что получилось.
Код: Выделить всё
uname -a
FreeBSD gateway 8.2-RELEASE-p2 FreeBSD 8.2-RELEASE-p2 #0: Mon Jul 18 11:48:39 EEST 2011 root@gateway:/usr/obj/usr/src/sys/FREE82 amd64
Код: Выделить всё
pkg_info | grep ipsec
ipsec-tools-0.8.0_1 KAME racoon IKE daemon, ipsec-tools version
1. Пересобираем ядро c опциями
Код: Выделить всё
options IPSEC
options IPSEC_NAT_T #Для 8ки
options IPSEC_DEBUG
options IPSEC_FILTERTUNNEL
device crypto
device enc
Тут все стандартно в инете куча статей про настройку ipsec-tools, но для фильрации фишка в "device enc"
Это виртуальный интерфейс в который завернется весть IPSEC трафик.
2. В rc.conf добавляем
Тем самым будем поднимать его при старте системы.
3. ipsec.conf - все стандартно как по статьям, сети соеденяем как tunnel
Я настраивал тунели через dif интерфейсы, но думаю что будет работать и без них.
4. Далее добиваемся работы IPSEC, в правилах фильтрации первым ставим pass quick all
5. Когда сети нормально соеденились, настраиваем правила фильтрации для тунелей:
pf.conf
Код: Выделить всё
enc_if="enc0"
A_host_to_B_lan="{ 192.168.1.5 192.168.1.6 }"
B_host_to_int_host="{ 192.168.2.4 192.168.2.5 }"
B_lan="192.168.2.0/24"
$A_ipsec_host="11.22.33.44."
$B_ipsec_host="44.22.33.11"
pass out quick on $ext_inet proto esp from $A_ipsec_host to $B_ipsec_host
pass out quick on $ext_inet proto ah from $A_ipsec_host to $B_ipsec_host
pass out quick on $ext_inet proto ipencap from $A_ipsec_host to $B_ipsec_host
pass out quick on $ext_inet proto udp from $A_ipsec_host port { isakmp 4500 } to $B_ipsec_host port { isakmp 4500 }
pass in quick on $ext_inet proto esp from $B_ipsec_host to $A_ipsec_host
pass in quick on $ext_inet proto ah from $B_ipsec_host to $A_ipsec_host
pass in quick on $ext_inet proto ipencap from $B_ipsec_host to $A_ipsec_host
pass in quick on $ext_inet proto udp from $B_ipsec_host port { isakmp 4500 } to $A_ipsec_host port { isakmp 4500 }
pass out quick on { $ext_inet gif0 $enc_if } from $A_host_to_B_lan to $B_lan
pass in quick on { $ext_inet gif0 $enc_if } from $B_host_to_int_host to $A_host_to_B_lan
pass out quick on { $ext_inet gif0 $enc_if } proto tcp from 192.168.1.2 192.168.2.7 port 5223
pass in quick on { $ext_inet gif0 $enc_if } proto tcp from 192.168.2.7 to 192.168.1.2 port 5223
Этими правилами мы позволяем построить тунель между сетями, а так же:
1. Хостам сети А 192.168.1.5 192.168.1.6 ходить на любые IP сети B
2. Хостам сети B 192.168.2.4 192.168.2.5 ходить только на хосты сети А 192.168.1.5 192.168.1.6
3. А хосту 192.168.2.7 цепляться на порт 5223 хоста сети В 192.168.1.2 и наоборот.
{ $ext_inet gif0 $enc_if } - Так прописал не зря.
Правила проверял на нескольких провайдерах, фильтрация работала на одном, но не работала на другом.
Что бне парится прописал именно так - работает на всех (которых я проверял).
Важно, не нужно указывать в правиле set skip lo0 , интерфейс enc0 а то фильрация работать не будет.
Вообщем проверяйте, критикуйте.
Правила не идеальны...