OpenBSD i DSL (pppoe)

W poniższym wpisie opiszemy jak w systemie OpenBSD połączyć się z modemem DSL, używając protokołu PPPoE (Point-to-Point Protocol over Ethernet). W tym przypadku mamy dwie możliwości: używając aplikacji ppp lub korzystając bezpośrednio z pseudo-urządzenia pppoe (pseudo-device pppoe).

Aplikacja ppp

Pliki konfiguracyjne znajdziemy w katalogu /etc/ppp, a główny plik konfiguracyjny to ppp.conf. Cały plik jest podzielony na sekcje z różnymi przykładami. Nas interesuje protokół pppoe, znajdziemy go w sekcji pppoe:. Właściwie jedyne co należy wpisać to nasz login (set authname) i hasło (set authkey) oraz podać nazwę interfejsu do którego podłączony jest modem DSL (set device) :

root@fw-s:/etc/ppp>tail -n 20 /etc/ppp/ppp.conf 
pppoe:
 set device "!/usr/sbin/pppoe -i vr1"
 set mtu max 1492
 set mru max 1492
 set speed sync
 set crtscts off
 disable acfcomp protocomp vjcomp pred1 deflate
 disable ipv6cp
 deny acfcomp
 enable lqr
 accept lqr
 set lqrperiod 30
 set cd 5
 set login
 set authname "LOGIN"
 set authkey "HASLO"
 enable mssfixup

Aby nawiązać połączenie wpisujemy:

root@fw-s:/etc/ppp>ppp -ddial pppoe
Working in ddial mode
Using interface: tun1

W systemie zostanie utworzony nowy interfejs (w tym przypadku tun1), który jest połączony z fizycznym interfejsem vr1 (bridge). Jeśli nasza konfiguracja jest poprawna, otrzymamy od naszego providera adres IP, który zostanie przypisany do interfejsu:

root@fw-s:/etc/ppp>ifconfig tun1
tun1: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1492
        priority: 0
        groups: tun
        status: active
        inet X.X.X.X --> Y.Y.Y.Y netmask 0xffffffff

Gdzie X.X.X.X to nasz adres IP. W razie problemów, możemy zawsze zajrzeć do logów:

root@fw-s:/etc/ppp>grep "ppp" /var/log/daemon.lg
Aug  5 12:20:13 fw-s ppp[24801]: Phase: Using interface: tun1
Aug  5 12:20:13 fw-s ppp[24801]: Phase: deflink: Created in closed state
Aug  5 12:20:13 fw-s ppp[24801]: tun1: Command: default: set device /dev/cua01
Aug  5 12:20:13 fw-s ppp[24801]: tun1: Command: default: set speed 115200
Aug  5 12:20:13 fw-s ppp[24801]: tun1: Command: pppoe: set device !/usr/sbin/pppoe -i vr1

Dodatkowo ppp może uruchomić dowolny skrypt podczas włączenia/wyłączenia interfejsu. W takim wypadku w katalogu /etc/ppp musimy utworzyć pliki ppp.linkup i ppp.linkdown:

root@fw-s:/etc/ppp>cat /etc/ppp/ppp.linkup
MYADDR:
    !bg sh -c "echo $(date "+%Y%m%d-%H%M") LINK UP >> /tmp/ppp.txt"

Test szybkości przy użyciu ppp

Niestety podczas połączenia przez ppp transfer był bardzo niestabilny i zauważalne były bardzo częste spadki prędkości nawet do kilkudziesięciu kilobitów na sekundę. Przykład poniżej (plik pobierany ze strony kernel.org):

Sytuacja ta ma miejsce zarówno w wersji 4.8 jak i 4.9 systemu. Na szczęście problem ten nie występuje jeśli łączymy się używając pseudo-urządzenia pppoe.

pseudo-device pppoe

W tym przypadku cała konfiguracja zamyka się w pliku /etc/hostname.pppoe0:

root@fw-s:~>cat /etc/hostname.pppoe0
inet 0.0.0.0 255.255.255.255 NONE \
   pppoedev vr1 authproto pap \
   authname 'LOGIN' authkey 'HASLO' up
   dest 0.0.0.1
!/sbin/route add default -ifp pppoe0 0.0.0.1

Tutaj podobnie łączymy interfejs pppoe0 z fizycznym interfejsem vr1. Ważnym jest, żeby vr1 był włączony (UP):

root@fw-s:~>cat /etc/hostname.vr1
up

Połączenie zostanie automatycznie podniesione podczas uruchomienia systemu. Można też sprawdzić konfigurację od razu , korzystając ze skryptu /etc/netstart a jako parametr podać nazwę interfejsu:

root@fw-s:~>sh /etc/netstart pppoe0

Podobnie jak w przypadku aplikacji ppp powinniśmy otrzymać adres adres IP od naszego providera:

root@fw-s:~>ifconfig pppoe0
pppoe0: flags=8851<UP,POINTOPOINT,RUNNING,SIMPLEX,MULTICAST> mtu 1484
        priority: 0
        dev: vr1 state: session
        sid: 0x8ad PADI retries: 6 PADR retries: 0 time: 04:30:14
        sppp: phase network authproto pap authname "LOGIN" 
        groups: pppoe egress
        status: active
        inet6 fe80::200:24ff:fecb:d110%pppoe0 ->  prefixlen 64 scopeid 0xf
        inet X.X.X.X --> Y.Y.Y.Y netmask 0xffffffff

Warto jeszcze ustawić maksymalny rozmiar segmentu (MSS) w pliku /etc/pf.conf dla interfejsu pppoe0:

match on pppoe0 scrub (max-mss 1440)

Opcja ta jest równoważna z ustawieniem enable mssfixup w pliku ppp.conf w przypadku połączenia przez aplikację ppp.

Test szybkości

Tym razem nie było żadnych problemów z transferem, wszystko działało bardzo stabilne:

Więcej informacji znajdziemy jak zawsze w manualu. Dla ppp wpisujemy (man pppoe), a dla pseudo-urządzenia pppoe: man 4 pppoe

  1. Witam,

    Chciałem podziękować za ten artykuł! Od dwóch miesięcy, od czasu zmiany szybkości Neostrady z 6 megabitów na 20, średnie transfery miałem na poziomie około 1/4 megabita. Po upgrade’zie OpenBSD z 4.7 do 5.0 bez zmian. Dopiero odejście od demona ppp na rzecz pseudo-urządzenia pppoe spowodowało, że wszystko działa jak trzeba.

    Pozdrawiam
    Paweł

    • dzięki! ciesze się, że wpis się przydał. sam straciłem na tym problemie troche nerwów.

      pozdrowienia

      • Od wersji OpenBSD 5.1 wpis „match on pppoe0 scrub (max-mss 1440)” nie jest potrzebny, ogólnie max-mss nie jest potrzebne bo teraz pseudo-device pppoe obsługuje jumbo frames, RFC 4638

        Teraz wystarczy:

        inet 0.0.0.0 255.255.255.255 NONE mtu 1500 \
        pppoedev em0 authproto pap \
        authname ‚login’ authkey ‚hasło’ up
        dest 0.0.0.1
        !/sbin/route add default -ifp pppoe0 0.0.0.1

        The physical interface must also be configured like so:

        # echo „up mtu 1508” > /etc/hostname.em0

  2. Witam,

    A czy nie powinno byc jeszcze:

    # cat /etc/hostname.bridge0
    add vr1
    up

    W tym przypadku? Oczywiscie vr1 jest umowne, bo to zalezy od karty sieciowej, u mnie bedzie to sis0.

    Sam prawdopodobnie przejde na neo fiber i przygotowuje sobie konfiguracje.

  3. Zapewne mój powyzszy komentarz jest bledny i to modem/router (ten od tp) trzeba przestawic w tryb bridge. Tak? http://www.elektroda.pl/rtvforum/topic2242445.html

    • W naszym przykładzie do routera (z OpenBSD) podłączony był modem DSL (jeśli chcemy podłączyć zewnętrzny router z funkcją modemu, trzeba by wyłączyć w nim funkcje routingu).
      Plik hostname.bridge0 nie jest potrzebny. W pliku hostname.pppoe0 podajemy fizyczny interfejs z którym połączymy nasz interfejs pppoe0 (w naszym przykładzie jest to vr1 -> „pppoedev vr1”). Ogólnie to możliwości jest sporo, w tym przykładzie to własnie maszyna z OBSD dostanie IP, przez co możemy zrobić wszystko co nam się podoba (firewall, QoS, statystyki etc etc).

  4. @admin: bardzo dziekuje za szybka odpowiedz. Az sie trzaslem na mysl, ze znowu bede musial konfigurowac i tracic nerwy przy pppoe(8). Pseudo-urzadzenie i hostname.pppoe0 jest tak wygodne, ze az przyjemnie to sie ustawia. I jak widac poprawili stabilnosc/wydajnosc przenoszac i usprawniajac kod do jadra systemu. Dzieki raz jeszcze, pozdrawiam serdecznie.

    • ciesze sie, że wpis pomógł. rzeczywiscie hostname.pppoe to zdecydowane usprawnienie, szczególnie jeśli chodzi o wydajność. sam „zmarnowałem” wiele dni na róznych testach, po to też ten wpis. pozdrawiam

  5. Monitoring interfejsów z ifstated | ITCore Tech - pingback on 2012/08/05 w 17:50

Zostaw komentarz


Podpowiedź - możesz użyć tych HTML tagów i atrybutów:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Obraz CAPTCHY

*

Trackback'i i Pingback'i: