Рассказываю:
Пусть есть ВПН сервер (10.0.0.1)
Пусть есть компьютер, который мы хотим к серверу подсоединить, с внешним интерфейсом (10.4.19.3)
И есть шлюз,который позволяет нам подсоединяться к серверу
(шлюз 10.4.19.1) На самом деле вся беда именнно в его наличии (более подробно ниже).
Для соединения используем mpd (была попытка на pptp-client,но из=за меньшего количества настроек пришлось отказаться).
Вот конфиг с условием, что мой сервер не требует криптования и компресии (хотя с последним тоже работает):
Настройки mpd:
------------mpd.conf---------
default:
load work
work:
new -i ng0 work work
set ipcp enable req-pri-dns req-sec-dns
set link disable chap pap
set link accept chap
set iface idle 0
set bundle authname "******"
set bundle password "******"
set iface disable on-demand
open
-----------mpd.links---------
work:
set link type pptp
set pptp peer 10.0.0.1
set pptp enable originate outcall
Запускаем: mpd
Получаем лог:
Обрезал, но сверху все должно удачно пройти, те
должны быть получены ДНС адреса и внешний **ip**.
....................
Feb 15 20:20:51 khome mpd: [work] IPCP: LayerUp
Feb 15 20:20:51 khome mpd: **ip** -> 10.0.0.1
Feb 15 20:20:51 khome mpd: [work] IFACE: Up event
Feb 15 20:20:51 khome mpd: [work] setting interface ng0 MTU to 1500 bytes
Feb 15 20:20:51 khome mpd: [work] exec: /sbin/ifconfig ng0 **ip** 10.0.0.1 netmask 0xffffffff -link0
Feb 15 20:20:51 khome mpd: [work] exec: /sbin/route add **ip** -iface lo0
Feb 15 20:20:51 khome mpd: [work] exec: command returned 256
Feb 15 20:20:51 khome mpd: [work] IFACE: Up event
Feb 15 20:20:52 khome mpd: [work] error writing len 16 frame to bypass: Resource deadlock avoided
Вот тут и не получалось, а вот почему :
Для доступа к серверу (10.0.0.1) требуется наличие шлюза 10.4.19.1, который до соединения был шлюзом по умолчанию и все запросы на 10.0.0.1 шли просто на его, так как не было прописано прямого роута.
А теперь mpd предполагая,что между сервером и клиентом ничего нет прописывает:
10.0.0.1 **ip** UH 1 1 ng0
то есть появляется прямой роут для 10.0.0.1, но на самом деле в данным момент теряется связь с 10.0.0.1, так как компьютер перестает понимать , что для доступа к 10.0.0.1 нужно обязательно идти через 10.4.19.1 (шлюз).
Вот и происходит поднятие интерфейса ng0, но возможности работать через него нет, так как нет свзи с 10.0.0.1.
Решение:
В тот момент, когда была достигнута ошибка, mpd не срывает соединение (в отличие, кстати, от pptp-client'a), а, если было указано max в mpd.conf в строке set link keep-alive seconds max, то перезапускает соединение по достижению max. Но я использую seconds =0 и max =0 , что позволяет не перезапускать соединение вообще.
Дело за малым:
Удаляем маршрут 10.0.0.1 **ip** UH 1 1 ng0
(route delete 10.0.0.1)
Создаем то, что нам нужно (route add 10.0.0.1 10.4.19.1)
далее следуя рекомендациям статьи http://www.cs.rpi.edu/~flemej/fbsd-cisco-vpn/fbsd-cisco-vpn.pdf
удаляем шлюз (route delete default)
и создаем новый шлюз (route add default -interface ng0)
И все начинает работать!
Большое спасибо Xela и Freestyle за дельные советы и объяснения!