суббота, 28 ноября 2009 г.

Трансляция PPTP (GRE) на шлюзе с PF

Как известно, межсетевой экран PF, портированный в FreeBSD из OpenBSD, не может корректно транслировать (NAT) GRE-протокол и, к примеру, из локальной сети невозможно создать несколько одновременных соединений к внешнему серверу VPN PPTP.
Одним из способов решения проблемы является трансляция PPTP-соединений родным IPFW с «ядерным» NAT. При этом вовсе необязательно компилировать ядро. Все описанные действия проверены в FreeBSD версии 7.2. Но должно работать и в других версиях, где есть поддержка «ядерного» NAT для IPFW.

В «/etc/rc.conf» добавляем

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

Комментариев нет: