Страница 1 из 1

поднятие l2tp на ng интерфейсе

Добавлено: 2010-10-04 13:48:13
EARL
Имеется подключение к провайдеру через pppoe. Настроено посредством mpd5. При подключении провайдер выдает белый IP (X.X.X.X). Необходимо на этом IP поднять сервер L2TP. Вот конфиг:

Код: Выделить всё

startup:
        set user admin admin admin
        set console self 0.0.0.0 23
        set console open
default:
        load isp_pppoe
        load l2tp_server
isp_pppoe:
        create bundle static B1
        set iface idle 0
        set iface enable tcpmssfix
        set ipcp yes vjcomp
        set iface up-script "/usr/local/etc/mpd5/pppoe-up.sh"
        set iface down-script "/usr/local/etc/mpd5/pppoe-down.sh"
        create link static L1 pppoe
        set link action bundle B1
        set link yes acfcomp protocomp
        set link keep-alive 10 60
        set link max-redial 0
        set auth authname "***"
        set auth password "***"
        set pppoe iface rl1
        set pppoe service ""
        open
l2tp_server:
        create bundle template B2
        set iface idle 1800
        set iface enable tcpmssfix
        set iface up-script "/usr/local/etc/mpd5/l2tp-up.sh"
        set iface down-script "/usr/local/etc/mpd5/l2tp-down.sh"
        set ipcp yes vjcomp
        set ipcp ranges 172.16.1.1 172.16.1.0/24
        set bundle enable compression
        set ccp yes mppc
        set mppc yes e40
        set mppc yes e128
        set mppc yes stateless
        create link template L2 l2tp
        set link action bundle B2
        set link yes acfcomp protocomp
        set link no pap chap
        set link enable chap chap-msv1 chap-msv2 chap-md5
        set link keep-alive 10 60
        set l2tp self X.X.X.X
        set link enable incoming
Т.к. на подключение и выдачу провайдером белого IP адреса X.X.X.X уходит некоторое время L2TP обламывается в привязки к IP, который машина еще не получила. Приходится каждый раз телнетом заходить в консоль mpd и писать там:

Код: Выделить всё

        set l2tp self X.X.X.X
        set link enable incoming
В логах mpd5 видно вот что:

Код: Выделить всё

Oct  3 18:54:57 excluzive mpd: Multi-link PPP daemon for FreeBSD
Oct  3 18:54:57 excluzive mpd:
Oct  3 18:54:57 excluzive mpd: process 1579 started, version 5.5 (root@excluzive.ws 23:51 27-Feb-2010)
Oct  3 18:54:57 excluzive mpd: CONSOLE: listening on 0.0.0.0 23
Oct  3 18:54:57 excluzive mpd: [B1] Bundle: Interface ng0 created
Oct  3 18:54:57 excluzive mpd: L2TP: bind: Can't assign requested address
Oct  3 18:54:57 excluzive mpd: [L1] Link: OPEN event
Oct  3 18:54:57 excluzive mpd: [L1] LCP: Open event
Причем если PPTP нормально умеет привязываться, а с L2TP такая вот проблема. У кого какие идеи как всё таки заставить L2TP корректно стартовать?

Re: поднятие l2tp на ng интерфейсе

Добавлено: 2010-10-10 14:16:49
Alex Keda
интересно, на какой адрес он ломится...
дебажность побольше сделать нельзя?

Re: поднятие l2tp на ng интерфейсе

Добавлено: 2010-10-10 14:48:26
EARL
Alex Keda писал(а):интересно, на какой адрес он ломится...
не совсем понял, что вы имеете в виду, т.к. с pppoe проблем нет - оно устанавливается, а вот l2tp сервер уже не запускается.

Re: поднятие l2tp на ng интерфейсе

Добавлено: 2010-10-10 14:58:27
Alex Keda

Код: Выделить всё

Oct  3 18:54:57 excluzive mpd: L2TP: bind: Can't assign requested address

Re: поднятие l2tp на ng интерфейсе

Добавлено: 2010-10-10 15:09:05
EARL
это потому что в конфиге у меня адрес L2TP сервера указан тот, что выдает мне провайдер, а на момент запуска mpd сессия pppoe еще не установлена и адрес этот мне еще никто не выдал.

Re: поднятие l2tp на ng интерфейсе

Добавлено: 2010-11-25 19:31:55
EARL
Попробовал изменить строчку в конфиге на

Код: Выделить всё

        set l2tp self 0.0.0.0
Тут вроде всё хорошо. L2TP слушает на всех интерфейсах. Коннекты идут, сессии поднимаются и всё хорошо вроде. Но имеются проблемы в установке сессий с некоторых сетей, лежащих за соседним роутером.
Логическая схема сети:
Диаграмма1.png
R1 - мой сервер
R2 - соседний сервер
ISP1 - провайдер 1
ISP2 - провайдер 2

Провайдеры ISP1 и ISP2 имеют между собой пиринг. Серверы R1 и R2 соединены между собой через gif интерфейс. Таблицы роутеров:

R1

Код: Выделить всё

Destination        Gateway            Flags    Refs      Use  Netif Expire
default            10.0.0.8           UG1         0  9109437   ng0
10.0.0.8           link#13            UH          0        0   ng0
78.X.X.0/17        192.168.135.5      UG1         0  1408823   gif0
91.X.X.1           link#13            UHS         0    24190   lo0
192.168.135.5      link#11            UH          0    21727   gif0
192.168.135.6      link#11            UHS         0        0   lo0
R2

Код: Выделить всё

Destination        Gateway            Flags    Refs      Use  Netif Expire
default            78.X.X.82          UG1         0  9109437   ngX
78.X.X.82          link#10            UH          0        0   ngX
78.X.X.1           link#8             UHS         0    24190   lo0
192.168.135.6      link#12            UH          0    21727   gif0
192.168.135.5      link#12            UHS         0        0   lo0
В случае когда коннекты идут из ISP1 всё в порядке, но если пытаться поднять сессию из сети ISP2, то сессия не поднимается. Поснифал tcpdump'ом и вижу как пакеты прилетают на ng0 [91.X.X.1] интерфейс, а обртано летят через gif0 [192.168.135.6]. В качестве фаервола стоит pf.

Код: Выделить всё

if="ng0"
ip="91.X.X.1"
gw="10.0.0.8"

nat on $if from !<net_me> -> ($if)

pass out quick on $if

pass in quick on $if reply-to ($if $gw) inet proto { tcp, udp } to $if port 53                  # dns
pass in quick on $if reply-to ($if $gw) inet proto tcp to $if port 80                           # http
pass in quick on $if reply-to ($if $gw) inet proto tcp to $if port 25                           # smtp
pass in quick on $if reply-to ($if $gw) inet proto tcp to $if port 110                          # pop3
pass in quick on $if reply-to ($if $gw) inet proto udp from <net_free> to $if port 1701  # l2tp
pass in quick on $if reply-to ($if $gw) inet proto icmp to $if                                  # icmp
В табличке net_free указаны адреса сетей обоих ISP, а в табличке net_me указаны все ip адреса интерфейсов сервера.

Получается правила reply-to тут не срабатывают.

Re: поднятие l2tp на ng интерфейсе

Добавлено: 2010-12-30 11:18:04
EARL
При попытке клиента установить L2TP сессию, клиент делает запрос, а на него сервер сам пытается установить соединения с клиентом, поэтому приведенная выше схема не работала. Но решение нашлось. Привязываем L2TP к lo0 интерфейсу

Код: Выделить всё

        set l2tp self 127.0.0.1
Дальше в правилах pf делаем редирект на 127.0.0.1

Код: Выделить всё

if="ng0"
ip="91.X.X.1"
gw="10.0.0.8"

nat on $if from !<net_me> -> ($if)

rdr on $if inet proto udp from to ($if) port 1701 tag ext_if1 -> 127.0.0.1
pass in quick on $if reply-to ($if $gw) tagged ext_if1

pass out quick on $if

pass in quick on $if reply-to ($if $gw) inet proto { tcp, udp } to $if port 53                  # dns
pass in quick on $if reply-to ($if $gw) inet proto tcp to $if port 80                           # http
pass in quick on $if reply-to ($if $gw) inet proto tcp to $if port 25                           # smtp
pass in quick on $if reply-to ($if $gw) inet proto tcp to $if port 110                          # pop3
#pass in quick on $if reply-to ($if $gw) inet proto udp from <net_free> to $if port 1701  # l2tp
pass in quick on $if reply-to ($if $gw) inet proto icmp to $if                                  # icmp
Всё. Теперь коннекты из любых сетей принимаются на внешем интерфейсе независимо от маршрутов имеющихся в таблице маршрутизации.