от Росен Антонов(3-04-2004)

рейтинг (69)   [ добре ]  [ зле ]

Printer Friendly Вариант за отпечатване

Това е още една статия, която описва как да конфигурирате PPPoE клиент под Линукс. Също така, тук ще бъдат засегнати въпроси отнасящи се до споделянето на интернет достъп от доставчик, който ползва PPPoE.

1.1 Що е то PPPoE?

PPPoE (Point to Point Protocol over Ethernet) е протокол. Използва се активно в страни, където кабелните и DSL модеми са много силно разпространени. Накратко в една стандартна LAN мрежа хостовете комуникират чрез протоколи като TCP/IP, които от своя страна директно стъпват върху ethernet протокола. При една PPPoE комуникация между TCP/IP и ethernet се намества PPPoE протоколът. По този начин PPPoE пакетите енкапсулират в себе си TCP/IP пакетите. От това следват редица предимства и недостатъци. Като краен резултат между клиента и сървъра се реализира Point to Point връзка (също както при телефонните модеми), която ползва ethernet мрежата като преносна среда.

1.2 Предимства:

- Интернет доставчикът може да отчита използвания интернет достъп по време.
- Освен защита по MAC адрес се въвежда и защита с потребителско име и парола.
- Клиентът може да забрани поддръжката на TCP/IP пряко. По този начин той ще е свързан към мрежата на доставчика, но ще е невидим за другите клиенти. Така вероятността за заразяване с вируси и нежелано проникване се намалява с 50%. Поддръжката на TCP/IP при установяване на конекция между него и PPPoE сървъра остава, но тя е енкапсулирана в PPPoE пакетите и е неразбираема за другите.

1.3 Недостатъци:

- Няма вградени PPPoE клиенти в повечето версии на Windows. Макар тук да говорим за Линукс, тази "малка" подробност не е за пропускане. Windows потребителите са принудени да ползват допълнителни софтуерни продукти, повечето от които се заплащат. Това допълнително увеличава първоначалните разходи. Част от доставчиците, който ползват PPPoE, инсталират на незапознатите нови потребители нелегални копия на такива софтуерни продукти, без дори да ги попитат.
- Процесите, които управляват PPPoE връзката заемат значително процесорно време. Това е много относително, но ако искате да впрегнете старата 486-ца като рутер в домашната си мрежа, след дълги проби може да забележите, че никога не успявате да вдигнете повече от 4Mbits/sec.


2. Установяване на връзката

За целта имаме нужда от работеща Линукс машина, на която са инсталирани  пакетите ppp и rp-pppoe. По подразбиране повечето дистрибуции покриват изискванията. Ако все пак нещата при вас не са както трябва, може да пробвате с Knoppix. Всичко в статията по-долу е изпробвано под Knoppix 3.2 (от 15.април.2003), Slackware 9.1, RedHat 9.
За примерите по-долу приемаме следното:
- Вашият външен интерфейс е eth0.
- Потребителското ви име е smalluser.
- Паролата ви е smallpass.
- DNS сървърите на доставчика са XXX.XXX.XXX.YYY и XXX.XXX.XXX.ZZZ.
- Service-name параметърът ви има стойност abc.

Първо трябва да проверим дали външният ви интерфейс е "up" (вдигнат). Изпълняваме:

ifconfig

Примерен резултат:

eth0   Link encap:Ethernet  HWaddr 00:00:23:0E:84:5A
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:1721052 errors:0 dropped:0 overruns:0 frame:1665
         TX packets:1153395 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:100
         RX bytes:2454820747 (2.2 GiB)  TX bytes:78621860 (74.9 MiB)
         Interrupt:9 Base address:0xc000

lo       Link encap:Local Loopback
         inet addr:127.0.0.1  Mask:255.0.0.0
         UP LOOPBACK RUNNING  MTU:16436  Metric:1
         RX packets:6622 errors:0 dropped:0 overruns:0 frame:0
         TX packets:6622 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:0
         RX bytes:266932 (260.6 KiB)  TX bytes:266932 (260.6 KiB)

Щом виждаме информацията за eth0, значи интерфейсът е вдигнат. Ако виждате информация само за lo, то трябва ръчно да вдигнете eth0 с командата:

ifconfig eth0 up

След това проверете отново дали виждате eth0. Ако не, то най-вероятно имате проблем с мрежовата карта. Няма смисъл да продължавате със следващите стъпки ако eth0 не е вдигнат.

Внимание! Ако изпълните командата:

ifconfig eth0

то вие ще получите информация за въпросния интерфейс дори и да не е вдигнат.

Изпълняваме командата:

pppoe -I eth0 -A

Тя претърсва мрежата на доставчика (чрез изпращане на PADI фреймове) за налични концентратори и сервизи. Това са тези логически точки, към които вие трябва да се включите. Ето един примерен резултат:

Access-Concentrator: cc-12
      Service-Name: c1
      Service-Name: c2
      Service-Name: c3
AC-Ethernet-Address: 00:06:a3:9a:aa:2b
--------------------------------------------------

