Конфигурация интерфейса для IP

После установки аппаратных средств, как было объяснено в предыдущей главе, Вы должны дать знать об этом сетевому программному обеспечению. Пара команд используются чтобы конфигурировать сетевые интерфейсы, и инициализировать таблицу маршрутизации. Эти задачи выполняются обычно в rc.inet1 скрипте, при загрузке системы. Эти команды называются ifconfig (где "если" относится к интерфейсу), и route.

ifconfig используется чтобы сделать интерфейс доступным для ядра, что включает в себя назначение IP адреса и других параметров и формирование интерфейса, также известное как "taking up". Активность означает, что ядро будет посылать и получать IP datagrams через интерфейс. Самый простой путь установки:

# ifconfig interface ip-address

Который связывает ip-адрес с интерфейсом и активирует его. Все другие параметры устанавливаются по умолчанию. Например, маска подсети установленная по умолчанию получена из сетевого класса IP адреса, типа 255.255.0.0 для класса B адрес. ifconfig описан более подробно в конце этой главы.

route позволяет Вам добавлять или устранять маршруты из таблицы маршрутизации. Это может быть использовано так:

route [add|del] target

Где add и del аргументы определяют добавлять или удалять маршрут к таблице.

Интерфейс loopback

Сам первый интерфейс который нужно сформировать и активизировать — интерфейс loopback:

# ifconfig lo 127.0.0.1

Иногда, Вы будете также видеть фиктивное имя localhost используемое вместо IP адреса. ifconfig будет искать имя в hosts файле, где должна быть запись, объявляющая его как имя для 127.0.0.1:

# Sample /etc/hosts entry for localhost
localhost     127.0.0.1

Чтобы просмотреть информацию о конфигурации интерфейса, Вы можете вызвать ifconfig передав как аргумент имя интерфейса:

$ ifconfig lo
lo        Link encap Local Loopback
inet addr 127.0.0.1  Bcast [NONE SET]  Mask 255.0.0.0
UP BROADCAST LOOPBACK RUNNING MTU 2000 Metric 1
RX packets 0 errors 0 dropped 0 overrun 0
TX packets 0 errors 0 dropped 0 overrun 0

Как Вы можете видеть, интерфейс loopback получил netmask равную 255.0.0.0, так как 127.0.0.1 — адрес A класса. Вы можете также увидеть, что интерфейс не имеет множества общевещательных адресов, который вообще-то бесполезны для loopback. Однако, если Вы используете rwhod демона на вашем хосте, Вы возможно будете должны установить широковещательный адрес loopback для того чтобы rwho функционировал должным образом. Установка этого адреса объясняется в секции "Все о ifconfig".

Теперь, Вы можете начать играть с вашей мини-"сетью". Единственное чего не хватает — это запись в таблице маршрутизации, которая говорит IP, что этот интерфейс как маршрут к месту назначения 127.0.0.1. Это делается с помощью следующей команды:

# route add 127.0.0.1

Здесь, тоже можно использовать localhost вместо IP адреса. Затем, Вы должны проверить правильность работы, например, используя ping. ping - сетевой эквивалент звукового(sonar) устройства и используется для проверки того доступен ли данный IP адрес, и измерения интервала времени между посылкой дэйтаграмы и получением ответа. Время требуемое для этого часто называется roundtrip time.

# ping localhost
PING localhost (127.0.0.1):
56 data bytes 64 bytes from 127.0.0.1: icmp seq=0 ttl=32 time=1 ms
64 bytes from 127.0.0.1: icmp seq=1 ttl=32 time=0 ms
64 bytes from 127.0.0.1: icmp seq=2 ttl=32 time=0 ms
^C
--- localhost ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss round-trip min/avg/max = 0/0/1 ms

При вызове ping, он будет продолжать испускать пакеты пока не будет прервано пользователем. ^C отмечает место где мы нажали Ctrl-C. Вышеупомянутый пример показывает, что пакеты доставлены к 127.0.0.1 и ответ пришел к ping почти мгновенно. Это показывает что Вы преуспели во введении вашего первого сетевого интерфейса. Если вывод который Вы получаете от ping не походит на показанный выше, Вы нарвались на неприятности. Проверите ошибки в установочных файлах. Проверите чтобы ifconfig и маршрутизирующие приложения, которые вы используете, были совместимы с ядром, которым Вы пользуетесь и, вообще, что ядро компилировалось с разрешенной сетью (Вы увидите это по отсутствию директории /proc/net ). Если Вы получаете сообщение об ошибки, говорящее "Network unreachable", тогда вероятно вы не правильно использовали команду route. Удостоверитесь что Вы используете тот же самый адрес, что Вы дали ifconfig.

