Как известно, межсетевой экран PF, портированный в FreeBSD из OpenBSD, не может корректно транслировать (NAT) GRE-протокол и, к примеру, из локальной сети невозможно создать несколько одновременных соединений к внешнему серверу VPN PPTP.
Одним из способов решения проблемы является трансляция PPTP-соединений родным IPFW с «ядерным» NAT. При этом вовсе необязательно компилировать ядро. Все описанные действия проверены в FreeBSD версии 7.2. Но должно работать и в других версиях, где есть поддержка «ядерного» NAT для IPFW.
В «/etc/rc.conf
» добавляем
Создаем файл «
- #Включаем IPFW
- firewall_enable="YES"
- # Подгружаем модуль ядра ipfw_nat
- firewall_nat_enable="YES"
- # Указываем путь к скрипту загрузки правил
- firewall_script="/etc/ipfw.script"
/etc/ipfw.script
»Делаем скрипт исполняемым
- #!/bin/sh
- /sbin/ipfw -q /dev/stdin <<RULES
- flush
- #em0 - внешний интерфейс шлюза
- nat 10 config if em0
- #Правила для трансляции PPTP-соединения
- add 10 nat 10 gre from any to any
- add 11 nat 10 tcp from any to any dst-port pptp
- add 12 nat 10 tcp from any pptp to any
- # Разрешаем весь трафик
- add allow all from any to any
- RULES
# chmod +x /etc/ipfw.scriptДобавляем в правила PF
После всех сделанных изменений перезагружаемся.
- # Запрещаем PF транслировать PPTP-соединения
- no nat on $external_if proto gre all
- no nat on $external_if proto tcp from any to any port = pptp
- no nat on $external_if proto tcp from any port = pptp to any
- ... skip ...
- # Пропускаем PPTP-соединения
- pass quick on $external_if inet proto tcp from any to any port 1723
- pass quick on $external_if inet proto tcp from any port 1723 to any
- pass quick on $external_if inet proto gre from any to any