DD-WRT как PPTP-клиент

Понадобилось как-то обьеденить локальные сети двух небольших офисов. При этом, необходимо было, чтобы каждая сеть использовала свой канал в сеть интернет, а вот трафик для локальных сетей шел через 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. Настройки — на скриншоте:

ddwrt

Иногда бывает, что тунель никак не хотел «подыматься». Связано это с присутствием опций 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-сервера.

P.S.

Проблему дисконнектов я решил вот таким скриптом

/tmp/custom.sh

 

#!/bin/sh
(
while [ ! -z $(/sbin/ifconfig|grep ppp1)  	]
do
sleep 5
done

/etc/config/pptpd_client.startup

while [ ! -f /tmp/pptpd_client/ip-up ]
do
sleep 6
done

cd /tmp/pptpd_client
cp ip-up ip-up.old
grep -v 'exit 0' ip-up.old   ip-up
echo "/sbin/route add -net x.x.x.x netmask 255.0.0.0 dev ppp1"    ip-up
echo "(while [ 1 ]"    ip-up
echo "do "    ip-up
echo "   if ! ping -c 1 x.x.x.x; then "    ip-up
echo "   /tmp/custom.sh"   ip-up  
echo "   /tmp/pptpd_client/vpn stop "    ip-up
echo "  exit 0 "    ip-up
echo "  fi   "    ip-up
echo "  sleep 20"    ip-up
echo "  done) "    ip-up
echo "exit 0"    ip-up
) 

Перед запускам проверяем поднят ли ppp (в моем случае ppp1)

Если не поднят, то стартуем pptpd_client

Ожидаем появления файла /tmp/pptpd_client/ip-up

Вписываем в него код по маршрутизации (при необходимости)

и фоновой проверке соединения

if ! ping -c 1 x.x.x.x;

где x.x.x.x — адрес проверки соединения

При разрыве соединения запускаем снова /tmp/custom.sh и опускаем pptp
Источник

Запись опубликована в рубрике *Lan&Wan, *Unix,*Linux, *Сети. Добавьте в закладки постоянную ссылку.

2 комментария на «DD-WRT как PPTP-клиент»

  1. Евгений говорит:

    iptables -t nat -A PREROUTING -p tcp -i ppp0 \ —dport 80 -j DNAT —to 192.168.239.252:80
    iptables -t nat -A PREROUTING -p tcp -i ppp0 \ —dport 25 -j DNAT —to 192.168.239.252:25
    iptables -t nat -A PREROUTING -p tcp -i ppp0 \ —dport 587 -j DNAT —to 192.168.239.252:587
    iptables -t nat -A PREROUTING -p tcp -i ppp0 \ —dport 465 -j DNAT —to 192.168.239.252:465
    iptables -t nat -A PREROUTING -p tcp -i ppp0 \ —dport 993 -j DNAT —to 192.168.239.252:993
    iptables -t nat -A PREROUTING -p tcp -i ppp0 \ —dport 995 -j DNAT —to 192.168.239.252:995

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Я не спамер This plugin created by Alexei91