Понадобилось как-то обьеденить локальные сети двух небольших офисов. При этом, необходимо было, чтобы каждая сеть использовала свой канал в сеть интернет, а вот трафик для локальных сетей шел через VPN-тунель между офисами. Это возможно, если IP-адресация офисов отличается. В моем случае IP-адресация в офисе №1 была 192.168.0.0/24, а в офисе №2 - 192.168.1.0/24.
В офисе №1 в роли маршрутизатора был сервер с установленной FreeBSD и настроенным по этой статье PPTP VPN-сервером на базе MPD5. К тому же, в этой точке был статический маршрутизируемый IP-адрес. В офисе №2 в качестве маршрутизатора был задействован TP-LINK TL-WR741ND. Соответственно, решил отталкиваться от существующей аппаратной части, чтобы минимизировать финансовые затраты.
На маршрутизатор TP-LINK TL-WR741ND была установлена прошивка DD-WRT. Рассматривать процес перепрошивки роутера не буду, чтобы не отвлекаться от основной задачи (да и в Сети информации предостаточно по этому вопросу).
Ссылка на настройку PPTP VPN-сервер на базе MPD5 указывалась выше. Отталкиваемся от того, что сервер корректно настроен, принимает входящие подключения и работает. Теперь дело за малым - настроить PPTP-клиента на DD-WRT. Настройки - на скриншоте:
Иногда бывает, что тунель никак не хотел "подыматься". Связано это с присутствием опций lcp-echo-interval и lcp-echo-failure в конфигурационном файле PPTP-клиента DD-WRT (/tmp/pptpd_client/options.vpn). Решением выступает запуск следующего скрипта на DD-WRT:
(while [ ! -f /tmp/pptpd_client/options.vpn ]; do sleep 10; done sed /lcp/d /tmp/pptpd_client/options.vpn > /tmp/pptpd_client/temp.vpn cp /tmp/pptpd_client/temp.vpn /tmp/pptpd_client/options.vpn )& |
Выполнить этот скрипт необходимо в окне ввода комманд: Тех.обслуживание -> Команды. После внесения скрипта в текстовое поле, жмем кнопку "Сохр. параметры запуска" и перезагружаем маршрутизатор. Теперь тунель подымается и работает без обрывов.
Маршрут к сети офиса №1 DD-WRT добавляет самостоятельно (адресацию сети мы задали в настройках PPTP-клиента). А вот маршрут к сети офиса №2 на маршрутизаторе под управлением FreeBSD необходимо будет добавить. И здесь возникла загвоздка...
При использовании MPD в роли PPTP-клиента, для добавления маршрутов я использовал скрипт /usr/local/etc/mpd5/if-up.sh примерно следующего содержания:
#!/bin/sh # $0 - script name # $1 - if name (ng0...) # $2 - proto # $3 - local-ip # $4 - remote-ip # $5 - authname # $6 - [ dns1 server-ip ] # $7 - [ dns2 server-ip ] # $8 - peer-address if [ "$5" = "ddwrt" ] then /sbin/route -q add 192.168.121.0/24 $4 fi |
А в конфигурационный файл /usr/local/etc/mpd5/mpd.conf в секцию pptp_client добавлялась строка:
set iface up-script /usr/local/etc/mpd5/if-up.sh |
Однако MPD в роли сервера ни в какую не хотел выполнять скрипт при коннекте клиента, поэтому пришлось воспользоваться костылем - установил quagga и добавил с ее помощью статический маршрут, который автоматически активировался при подключении клиента.
После этих нехитрых манипуляций внутренние ресурсы офисов были доступны друг для друга. Однако во время работы неоднократно наблюдал обрывы передачи данных при поднятом тунеле, что не очень радует. Причем протестировал в разных режимах на двух маршрутизаторах - проблема идентична. Поэтому дополнительно протестировал качество работы DD-WRT в качестве PPTP-сервера.
Re: DD-WRT как PPTP-клиент
Проблему дисконнектов я решил вот таким скриптом
/tmp/custom.sh
#!/bin/sh
Перед запускам проверяем поднят ли ppp (в моем случае ppp1)
Если не поднят, то стартуем pptpd_client
Ожидаем появления файла /tmp/pptpd_client/ip-up
Вписываем в него код по маршрутизации (при необходимости)
и фоновой проверке соединения
где x.x.x.x - адрес проверки соединения
При разрыве соединения запускаем снова /tmp/custom.sh и опускаем pptp