Шагов описанных выше достаточно чтобы использовать сетевые приложения на автономном хосте. После добавления вышеупомянутых строк к rc.inet1 и проверки, что оба rc.inet скрипта запускаются из /etc/rc, Вы можете перезагрузить вашу машину и попытаться использовать различные приложения. Например, "telnet localhost" должен установить telnet соединение с вашем хостом.

Однако, интерфейс loopback полезен не только как пример в книгах о сетях , или как система отладки, но фактически используется некоторыми приложениями в течение нормальной работы. Поэтому, Вы всегда должны конфигурировать его, независимо от того присоединена ли ваша машина к сети или нет.

Ethernet интерфейсы

Конфигурирование интерфейса Ethernet идет почти также, как и интерфейса loopback, но требует больше параметров, когда Вы используете подсети.

В Виртуальной Пивоварне, мы разбивали на подсети IP сеть, которая была первоначально класс B. При установке интерфейса требовалось бы написать:

# ifconfig eth0 vstout netmask 255.255.255.0

Эта запись назначает eth0 интерфейсу IP адрес vstout (191.72.1.2). Если бы мы опустили netmask, ifconfig вывел бы netmask из класса сети, что привело бы к netmask 255.255.0.0. Теперь быстренько проверим:

# ifconfig eth0
eth0 Link encap 10Mps Ethernet HWaddr 00:00:C0:90:B3:42
inet addr 191.72.1.2 Bcast 191.72.1.255 Mask 255.255.255.0
UP BROADCAST RUNNING MTU 1500 Metric 1
RX packets 0 errors 0 dropped 0 overrun 0
TX packets 0 errors 0 dropped 0 overrun 0

Вы можете видеть, что ifconfig автоматически устанавливает широковещательный адрес (поле Bcast) равный обычному значению, которое является номером сети хостов с битами хоста равными 1. Также, размер передаваемых сообщений (для данного интерфейса устанавливается максимальный размер Ethernet пакета) был установлен равным максимальному значению 1500 байтов. Все эти значения могут быть изменены специальными опциями, которые были описаны позже.

Также как в случае с loopback, Вы должны теперь установить маршрутизационную запись, которая сообщает ядру о сети, которая может быть достигнута через eth0. Для Виртуальной Пивоварни, Вы это сделали бы так:

# route add -net 191.72.1.0

Сначала это выглядит как волшебство, потому что действительно не очевидно, как route определяет, какие сети связываются с помощью каких интерфейсов. Однако, секрет довольно прост: ядро проверяет все интерфейсы, которые были настроены, и сравнивает адрес назначения (в данном случае 191.72.1.0) с сетевой частью адреса интерфейса. Единственный интерфейс, который соответствует данному адресу, — eth0.

Теперь, что такое опция -net? Она используется, потому что route может работать с маршрутами к сетям и с маршрутами к отдельным хостам (как вы видели в localhost). Когда route получает адрес в формате dotted quad, он пытается определить, относится ли этот адрес к сети или хосту, проверяя биты части хоста. Если часть хоста адреса равна нулю, маршрут предполагает, что это обозначает сеть; в противном случае, что это адрес хоста.

Таким образом, route решит, что 191.72.1.0 — адрес хоста, так как он не может знать, что мы используем подсети. Поэтому нам нужно явно указать, что это адрес сети, и это делает флаг -net.

Конечно, вышеупомянутая команда немного длинная для ввода и может привести к ошибкам. Более удобный способ — использование сетевых имен, которые мы определили в /etc/networks. Это делает команду еще более понятной; и даже флаг -net может быть теперь опущен, потому что route теперь знает, что 191.72.1.0 обозначает сеть.

# route add brew-net

Теперь, после завершения основных этапов конфигурации, необходимо убедиться, что ваш Ethernet-интерфейс работает корректно. Выберите хост на вашем Ethernet, например, vlager, и выполните:

# ping vlager PING
vlager: 64 byte packets
64 bytes from 191.72.1.1: icmp seq=0. time=11. ms
64 bytes from 191.72.1.1: icmp seq=1. time=7. ms
64 bytes from 191.72.1.1: icmp seq=2. time=12. ms
64 bytes from 191.72.1.1: icmp seq=3. time=3. ms
^C
----vstout.vbrew.com PING Statistics----
4 packets transmitted, 4 packets received, 0% packet loss round-trip (ms) min/avg/max = 3/8/12

Если вы не видите подобный вывод, значит, что-то пошло не так. Проблемы с потерей пакетов могут указывать на проблемы с аппаратурой, например, на плохой или отсутствующий terminator. Если пакеты не приходят вообще, проверьте конфигурацию интерфейса с помощью netstat. Пакетная статистика от ifconfig покажет, отправлялись ли пакеты. Если у вас есть доступ к удаленному хосту, проверьте статистику интерфейса на этой машине. Так вы сможете определить, где пропали пакеты. Также рекомендуется проверить маршрутизационную информацию с помощью route, чтобы удостовериться, что оба хоста имеют корректные записи в таблице маршрутов. Route выводит всю таблицу маршрутов при вызове без аргументов (опция -n указывает на вывод имен хостов вместо адресов):

# route -n
Kernel routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
127.0.0.1 * 255.255.255.255 UH 1 0 112 lo
191.72.1.0 * 255.255.255.0 U 1 0 10 eth0

Колонка Flags содержит список флагов для каждого интерфейса. Флаг U всегда устанавливается для активных интерфейсов, а H указывает, что адрес назначения относится к хосту. Если флаг H установлен для маршрута, который вы считаете сетевым, используйте опцию -net с командой route. Чтобы проверить активное использование маршрута, обратите внимание на поле Use. Это поле увеличится между двумя вызовами ping в случае активного использования.

Маршрутизация через Gateway

В предыдущем разделе мы рассмотрели ситуацию, когда хост подключен только к одной Ethernet-сети. Однако, часто возникают ситуации, когда сети соединены с помощью gateway. Этот gateway может объединять два или больше Ethernet-сегментов или обеспечивать соединение с внешним миром, например, с Интернетом. Для использования gateway необходимо предоставить дополнительные данные о маршрутизации на сетевом уровне.

В качестве примера рассмотрим ситуацию, когда Ethernet Виртуальной Пивоварни и Виртуальной Винодельни связаны через gateway, а именно через хост vlager. Предполагая, что vlager уже настроен, нам нужно только добавить запись в таблицу маршрутизации vstout, указывающую, что все хосты в Сети Винодельни доступны через vlager. Для этого используется ключевое слово gw, которое указывает, что следующий аргумент является gateway.

# route add wine-net gw vlager

Разумеется, каждый хост в сети Винодельни, с которым вы хотите взаимодействовать, должен иметь аналогичную запись для Сети Пивоварни. В противном случае вы сможете отправлять данные с vstout на vbardolino, но не получите ответ.

В описанном примере gateway переключает пакеты только между двумя изолированными Ethernet-сегментами. Но представьте, что vlager также имеет соединение с Интернетом, работающее через дополнительное SLIP-соединение. В этом случае мы бы хотели, чтобы датаграммы, предназначенные для любой другой сети, кроме Пивоваренной, передавались vlager. Это можно реализовать, установив для vstout gateway по умолчанию:

# route add default gw vlager

Сетевое имя default связано с адресом 0.0.0.0, что обозначает установленный по умолчанию маршрут. Нет необходимости добавлять это имя в /etc/networks, так как оно встроено в команду route.

Если при использовании ping вы обнаруживаете высокий процент потери пакетов при прохождении через несколько gateway, это может указывать на высокую нагрузку на сеть. Потеря пакетов, как правило, происходит не из-за технических проблем, а из-за временной избыточной нагрузки на маршрутизаторы, которые могут задерживать или даже отбрасывать входящие датаграммы.

Конфигурирование Gateway

Настройка машины для передачи пакетов между двумя Ethernet-сетями довольно простая процедура. Вернемся к хосту vlager, оборудованному двумя Ethernet-картами, каждая из которых связана с одной из двух сетей. Для настройки вам достаточно сконфигурировать оба интерфейса отдельно, присвоив им соответствующие IP-адреса. Также рекомендуется добавить информацию о обоих интерфейсах в файл хостов следующим образом, чтобы иметь удобные имена для них:

191.72.1.1 vlager vlager.vbrew.com
191.72.1.1 vlager-if1
191.72.2.1 vlager-if2

Последовательность команд для настройки двух интерфейсов следующая:

# ifconfig eth0 vlager-if1
# ifconfig eth1 vlager-if2
# route add brew-net
# route add wine-net

PLIP интерфейс

При использовании PLIP для соединения двух машин основные действия аналогичны тем, что выполняются при использовании Ethernet. Рассматриваемая связь называется point-to-point (точка к точке), так как соединяет только два хоста, в отличие от широковещательных сетей.

В качестве примера рассмотрим портативный компьютер vlite работника Виртуальной Пивоварни, который подключен к vlager через PLIP. vlite имеет только один параллельный порт, который при загрузке регистрируется как plip1. Для установки соединения необходимо сконфигурировать интерфейс plip1 следующим образом:

# ifconfig plip1 vlite pointopoint vlager
# route add default gw vlager

Первая команда конфигурирует интерфейс, указывая, что это point-to-point соединение с удаленной машиной vlager. Вторая команда устанавливает маршрут по умолчанию с vlager в качестве gateway. На хосте vlager аналогичная команда ifconfig требуется для настройки соединения:

# ifconfig plip1 vlager pointopoint vlite

Интересно, что на vlager интерфейсу plip1 не обязательно иметь отдельный IP-адрес. Однако, при желании, ему можно присвоить адрес 191.72.1.1.

Теперь мы настроили маршрутизацию от laptop к Сети Пивоварни. Однако еще необходимо настроить маршрутизацию от хостов Пивоварни к vlite. Один из способов — добавить определенный маршрут в таблицу маршрутизации каждого хоста, указав vlager в качестве gateway к vlite:

# route add vlite gw vlager

Более эффективно работать с временными маршрутами, используя динамическую маршрутизацию. Один из способов осуществить это — запустить демон gated. Его следует установить на каждом хосте в сети, чтобы распространять информацию о маршрутах динамически. Однако, самый простой способ — использовать proxy ARP. С помощью proxy ARP, vlager будет отвечать на любой ARP запрос для vlite, отправляя свой собственный Ethernet адрес. В результате, все пакеты для vlite будут отправляться на vlager, который в свою очередь передает их на laptop.

В будущих версиях Net-3 появится инструмент под названием plipconfig, который позволит настраивать IRQ порта принтера. В дальнейшем это может быть заменено более универсальной командой ifconfig.

SLIP и PPP Интерфейсы

Несмотря на то что SLIP и PPP соединения являются простыми point-to-point связями, аналогичными PLIP, стоит учитывать некоторые особенности. Обычно, при установке SLIP соединения необходимо соединиться с удаленной стороной через ваш модем и настроить последовательную линию для SLIP режима. PPP используется аналогичным образом.

Dummy (фиктивный) интерфейс

Фиктивный интерфейс является довольно экзотическим, но при этом полезным. Он наиболее актуален для автономных хостов и машин, подключенных к сети через модем. Проблема автономных хостов заключается в том, что у них только одно активное сетевое устройство — loopback устройство с адресом 127.0.0.1. В определенных случаях требуется отправить данные на "официальный" IP адрес локального хоста. Например, приложение на хосте vlite может захотеть отправить данные другому приложению на том же хосте. Поиск адреса vlite в /etc/hosts возвращает IP 191.72.1.65, из-за чего приложение пытается отправить данные на этот адрес. Так как интерфейс loopback является единственным активным интерфейсом, ядро не может обработать этот адрес, и, следовательно, возвращает ошибку. Здесь фиктивное устройство становится необходимым. Оно решает эту проблему, аналогично loopback устройству. В случае с vlite, достаточно присвоить ему адрес 191.72.1.65 и добавить новый маршрут, указывающий на этот адрес. Таким образом, все дейтаграммы для 191.72.1.65 будут обрабатываться локально. Для этого потребуются следующие действия:

# ifconfig dummy vlite
# route add vlite