VPN через NAT
2009-02-17 22:26Весьма элегантное решение для FreeBSD проблемы проброса VPN через мало приспособленные для этого подключения к Сети типа мобильного телефона или ADSL-модема, когда клиенту выдается, в общем случае, динамический "приватный" адрес IP вида 192.168.0.100 или 10.1.2.3 и выход в сеть идет через трансляцию адресов. Причем иногда нормально пропускаются только протоколы TCP и UDP. А, например, GRE уже не пройдет, и, следовательно, PPtP тоже.
Так вот, решением в таком случае становится L2TP, который инкапсулирует произвольный поток IP-пакетов, выдавая поток UDP-пакетов и предоставляя стандартный PPP-интерфейс со всеми "фичами" протокола PPP - с авторизацией, шифрованием, автоматическим выделением IP-адресов для VPN-соединения, адресов серверов DNS и MS WINS и т.п. Замечательно проходит через любые трансляции адресов.
Серверная часть на основе mpd5. Конфигурация mpd.conf:
startup:
# через полчаса (1800 секунд) неактивности закрывать
# соединения l2tp, по умолчанию 10 секунд
set global l2tptimeout 1800
default:
load l2tp
l2tp:
# создание шаблона соединения - реальное соединение будет
# создано по этому шаблону при входящем подключении L2TP-клиента
create bundle template P
# тут произвольные параметры IPCP, хорошо знакомые по более
# распространенным рецептам настроек "традиционного" PPP,
# PPtP или PPPoE
set ipcp yes vjcomp
set ipcp ranges 192.168.100.33/32 192.168.100.34/32
# используем только один линк в соединении
create link template L1 l2tp
# собственный адрес L2TP-сервера, к которому будет подключаться клиент
set l2tp self 1.1.1.1
# имя L2TP-сервера для диагностики - будет "светиться" в журналах
set l2tp hostname mydomain.ru
# пароль для авторизации клиентского L2TP-хоста и шифрования
# служебных пакетов
set l2tp secret "myl2tppassword"
# использовать пароль для шифрования служебных пакетов
set l2tp enable hidden
# привязываем линк к нашему шаблонному соединению
set link action bundle P
# опять любые стандартные настройки PPP
set link accmap 0
set link yes acfcomp protocomp
set link no pap chap
set link keep-alive 65 180
# это шаблон входящих соединений
set link enable incomingПри желании можно добавить авторизацию внутри PPP и динамическое выделение IP-адресов для VPN-клиента, тут приведена простейшая конфигурация без авторизации пользователя (но с авторизацией клиентского L2TP-хоста).Настройка клиента очень похожа, mpd.conf:
startup:
set global l2tptimeout 1800
default:
load l2tp
l2tp:
# клиент создает не шаблон для входящих соединений,
# а одно конкретное исходящее соединение
create bundle static P
set ipcp yes vjcomp
# один линк в соединении (бывают и мультилинковые)
create link static L1 l2tp
set link action bundle P
set link accmap 0
set link yes acfcomp protocomp
set link no pap chap
set link keep-alive 65 180
# при обрыве связи переподключаться неограниченное число раз,
# по умолчанию значение -1 (не переподключаться)
set link max-redial 0
# это не входящее соединение, а исходящее
set link disable incoming
# адрес L2TP-сервера
set l2tp peer 1.1.1.1
set l2tp secret "myl2tppassword"
set l2tp enable hidden
# сразу после старта mpd открывать соединение
set l2tp enable outcall
open