Линукс. Linux Lan Печат

Да предположим, че имаме три компютъра и искаме да ги свържем в локална мрежа в къщи. Единият нарочваме за концентратор като му слагаме две мрежови карти и евентуално за gateway към Интернет ако му поставим и модем, а другите два използваме за работни станции. Ако компютърът-шлюз (gateway) е достатъчно мощен нищо не му пречи той да бъде ползван също като работна станция или някакъв сървър - файлов сървър, FTP или web-сървър. Както вече споменахме по-горе двете карти могат да са различни - едната да е за тънък коаксиален кабел, а другата зa UTP - от тук нататък приемаме, че коректно и съгласно всички изисквания сте изградили физическата си връзка - остава да стартираме мрежа върху нея.
Нашият компютър-gateway има инсталиран Linux, а операционната система на останалите не е от съществено значение, но нека приемем, че и там имаме Linux-и. Примерът няма да се измени ни най-малко ако приемем, че някъде имаме FreeBSD, Windows стига да сме в състояние да опишем маршрутизирането за съответната операционна система както ще правим малко по-долу.
И така - след като имаме два сегмента имаме две мрежи - нека едната бъде 192.168.0.0, а другата 192.168.17.0 - ако тези не ви харесват изберете си други, но нека префикса е 192.168. - това е конвенция за вътрешна клас C мрежа. Мрежовата маска и на двете мрежи е 255.255.255.0 - това означава, че можем да имаме 254 машини с IP адреси от 192.168.1.1 до 192.168.1.254, адресът на мрежата е 192.168.1.0, а broadcast адресът е 192.168.1.255. Мрежовите интерфейси на нашия Linux gateway нека бъдат съответно

eth0

192.168.1.1

eth1

192.168.17.1

Ако правилно сме конфигурирали интерфейсите и те работят, подавайки командата ifconfig трябва да получим резултат подобен на следния:

eth0      Link encap:Ethernet  HWaddr 00:06:29:38:0C:99

inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0

UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

RX packets:4140723 errors:0 dropped:0 overruns:0 frame:0

TX packets:4461135 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:100

Interrupt:15 Base address:0x2180

eth1      Link encap:Ethernet  HWaddr 00:10:5A:F4:71:F3

inet addr:192.168.17.1  Bcast:192.168.17.255  Mask:255.255.255.0

UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

RX packets:7096657 errors:10 dropped:0 overruns:0 frame:10

TX packets:4465753 errors:0 dropped:0 overruns:0 carrier:2

collisions:535 txqueuelen:100

Interrupt:10 Base address:0x5100

lo        Link encap:Local Loopback

inet addr:127.0.0.1  Mask:255.0.0.0

UP LOOPBACK RUNNING  MTU:3924  Metric:1

RX packets:429912 errors:0 dropped:0 overruns:0 frame:0

TX packets:429912 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:0

Единият ни компютър нека има адрес 192.168.1.2, а другият от другата мрежа 192.168.17.2. Ако решим да включим например и преносимия си компютър в мрежата или ни дойде на гости познат с лаптоп можем например да му дадем адрес 192.168.17.3.
Какво трябва да направим при компютъра 192.168.1.2 за да може той да вижда останалите компютри в мрежата. Всъщност той трябва да знае кой компютър стои отсреща в случая 192.168.1.1 - забележете, че нашият gateway има два IP адреса, но от гледна точка на компютрите от мрежа 192.168.1.0 какъвто е 192.168.1.2 това е адресът 192.168.1.1. Достатъчно е на този компютър да установим за негов gateway по подразбиране (default gateway) интерфейса 192.168.1.1 ако операционната система е Linux това става с командата:

/sbin/route add default gw 192.168.1.1

или да редактирате на ръка конфигурационния файл /etc/sysconfig/network като установите правилния default gateway. Файлът /etc/sysconfig/static-routes има следния вид - малко обратен на формата на командата route:

eth0 net 192.168.1.0 netmask 255.255.255.0 gw 192.168.1.1

eth0 net 192.168.17.0 netmask 255.255.255.0 gw 192.168.17.1

За някои дистрибуции трябва вместо това да добавите командата

/sbin/route add default gw 192.168.1.1

в /etc/rc.d/rc.local.
Ако операционната система на 192.168.1.2 е Windows настройката трябва да направите като с десен бутон на мишката кликнете върху Network Neighbourhood и от падащото меню изберете Properties след това с левия бутон на мишката изберете TCP/IP -> компонентите за вашата мрежова карта и натиснете бутона Properties. Трябва да изберете подменюто Gateway, да попълните 192.168.1.1 и да натиснете бутона Add след това OK. Естествено няма да минете без рестартиране на компютъра. Същото трябва да направим и с компютъра 192.168.17.2, но неговия gateway ще е разбира се 192.168.17.1. Всеки друг компютър, който добавяме в един от двата сегмента на нашата мрежа трябва да има установен коректен gateway за съответния сегмент - в случай 192.168.1.1 за всички компютри в мрежата 192.168.1.0 и 192.168.17.1 за всички от мрежата 192.168.17.0.
Сега остава да конфигурираме сървъра. Напишете командата route и разгледайте резултата - ще видите, че имате описани мрежите на съответните интерфейси все едно, че някой вече е изпълнил командите:

/sbin/route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.1.1
/sbin/route add -net 192.168.17.0 netmask 255.255.255.0 gw 192.168.17.1

или

/sbin/route add -net 192.168.1.0 netmask 255.255.255.0 eth0
/sbin/route add -net 192.168.17.0 netmask 255.255.255.0 eth1

Ако пък нямате такива записи изпълнете горните команди или редактирайте файла /etc/sysconfig/static-routes или пък добавете горните команди в /etc/rc.d/rc.local. Така ядрото на Linux ще знае как да разпределя пакетите съответно за 192.168.1.0 и 192.168.17.0 мрежите. Вярната routing таблица обаче не е достатъчно условие за прехвърляне на пакети от единия мрежови сегмент към другия. Ако опитате командата

ping 192.168.17.2

от компютъра 192.168.1.2 ще видите, че нямате връзка с 192.168.17.2. В този момент нашият gateway вижда всички компютри от двата сегмента, всички компютри от двата сегмента също го виждат от своята си страна, но компютрите от двете мрежи не се виждат. Това е защото не сме казали на нашия Linux, че ще бъде рутер (router). Това за повечето Linux дистрибуции става с командата:

echo "1" > /proc/sys/net/ipv4/ip_forward

Така разрешаваме на ядрото да прехвърля пакетите от единия интерфейс към другия. Трябва да сме сигурни, че всичко това ще се запази и след рестарт за целта прегледайте файлa /etc/sysconfig/network там трябва да има FORWARD_IPV4=true или FORWARD_IPV4="yes" също така и файла /etc/sysctl.conf трябва да няма Disable IP forwarding опции. Това е валидно за Red Hat дистрибуции и подобни на нея - за други ще трябва да добавите командата echo "1" > proc/sys/net/ipv4/ip_forward в /etc/rc.d/rc.local.

Ето примерен файл /etc/sysconfig/network:

NETWORKING=yes

GATEWAYDEV=eth1

GATEWAY=212.36.11.1

HOSTNAME=jam

FORWARD_IPV4=yes

и /etc/sysctl.conf:

# Enables packet forwarding

net.ipv4.ip_forward = 1

# Enables source route verification

net.ipv4.conf.all.rp_filter = 1

# Disables automatic defragmentation (needed for masquerading, LVS)

net.ipv4.ip_always_defrag = 0

# Disables the magic-sysrq key

kernel.sysrq = 0

Сега нашата мрежа трябва да е съвсем наред - всички виждат всички (по TCP/IP). Разбира се това беше твърде сложен пример за една домашна мрежа - обикновено съвсем нямате нужда от два сегмента - един коаксиален ви е напълно достатъчен. Целта на примера беше да покаже малко повече теория.

Разбира се, точно тук следва въпроса - как компютрите от нашата мрежа да могат да ползват Интернет - ами вариантите са два - ако можете да се свържете като допълнителен сегмент към мрежа, която има връзка към Интернет достатъчно е да добавите трета мрежова карта на вашия Linux-рутер в случая eth2 да му зададете някакъв IP от въпросната мрежа и да добавите default gateway за рутера например така:

/sbin/route add default gw 212.36.12.75

Как обаче нашата вътрешна мрежа, която е с частни IP адреси 192.168.x.x ще излезе навън в Интернет, където частните адреси въобще не се рутират - сигурно сте чували за NAT, за маскиране (masquerading) - е ние ще използваме маскирането. Това означава, че всички заявки от нашата вътрешна мрежа ще изглеждат за света все едно, че идват от нашия gateway-рутер. Всъщност тъй като той е default gateway за всички компютри от нашата вътрешна мрежа те изпращат заявките си на него - той ги получава, изпраща ги от свое име в Интернет и като получи отговор го препраща на машината от вътрешната мрежа, която го е поискала и така за всеки пакет. По темата masquerading вече има материал на български език на адрес http://linux.gyuvet.ch/html/solution/ip_masq.html затова тук само ще споменем как да добавим маскирането, което ще ни помогне, а именно:

/sbin/ipchains -F
/sbin/ipchains -P forward DENY
/sbin/ipchains -A forward -s 192.168.1.0/24 -j MASQ
/sbin/ipchains -A forward -s 192.168.17.0/24 -j MASQ

или по-кратко

/sbin/ipchains -F
/sbin/ipchains -P forward DENY
/sbin/ipchains -A forward -i eth2 -j MASQ

ако eth2 e интерфейсът на рутера, който "гледа" към Интернет.

Необходимо е да заредите и съответните модули, които ще ползвате като затова трябва да се консултирате с документацията. FTP модулът например се зарежда така:

/sbin/modprobe ip_masq_ftp

Разбира се, че в къщи по-скоро ще имаме модем, с който да се свързваме към Интернет - това обаче не променя особено нещата в момента в който установите PPP-връзка вие имате ppp-интерфейс, който се третира като мрежови - името му обаче не е eth, a ppp0 например, или ppp1 и т.н. Съответно вие можете да правите маршрутизиране, както и всичко друго необходимо за целта, така както и за мрежови интерфейс. Ако имате нужда от съдействие предполагам, че Интернет доставчика ви ще ви помогне (срещу някакво заплащане, разбира се). Ако направите това след това може би ще поискате да инициирате връзка с Интернет от всеки компютър във вашата мрежа при заявка за поща, FTP или браузване, а не само, когато е установена ръчно връзка от рутера-gateway - това се нарича dial-on-demand. След това вероятно ще поискате да пуснете и прокси-сървър на вашия gateway - всичко това обаче оставям във ваши ръце - имате достатъчно документи за това в мрежата - четете и пробвайте.