от Beco(13-02-2006)

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

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

Лиценз: CC Attribution-ShareAlike

Описание на лиценза: http://creativecommons.org/licenses/by-sa/2.5/


Повод:

Преди два дни мой познат стана клиент на услугата на Хоумлан тип "икономична". Разбира се, по стар народен обичай, услугата бе разнообразена с TTL филтър от страна на доставчика (въпросния Хоумлан), та да не може клиентът да се изкуши да използва в къщи маршрутизатор и да не може да свърже през него към услугата повече от един компютър. Добре, но да си представим, че клиентът има IP телефон и това на практика е втори потребител на Интернет, заедно с домашния компютър. Разбира се, че за да има IP телефон и свързан към интернет компютър, ще се наложи да се направи мрежова адресна транслация - NAT (известна сред екзалтираните от чатене с "пички" в IRC мега олигофрени, като "маскиране зад реален IP адрес"). Разбира се, Хоумлан трябва да са по-наивни и от напушен тинейджър, за да повярват в идеите си и да си мислят, че някой ще си плати отделен достъп по тарифи за интернет свързване, за да има в къщи IP телефон. Векът на големите утопии си замина преди 6 години.

Друг повод:

От седмица вече Дата.БГ предлагат платено поместване на съдържание на сървърите им за свободен хостинг (свободен, но платен). Тъсещата машина също е платена. От друга страна Дата.БГ ПРОДАВАТ трафика от и към това съдържание на други доставчици на свързаност. Значи излиза така - веднъж клиента плаща за да качи съдържанието и вори път си плаща за да го изтегли. Перфектна дебелашка система за печелене на пари от продажба на нелицензирано съдържание. Хоумлан са интернет компания на Дата.БГ.

Да не си помислите обаче, че описанието тук е направено само с цел включване на IP телефон. По този начин (който ще опиша по-долу), можете да включите цялата си домашна мрежа към Интернет, или казано по-кратко всичко, което има мрежова платка на себе си.

Някои предварителни уточнения:

* Използваната дистрибуция за целта е Fedora Core 4 (това не значи, че не става и с други дистрибуции).

* Fedora Core 4 трябва да бъде актуализирана (действие, което се описва с красивия и толкова автентичен български глагол "ъпдейтвам"). Ако това условие не бъде изпълнено, има опасност описаната по-долу технология да не бъде успешно рализирана.

1. Настройки на маршрутизатора

Настройките по-долу касаят този компютър, който ще бъде свързан чрез PPPoE или PPTP протокол към мрежата на доставчика. Повечето LAN доставчици използват за всички домашни клиенти "link" протокол PPPoE (за бизнес клиенти това не е така), а някои PPTP, където не е нужно "link" свързване към шлюза за Интернет. Следователно може да ви се наложи да направите настройки с цел работа с този протокол, които да засегнат конфигурацията на мрежовите интерфейси. Повече за това можете да прочетете на следния адрес:

http://hardtrance.blogspot.com/2005/11/pppoe-fedora-red-hat-enterprise-linux.html

Убедете се, че свързването по протокол PPPoE е успешно и имате връзка към Интернет.

След това е нужно да конфигурирате ядрото със съответните опции така, че да може то да маршрутизира пакетите от вътрешната мрежа към Интернет и обратно. Не се плашете, не е нужно да правите нищо освен да редактирате един файл. Този файл е /etc/sysctl.conf. В него намерете следния ред (поставете го, ако го няма):

net.ipv4.ip_forward = 0

и го променете така (ако това се налага, разбира се):

net.ipv4.ip_forward = 1

За да влезе в сила тази промяна (за да може ядрото да приеме тази настройка и да започне да маршрутизира пакетите), е нужно да изпълните следния команден ред:

# sysctl -p

Това е правилният начин за подаване на стойности на параметри на ядрото. Всякакви други порнографии в стил "echo 1 > /proc/sys/net/ipv4/ip_forward" набити по системни скриптове, говорят за яка IRC школовка и мега затъпяване, водещо до направата на ТНТМ решения от тип "работи само при мен".

2. Избягване на филтрацията на пакети излизащи или идващи към висок номер на порт на маршрутизатора в условията на NAT

Друга "мега" хватка, която се ползва от разни велики доставчици с цел ограничаване на прилагането на NAT от страна на клиентите, е автоматичното отрязване на пакетите от и към високи номера на портове на клиентската машина (тези портове се използват именно, когато има извършване на NAT). Разбира се, такъв филтър може да работи само, ако насреща си имат "ловци на пички" в IRC и шофьори на автомобили с емблематичната марка VW Golf. Аз изобщо не съм проверявал дали моят доставчик има реализации на подобни филтри. Направо заобиколих такова ограничение (ако го има). За целта отново се редактира (в случая е по-добре да се каже допълва) конфигурационния файл за параметрите на ядрото /etc/sysctl.conf. В него трябва да присъства следния ред:

net.ipv4.ip_local_port_range = 1024 32768

След като той бъде записан във файла, зададените стойности трябва да се подадат за прочит към ядрото. Това става с командния ред:

# sysctl -p

3. Проверка за наличност на модула ipt_TTL.ko

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

# modprobe ipt_TTL

и не получите съобщение за грешка, а курсора в конзолата слезе на нов ред, значи модулът е наличен в модулната колекция на ядрото. Наличието на модула ipt_TTL.ko абсолютно задължително условие за да може да бъде надхитрен TTL филтъра. Не е нужно при всеки старт на системата ръчно да зареждате този модул. Инструментът iptables при прочит на с правила, които ще бъдат зададени, ще направи това автоматично слред първото срещане на "-j TTL".

4. Правила за netfilter с цел заобикаляне на TTL филтъра

Във Fedora Core и Red Hat Enterprise Linux и дериватите му, всички правила за netfilter, които след това се четат и прилагат от инструмента iptables, следва да се намират във файла /etc/sysconfig/iptables. По принцип този файл не съществува върху прясно инсталираната система. И е нужно да бъде създаден. Най-лесният начин е да се въведе някакво правило и да се изпълни

# iptables-save > /etc/sysconfig/iptables

Повече за особеностите за управление на netfilter под edora Core и Red Hat Enterprise Linux и дериватите му, можете да наметрите тук:

http://hardtrance.blogspot.com/2006/02/netfilter-fedora-core-red-hat.html

По-долу, в примерните настройки, се предполага, че интерфейсът за свързване към интернет доставчика ви е ppp0. Ако това не е така, променете името на интерфейса с използвания от вас. Предполага се и че адресното пространство на домашната частна мрежа е 192.168.10.0/24. Променете го с актуалното при вас.

Ето и правилата за netfilter, които трябва да са налични към таблицата mangle, за да може да заобиколите TTL филтъра

Вариант 1 - чрез въвеждане в конманден ред:

# iptables -t mangle -A PREROUTING -i ppp0 -j TTL --ttl-inc 1
# iptables -t mangle -A POSTROUTING -s 192.168.10.0/24 -o ppp0 -j TTL --ttl-inc 1

Вариант 2 - чрез описание в конфигурационния файл /etc/sysconfig/iptables:

*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -i ppp0 -j TTL --ttl-inc 1
-A POSTROUTING -s 192.168.10.0/24 -o ppp0 -j TTL --ttl-inc 1
COMMIT

Ако се използва вариант 2, след записа на правилото във файла /etc/sysconfig/iptables е необходимо да се рестартира услугата iptables. Това може да стане чрез командния ред:

# service iptables restart

Пак напомняме, че ако не използвате PPPoE или PPTP протокол за свързване, а само чиста етернет връзка, заместете ppp0 в горните изрази с имената на етернет интерфейса (примерно eth0 или eth1), който ви свързва с доставчика ви.

5. Изграждане на правило за мрежова адресна транслация - NAT в netfilter

ВНИМАНИЕ!!! Правилото не се влияе от това дали доставчикът предоставя на клиента статичен или динамичен IP адрес, както без значение е дали адресът е публичен или частен.

След като са изпълнени по-горните стъпки, идва и ред на последната стъпка, а именно задаване на правило за мрежова адресна транслация в netfilter. Конкретният вид на това правило зависи от вида на свързването. Ако доставчикът предоставя свързаността към Интернет чрез PPPoE или PPTP, то интерфейсът към Интернет е ppp0 или ppp1 (всъщност ако няма други ppp връзки, се използва ppp0, ако и той е зает ppp1 и т.н, но това е вече конкретна ситуация при клиента, която тук няма да се обсъжда). За примерите ще приемаме, че ако клиентът използва протокол PPPoE или PPTP, то интерфейса към Интернет е ppp0, ако клиентът е свързан директно през етернет връзка, без допълнителна капсулация, то интерфейсът към Интернет е eth0.

И така, ето правилото за netfilter, конкретизирано по случаи:

а) при използване на PPP капсулация (клиентът е свързан към Интернет чрез протоколи PPPoE или PPTP):

- задаване на правилото в команден ред:

# iptables -t nat -I POSTROUTING -o ppp0 -j MASQUERADE

- задаване на правилото в /etc/sysconfig/iptables

*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -o ppp0 -j MASQUERADE
COMMIT

b) при използване на директна свързаност през интерфейс eth0

- задаване на правилото в команден ред:

# iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE

- задаване на правилото в /etc/sysconfig/iptables

*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT

Добре е след задаване на правилото в /etc/sysconfig/iptables да се рестартира услугата iptables:

# service iptables restart

6. Още тънкости и хитрости.

Ако по описания по-горе начин подлагате на NAT машини с операционни системи различни от Linux, е добре да направите така, че всички изходящи от тях пакети да имат един и същи параметър TTL. Ето и кратко обяснение защо може да се наложи да се направи това. Linux ядрата по подразбиране поставят стойност на параметъра TTL равна на 64 на изходящите от TCP/IP стека пакети. При други операционни системи това не е така. Например при MS Windows стойността на параметъра TTL за изходящите от TCP/IP стека пакети е 128. Нека сега да видим, ако приложим схемата, която е описана по-горе, какъв ще е ефекта при използването на маршртуизатор с операционна система Linux и станция с Windows зад него, пакетите от която са подложени на мрежова адресна транслация - NAT. Ако пакет от Windows станцията излезе към Интенрет през Linux маршрутизатора, то той ще е с TTL равен на 128 (ако нямаше правилото в таблица mangle за увеличаване на параметъра TTL, щеше да е със стойност 127, а много доставчици филтрират пакети със стойност на TTL, която е нечетно число). Ако на първия маршрутизатор по пътя, доставчикът прави описание на стойността на параметъра TTL на изходящите от вас пакети, той ще регистрира тази стойност. Какво обаче ще се случи, ако утре ви се наложи да актуализирате пакетите на Linux маршрутизатора или просто, ако върху него има услуги, които станцията ползва, а последните от своя страна използват връзката към интернет? Ще стане следното. Linux маршрутизатора ще излъчва своите пакети към Интернет (т.е. те ще преминават през доставчика) със стойност на параметъра TTL равна на 64. Ако доставчика наистина прави описание на стойността на TTL за изходящите от вас пакети, то това ще е ясна индикация, че интернет връзката е споделена между станции с различен TCP/IP стек (в нашия пример между две станции с различни TCP/IP стеци).

За да надхитрите доставчика си и в този случай, трябва да модифицирате по следния начин подаваните правила към iptables:

- отменете правилото, което само инкрементира с единица параметъра TTL на изходящите към доставчика пакети:

# iptables -t mangle -D POSTROUTING -s 192.168.10.0/24 -o ppp0 -j TTL --ttl-inc 1

- заменете го с ново правило, което указва всички пакети като излизащи от TCP/IP стек на операционна система Linux (TTL=64):

# iptables -t mangle -A POSTROUTING -s 192.168.10.0/24 -o ppp0 -j TTL --ttl-set 64

От гледна точка на файла /etc/sysconfig/iptables, промените, които трябва да се направят в него са следните:

*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -i ppp0 -j TTL --ttl-inc 1
-A POSTROUTING -s 192.168.10.0/24 -o ppp0 -j TTL --ttl-set 64
COMMIT

Отново напомням, че ако не използвате PPP връзка, т.е. не използвате за свързване към доставчика протоколи като PPPoE и PPTP, а използвате директна етернет свързаност, то трябва в горните указания да заместите името на интерфейс ppp0 с името на съответния етернет интерфейс.

Друга тънкост, която цели да не бъдете хванати, че имате втори мрежови интерфейс на машината (това на практика не доказва, че извършвате NAT), е да забраните транслирането в ядрото на ARP заявки (proxy arp), чрез които да се види друг ваш интерфейс. За да предотвратите тази възможност поставете следния ред във файла /etc/sysctl.conf:

net.ipv4.conf.all.arp_ignore = 1

След това изпълнете

# sysctl -p

за да влязат промените в сила.



<< SonyEricsson и Линукс | Инсталиране на nVidia драйвер при Slackware >>