Статична IP-маршрутизація h2>
Дмитро Карпов, МИСИС p>
Мережа
Internet за її протоколами з самого початку замислювалася як протяжна (WAN - Wide
Area Network), що складається з великої кількості машин, з'єднаних за допомогою
різних середовищ обміну даними (як локальних мереж, так і глобальних з'єднань).
Теоретично в Internet можуть безпосередньо працювати один з одним близько чотирьох
мільярдів машин (2 ^ 32 за винятком деяких спеціальних номерів), а через proxy
і того більше. p>
В
Через ці причини Internet - сегментована мережу. Сегментом є або
прозорий ділянку широкомовної (Ethernet) або маркерне (TokenRing) мережі,
або з'єднання точка-точка (модемне). p>
Тепер
- Позначення. IP-номер - четирехбайтное число, що записуються або в шістнадцятковому
вигляді типу 0xC0A80E05, або в десятковому вигляді, де байти розділені крапками типу
192.168.14.5 (як приклад в обох випадках використовувався один і той же
номер). p>
Маска
- Теж четирехбайтное число, але всі старші біти, починаючи з деякого, завжди
встановлені в одиницю, а всі молодші - у нуль. Приклади: 255.255.255.0 - маска
мережі класу C на 256 номерів; 255.255.255.192 - маска маленької мережі на 64
номера (192 = 256-64). Якщо мені треба вказати поєднання номери та маски, я буду
використовувати запис номер/чісло_установленних_бітов_в_маске - так поєднання
номера 192.168.14.5 і маски 255.255.255.0 буде записано у вигляді
192.168.14.5/24. p>
Номером
мережі називають число, що отримується з номера інтерфейсу застосуванням побітового
операції AND з маскою, тобто в номері інтерфейсу обнуляються біти на тих місцях,
на яких стоять нульові біти в масці. p>
Слід
пам'ятати, що IP-номер присвоюється не комп'ютера, а інтерфейсу (мережному
виходу або послідовного порту). У принципі можна дати кільком
інтерфейсів один номер, але це може викликати складності. Можна також присвоїти
декілька адрес одному інтерфейсу. p>
В
сегменті мережі всі машини мають IP-номери з однаковим номером мережі і однаковою
маскою. В одній локальній мережі можна поєднати два і більше різних IP-мереж, вони
навіть можуть знати один про одного і нормально спілкуватися, але це все-таки будуть два
різні мережі. p>
Прийнято
наступний розподіл в залежності від значення старшого байта IP-адреса: p>
0 .. 127
- Мережі класу A за 2 ^ 24 адрес з маскою 0xFF000000; p>
128 .. 191
- Мережі класу B по 2 ^ 16 адрес з маскою 0xFFFF0000; p>
192 .. 223
- Мережі класу C з 2 ^ 8 адрес з маскою 0xFFFFFF00; p>
224 .. 239
- Мережі класу D для multicast (груповий) розсилання; p>
інші
поки зарезервовані. p>
Багато
програми за адресою автоматично визначають клас мережі, хоча це можна
поправити вручну. В принципі ніхто не заважає розбити мережу на дві або більше
підмереж з будь-якими масками, але організаціям як правило виділяють адреси блоками,
відповідними класів A, B і C - це пов'язано з системою DNS, що дозволяє дізнатися
доменне ім'я машини за її IP-адресою. p>
Мережа
класу A з номером 127 - loopback, тобто призначена для спілкування з комп'ютера
собою. У будь-який номер мережі (IP-номер AND маска) є номером всієї мережі і не
може бути присвоєно нікому конкретно. Номер (IP-номер OR NOT маска), який є
останнім номером в мережі, призначений для broadcasting (широкомовних)
повідомлень, які доставляються всіх машин сегмента мережі. Відповідно, при
виділення групи адрес в мережу дві адреси стають недоступні. p>
Розглянемо
маршрутизацію в термінах FreeBSD (буде також даний переклад в нотацію System V
(Linux, SCO) і Windows3.11). У Unix команди настроювання мережі, як правило,
заюпускаются з файлу/etc/rc або запускаються з нього файли, а в MS Windows --
завантажувачем операційної системи у відповідність з system.ini або registry. p>
Головному
шлюзу я завжди привласнюю перший (найменший) номер в мережі (нульовий, як я вже
говорив, недоступний). Якщо в мережі є другим шлюз, через який
приєднаний інший сегмент, то цього шлюзу (проміжного маршрутизатора)
присвоюватиметься останній (найбільший) номер в мережі. Для цього немає ніяких
розумних причин - так мені хочеться. p>
Побудуємо
перший сегмент мережі: p>
Сконфігуріруем
робочу станцію: p>
ifconfig ep0 inet 192.168.1.5
netmask 255.255.255.0 p>
ifconfig lo0 inet 127.0.0.1 netmask
255.0.0.0 p>
route
add default 192.168.1.1 p>
На
Насправді в сучасних (починаючи з 2.1 .*) версіях FreeBSD це оформляється
трохи зовсім по іншому. :-) P>
Розглянемо
уважніше, що роблять ці команди: p>
ifconfig
ep0 inet 192.168.1.5 netmask 255.255.255.0 p>
присвоїла
інтерфейсу ep0 номер 192.168.1.5, а також створила в таблиці маршрутизації
запис про те, що всі пакети з номером мережі 192.168.1.0/24 будуть направлятися
прямо через цей інтерфейс з використанням протоколу ARP. p>
ifconfig
lo0 localhost p>
конфігурує
інтерфейс loopback, тобто "петлю". Цей інтерфейс повинен мати адресу
127.0.0.1 і маску 255.0.0.0 на будь-якій машині, що має IP, тому деякі
системи (наприклад, MS Windows) роблять це автоматично, не вимагаючи від
адміністратора (або користувача, якщо він сам налаштовує систему) задавати
параметри loopback. Так як цей інтерфейс налаштовується на кожній машині
однаково, я не буду писати цей рядок кожного разу. localhost визначається за
файлу/etc/hosts, в якому міститься p>
127.0.0.1
localhost.домен localhost p>
а
маска береться за замовчуванням - 255.0.0.0. p>
route
add default 192.168.1.1 p>
зауважу,
що маршрутизація "default" насправді є "inet 0x0 netmask
0x0 "і це треба прописувати, якщо стара версія команди route не розуміє
слова "default". створила запис, відповідно до якої всі пакети
(все, тому що будь-який пакет підходить під 0.0.0.0/0) будуть відправлятися на
машину, що має інтерфейс 192.168.1.1. Інформація про те, як можна дістатися до
інтерфейсу 192.168.1.1 міститься в попередній команді, яка визначила
спосіб доступу до всіх машин 192.168.1 .* через інтерфейс ep0. p>
Таким
чином, у нас склалася приблизно така ситуація: p>
Взагалі
система маршрутизації (за винятком гранично примітивних випадків)
деревоподібна, тобто одні записи включають в себе інші. Часткове перетин
неможливо, бо кордону адресного простору, на який діє кожна
запис, вирівняти на розмір цього простору. Порядок зберігання та перегляду
таблиці може бути різний, але повинен забезпечувати пріоритет записів з маленьким
простором перед записами з великим простором. У даному разі звернення
до машини 192.168.1.9 потрапляє під юрисдикцію обох записів, але звертатися до неї
наша робоча станція буде у відповідності з 192.168.1.0/24-> ep0. p>
Інтерфейс
шлюзу треба настроїти так: p>
ifconfig
ed1 inet 192.168.1.1 netmask 255.255.255.0 p>
На
Насправді у нашого шлюзу багато інтерфейсів і вони будуть конфігуруватися по
міру потреби. Ще раз звертаю увагу на те, що номер і маска мережі
збігаються для всіх машин цього сегменту. p>
Другий
сегмент містить в собі машину, до якої по послідовній лінії за допомогою
протоколу SLIP під'єднаний ще один комп'ютер. p>
Сконфігуріруем
ws.2.1: p>
slattach-S 0 [...] p>
ifconfig sl0 192.168.1.81
192.168.1.82 up p>
ifconfig ep0 inet 192.168.2.7
netmask 255.255.255.0 p>
route add default 192.168.2.1 p>
Сконфігуріруем ws.2.2: p>
slattach-S 0 [...] p>
ifconfig sl0 192.168.1.82
192.168.1.81 up p>
route add default 192.168.1.81 p>
Сконфігуріруем шлюз: p>
ifconfig ed2 inet 192.168.2.1
netmask 255.255.255.0 p>
route add host 192.168.2.81
192.168.2.7 p>
route add host 192.168.2.82
192.168.2.7 p>
Третій
сегмент буде поєднувати в собі дві мережі - мережа класу C 192.168.2 .*/24 та мережа
класу B 172.16 .*.*/ 16. p>
Почнемо
з шлюзу. Йому привласнимо дві адреси, по одному з кожної мережі: p>
ifconfig ed3 inet 192.168.3.1
netmask 255.255.255.0 p>
ifconfig ed3 inet 172.16.0.1 netmask
255.255.0.0 alias ... p>
Тепер
ws.3.1 - їй дамо адресу тільки з першої мережі: p>
ifconfig ep0 inet 192.168.3.7
netmask 255.255.255.0 p>
route add default 192.168.3.1 p>
В
такій конфігурації ws.3.1 відмінно зможе спілкуватися з машинами з мережі
192.168.3.0/24 і з машинами поза сегменту локальної мережі. При спробі ж
звернутися до машини того ж сегменту, але іншої IP-мережі, пакет буде посланий на
шлюз. Шлюз знає, що пакети з цією адресою треба надіслати в ту мережу;
але деякі операційні системи працюють за алгоритмом маршрутизації, в
якому заборонено посилати пакет туди, звідки він прийшов - це робиться для
того, щоб уникнути зациклення пакетів. p>
Під
уникнути цього ws.3.2 ми настроїмо з урахуванням того, що в локальній мережі працюють
машини з адресами з іншої IP-мережі: p>
ifconfig ep0 inet 172.16.8.14
netmask 255.255.0.0 p>
route add-net 192.168.3.0-netmask
255.255.255.0 172.16.8.14 p>
route
add default 172.16.0.1 p>
Тут
ми присвоїли інтерфейсу номер з мережі 172.16 .*.*, а потім оголосив, що пакети
для мережі 192.168.3 .* треба відправляти в ту ж локальну мережу. p>
Маршрутизація
за замовчуванням могла бути спрямована і на адресу 192.168.3.1, але наведена конструкція
простіше в тому сенсі, що обидві маршрутизації спираються на інтерфейс і не залежать
один від одного. Я не знаю, відрізняються ці варіанти щодо ефективності, а якщо
розрізняються, то наскільки, але чим менше залежностей в конфігурації, тим простіше
її налаштовувати і діагностувати при збої. p>
І
нарешті, будь-якій машині можна привласнити дві адреси - по одному з кожної IP-мережі.
Як правило, це робиться у випадку, коли частина машин має IP-адреси,
виділені провайдером, а решта працюють з Intranet'овскімі номерами - їх
завжди в надлишку. p>
Наступну
мережа класу C сегментуємо маршрутизатором, що відокремить підмережа на 16
IP-номерів (14 машин, включаючи маршрутизатор). P>
Шлюз:
p>
ifconfig ed3 inet 192.168.4.1
netmask 255.255.255.0 p>
route add-net 192.168.4.128
-netmask 255.255.255.240 192.168.4.254 p>
Робоча станція ws.4.1: p>
ifconfig ep0 inet 192.168.4.7
netmask 255.255.255.0 p>
route
add default 192.168.4.1 p>
Я
не вказав маршрутизацію p>
route
add-net 192.168.4.128-netmask 255.255.255.240 192.168.4.254 p>
Її
можна не вказувати і для маршрутизатора. Але! Якщо яка-небудь з машин
сегмента 192.168.4.128/28, наприклад, 192.168.4.137, звернеться до машини з
основного (примикає до шлюзу) сегмента (у тому числі до шлюзу), то протокол
ARP зафіксує прихід пакету з мережевої карти, маршрутизатора, що виходить у
основний сегмент (IP-номер 192.168.4.127) і далі буде посилати пакети на цю
мережеву карту, і це буде правильно. Окрему проблему представляє звернення
машини з основного сегмента в 192.168.4.128/28. За відсутності у ARP відомостей про
цьому номері буде розісланий широкомовна запит і тут все залежить від
кмітливості проміжного маршрутизатора router.4 - якщо він здогадається,
що пакет призначений в підмережа і протранслірует його туди, то відповідь призведе до
появи запису в таблицях ARP, не здогадається - доведеться прописувати
маршрутизацію. p>
Маршрутизатор
router.4: p>
ifconfig ep0 inet 192.168.4.127
netmask 255.255.255.0 p>
ifconfig ep1 inet 192.168.4.129
netmask 255.255.255.240 p>
route
add default 192.168.4.1 p>
Робоча
станція ws.4.2: p>
ifconfig ep0 inet 192.168.4.137
netmask 255.255.255.240 p>
route add default 192.168.4.129 p>
А
цю мережу (теж класу C) сегментуємо маршрутизатором, який розіб'є мережу на
дві рівні частини. p>
Шлюз:
p>
ifconfig ed3 inet 192.168.5.1
netmask 255.255.255.128 p>
route add-net 192.168.5.128
-netmask 255.255.255.128 192.168.5.127 p>
Робоча станція ws.5.1: p>
ifconfig ep0 inet 192.168.5.7
netmask 255.255.255.128 p>
route add-net 192.168.5.128
-netmask 255.255.255.128 192.168.5.127 p>
route add default 192.168.5.1 p>
Маршрутизатор router.5: p>
ifconfig ep0 inet 192.168.5.127
netmask 255.255.255.128 p>
ifconfig ep1 inet 192.168.5.129
netmask 255.255.255.128 p>
route add default 192.168.5.1 p>
Робоча станція ws.5.2: p>
ifconfig ep0 inet 192.168.5.137
netmask 255.255.255.128 p>
route
add default 192.168.5.129 p>
Різниця
з попереднім випадком в тому, що мережа розділена на сегменти, що містять тільки
"куглое" число IP-номерів (два в цілій ступеня). Це особливий випадок,
коли логічніше оформити кожну мережа окремо. p>
Тепер
зробимо дві мережі, з'єднані через послідовну лінію по протоколу PPP. p>
Шлюз:
p>
ifconfig ed3 inet 192.168.6.1
netmask 255.255.255.0 p>
route add-net 172.17.14.192
-netmask 255.255.255.252 192.168.6.127 p>
route add-net 192.168.6.128
-netmask 255.255.255.240 192.168.6.127 p>
Маршрутизатор rt.6.1: p>
ifconfig ep0 inet 192.168.6.127
netmask 255.255.255.128 p>
pppd 172.17.14.193:172.17.14.194
netmask 255.255.255.252 [...] p>
route add-net 192.168.6.128
-netmask 255.255.255.240 172.17.14.194 p>
route add default 192.168.6.1 p>
pppd
вимагає при запуску вказати інтерфейс, через який відбувається з'єднання, і
його параметри, але це не відноситься до теми й позначено [...]. p>
Маршрутизатор
rt.6.2: p>
ifconfig ep0 inet 192.168.6.129
netmask 255.255.255.240 p>
pppd 172.17.14.194:172.17.14.193
netmask 255.255.255.252 [...] p>
route
add default 172.17.14.193 p>
Робоча
станція ws.6.2: p>
ifconfig ep0 inet 192.168.6.137
netmask 255.255.255.240 p>
route add default 192.168.6.129 p>
Підмережі
на 16 машин виділена аналогічно прикладу 4. Я сподіваюся, розбивка мережі на підмережі
"круглого" розміру, з'єднані по ppp, після засвоєння прочитаного
виявиться під силу будь-кому. p>
Як
бачите, найпростіша конфігурація - у машин в сегменті з єдиною IP-мережею
і з єдиним шлюзом (він же шлюз за замовчуванням). Чим більше шлюзів в сегменті
мережі і чим складніше їх конфігурація, тим складніше коректно налаштувати робочі
станції, а налаштовувати треба кожну. Трохи виручає протокол DHCP, але: p>
сервер
DHCP повинен знаходитися в тому ж сегменті локальної мережі, що і його клієнти; p>
сервер
DHCP повинен коректно конфігурувати клієнтів, що знову ж таки непросто в складній
сегментованої мережі. p>
Таким
чином, я рекомендую виводити всі сегменти на один маршрутизатор (якщо він
справляється з навантаженням) або користуватися можливостями, наданими
динамічної маршрутизацією. p>
Примітки: p>
Прозорий
- Сегмент Internet сам може бути сегментований
на рівні MAC, наприклад, комутатором. Прозорість виявляється в тому, що
маршрутизатор, що працює на рівні IP, не повинен дбати про це; в
Зокрема, IP-маршрутизатор ніколи не пропускає broadcast повідомлення (у
відміну від multicast), але broadcast повідомлення мають вільно поширюватися
по всій локальній мережі мережі - це потрібно, зокрема, для протоколу ARP. p>
Послідовним
портом в даному випадку називається будь-який порт,
видає дані побайтно (асинхронний COM, синхронний RS-232, принтерний LPT) в
відміну від мережевого інтерфейсу, що видає дані пакетами. Відрізняється від
мережевого тим, що з поіощью послідовних інтерфейсів можна пов'язувати
безпосередньо рівно два комп'ютери, а значить, такий спосіб не потребує адресації
пакетів на MAC-рівні. p>
DNS
- Domain Name Service, що дозволяє дізнатися IP-номер і деяку
іншу інформацію про машину за доменним ім'ям, а також доменне ім'я по
IP-номеру. Зокрема, зона визначення імені по номеру може бути
делегована тільки на мережу класу A, B або C і ніяк інакше. :-( P>
System V
: P>
BSD: p>
ifconfig ep0 inet адреса netmask маска p>
Linux: p>
ifconfig eth0 inet адреса netmask маска p>
BSD: p>
ifconfig інтерфейс inet адреса netmask маска alias p>
Linux: p>
ifconfig eth0: 1 inet адреса netmask маска p>
BSD: p>
route add-net номер-netmask маска шлюз p>
Linux: p>
route add-net номер netmask маска шлюз p>
Відповідність
між інтерфейсом eth0 і парою Port/IRQ записано в/etc/lilo.conf; після
зміни треба запустити ще щось. p>
Windows 3.11
p>
ifconfig
інтерфейс inet адреса netmask маска p>
прописується
в "Властивостях TCP/IP" цього інтерфейсу. p>
ifconfig
інтерфейс inet адреса netmask маска alias p>
прописується
в "Додаткових властивості". p>
route
add default шлюз p>
задається
як "Default Gateway". p>
route
add-net номер-netmask маска шлюз p>
вводиться
з командного рядка p>
route
add номер MASK маска шлюз p>
Ці команди реально виконуються, однак, як правило, вони задаються
інакше.
У файлі/etc/sysconfig пишеться p>
network_interfaces = "ep0
lo0 " p>
ifconfig_ep0 = "inet 192.168.1.5
netmask 255.255.255.0 " p>
ifconfig_lo0 = "inet localhost" p>
Ці рядки обробляються файлом/etc/netstart p>
# Set up all the network interfaces,
calling startup scripts if needed p>
for ifn in $ (network_interfaces); do p>
eval ifconfig_args = $ ifconfig_ $ (ifn) p>
ifconfig $ (ifn) $ (ifconfig_args) p>
ifconfig $ (ifn) p>
done p>
if [-n "$ defaultrouter"
-a "x $ defaultrouter"! = "xNO"]; then p>
static_routes = "default
$ (static_routes) " p>
route_default = "default
$ (defaultrouter) " p>
fi p>
# Set up any static routes. This
should be done before router discovery. p>
if
[ "X $ (static_routes)"! = "X"]; then p>
for i in $ (static_routes); do p>
eval route_args = $ route_ $ (i) p>
route add $ (route_args) p>
done p>
fi p>
а
localhost визначається по файлу/etc/hosts, в якому міститься p>
127.0.0.1
localhost.домен localhost p>
і
деякі інші адреси/імена, які машина повинна знати навіть у разі
недоступності DNS-сервера; як мінімум, там крім loopback містяться адреси
решти інтерфейсів даної машини, асоційовані з її доменним ім'ям в
повної і короткої формк. p>
Протокол ARP
використовується в мережах, які мають свою власну
нумерацію (Ethernet, TokenRing, X.25) і потрібен для того, щоб не прописувати
вручну відповідність IP-адрес номерами мережевих адаптерів. Після старту системи
таблиці ARP порожні; якщо приходить IP-пакет від будь-якої станції, фіксується
відповідність її IP-номера номером її мережевої карти. Якщо треба послати пакет по
IP-номеру, для якого невідомий номер мережевої карти, надсилається
широкомовне (у розумінні локальної мережі) повідомлення. p>
Зациклення
пакету в деяких алгоритмах розглядається як
результат неправильної маршрутизації. Кожен пакет має кінцевий час життя,
що задається відправником і не перевищує 255 секунд, причому кожен
маршрутизатор, через який проходив пакет, зменшує це число як мінімум на
одиницю, а значить пакет не може нескінченно битися між маршрутизаторами --
він помре, і про його смерть сповістять відправника окремим пакетом (на цьому
заснована робота traceroute). Проте деякі маршрутизатори у хатіжаніе
засмічення смуги пропускання самі вбивають пакети, які, судячи з їх таблиць
маршрутизації слід направляти через той інтерфейс, через який вони
прийшли. p>
Протокол DHCP
(Dynamic Host Configure Protocol) за запитом машини
видає їй IP-адресу, маску, номер DNS-сервера і т.д. аж до завантажується через
мережа операційної системи. Як правило, застосовується у варіанті, коли
запитуюча машина не знає ні своєї адреси, ні адреси DHCP-сервера; в цьому
випадку вона знаходить сервер, посилаючи широкомовна запит, а значить, вони
повинні бути в одному сегменті локальної мережі. p>
Список літератури h2>
Для
підготовки даної роботи були використані матеріали з сайту http://elib.albertina.ru/
p>