Тук трябва да видите този Service-Name, към които доставчикът ви е казал, че трябва да се включите. Ако командата даде резултат:

pppoe: Timeout waiting for PADO packets

то вие нямате връзка към входните точки на доставчика. Проверете всичко добре и опитайте пак! Няма смисъл да продължавате по-надолу ако не видите вашия Service-name.

Настройваме DNS сървърите на доставчика:

echo "nameserver XXX.XXX.XXX.YYY"  >  /etc/resolv.conf
echo "nameserver XXX.XXX.XXX.ZZZ"  >>  /etc/resolv.conf

Обърнете внимание на следното:
- Първата команда ще изтрие всичко във вашия файл resolv.conf.
- Втората команда наистина има два знака ">".

Добавяме потребителското си име и парола във файла pap-secrets, така че те да се вземат и използват при установяване на връзката.

echo "smalluser * smallpass" >> /etc/ppp/pap-secrets

Сега вече сме готови за най-важната част - установяване на връзката!

pppd pty 'pppoe -I eth0 -S abc'  noipdefault defaultroute hide-password passive persist name smalluser

С опцията "-S" се задава параметърът Service-name, така че заменете abc с вашия. С опцията "name" се задава потребителското име. Заменете smalluser с вашето.
Забележка: нали правите разлика между тези два символа: ' и ` ?

Сега може да изпълним отново командата:

ifconfig

която освен информация за lo и eth0 трябва да даде и информация за ppp0 от вида:

ppp0 Link encap:Point-to-Point Protocol
         inet addr:XXX.XXX.XXX.XYZ  P-t-P:XXX.XXX.ZYX  Mask:255.255.255.255
         UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
         RX packets:2172615 errors:0 dropped:0 overruns:0 frame:0
         TX packets:1466232 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:3
         RX bytes:3087662461 (2.8 GiB)  TX bytes:65777364 (62.7 MiB)

Ако такава информация няма, изчакайте малко, след което пак повторете "ifconfig". Понякога е нужно повече време, за да се установи връзката. ppp0 преставлява стандартен Point to Point интерфейс.

3. Споделяне на връзката

Има достатъчно документация по този въпрос. Тук ще споменем само най-важното и някои от особеностите, касаещи PPPoE протокола.

3.1 MTU параметърът показва максимална големина на пакет, който може да бъде изпратен от нашия интерфейс. Стандартната му стойност е 1500 байта. За нас не е проблем да изпращаме пакети по-големи от 1500 байта. Въпросът е дали тези нестандартни пакети ще преминат до отсрещната страна и дали тя ще ги приеме.
При споделянето на връзка в нашия случай хостовете в локалната ни мрежа изпращат към Интернет пакети с максимална големина 1500 байта. За да се изпратят към доставчика тези пакети претърпяват PPPoE енкапсулацията. Така към тях се добавят допълнителни байтове и пакетите стават нестандартни. Често те биват отхвърлени. Резултатът е липса на интернет на клиентските машини във вътрешна мрежа.
Проблемът се решава по няколко начина. Първо можем да накараме клиентските машини да изпращат по-малки пакети. Второ - можем да накараме нашата Линукс машина да дели големите пакети на части преди процеса на енкапсулация. Тази екстра отнема значително процесорно време. За нея бе споменато в точка 1.3. За да я използвате заменете горната команда със следната:

pppd pty 'pppoe -I eth0 -S abc -m 1412'  noipdefault defaultroute hide-password passive persist name smalluser

Разликата е в параметъра "-m". Неговата стойност е опитно установена. Препоръчва се да не експериментирате с нея освен ако нямате проблеми.

3.2 Същинското споделяне на връзката става с командите:

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward

3.3 Всеки пакет има поле, в което се записва стойността на TTL параметърa му. При преминаване на пакет през даден рутер стойността на това поле се намалява с 1. Когато по пътя от източника към целта стойността на TTL полето стане 0 пакетът бива отхвърлен. Идеята е, при възникване на проблем, даден пакет да не "блуждае" в Интернет безкрайно.
В стандартната ситуация един "новороден" пакет от вътрешната мрежа има TTL стойност, която е от вида (2^n). Когато такъв пакет премине през вашата Линукс машина неговата TTL стойност добива вида (2^n-1). Често пъти пакети от втория вид също биват отхвърлени. Решението на проблема не е цел на тази статия. За повете информация може да погледнете тук:

http://netfilter.org/patch-o-matic/pom-base.html#pom-base-TTL

4. Заключение

Написаното до тук има за цел да хвърли лъч светлина в проблемите с PPPoE и да предложи на потребителите завършена последователност от стъпки, която да донесе нужния резултат - връзка към Интернет. Можете да използвате, цитирате, променяте и публикувате този материал, като единственото условие е да споменете автора на оригинала и неговия e-mail адрес.

Очаквам коментари за разширяване на статията и поправяне на грешки и неточности.

Росен Антонов
rossenantonov@hotmail.com
Последна промяна: 04.април.2004


<< Инсталиране и настройка на “прозрачна защитна стена” | FreeSco действие второ >>