Setevaya_rabota_po_protokolu_TCP_linux (1084628), страница 4
Текст из файла (страница 4)
host ocean {
...
}
host sea {
...
}
}
Запуск программы dhcpd может осуществляться в файле начальной загрузки типа /etc/rc/* (детали зависят от вида операционной системы, в Solaris это файл /etc/rc2.d/S72inetsvc). Некоторые параметры командной строки:
dhcpd [-p port] [-cf configfile] [if0 [...ifN]]
где port - номер UDP порта, если он отличается от стандартного (67); configfile - имя конфигурационного файла, если это не ./dhcpd.conf; if0 ... ifN - сетевые интерфейсы, обслуживаемые демоном (если у хоста несколько интерфейсов).
DHCP-клиент под Unix
DHCP клиент под Unix (от Internet Software Consortium) состоит из программы dhclient, конфигурационного файла /etc/dhclient.conf и файла dhclient.leases в который клиент заносит информацию о выданных ему адресах и настройках. Для запуска клиента во время загрузки системы используется специальный скрипт (сценарий оболочки), поставляемый с клиентом в каталоге scripts (для разных типов Unix свои скрипты). Он подготавливает сетевые интерфейсы для конфигурирования с помощью DHCP, потом активизирует DHCP клиента. Этот скрипт должен быть скопирован в /etc под именем dhclient-script.
Конфигурационный файл в большинстве случаев очень прост и часто он даже может быть пуст. Ниже приведен ряд полезных директив конфигурационного файла dhclient.conf. Директивы завершаются точкой с запятой.
timeout time;
- если через time секунд ответ от сервера не получен, хост пытается сконфигурироваться самостоятельно, используя информацию о предыдущих конфигурациях из файла dhclient.leases (если их срок годности не истек) или используя статически установленные конфигурации; каждая такая конфигурация-кандидат проверяется на работоспособность. Формат записи конфигураций - см. man dhclient.conf. В случае неудачи попытка соединения с сервером повторяется в соответствии с параметром retry; значение timeout по умолчанию - 60 с;
retry time;
- период повторных попыток соединения с сервером в случае неудачи; измеряется в секундах, по умолчанию - 300 с;
request option;
- запросить у сервера передачу опции option;
require option;
- в случае, если сервер не передал опцию option, отвергнуть конфигурацию, предложенную сервером;
send option declaration;
- передать серверу значение declaration опции option, например:
send requested-lease-time 7200;
- запросить выделение IP-адреса на 7200 секунд;
default option declaration;
- установить значение declaration для опции option, если сервер не передал эту опцию;
supersede option declaration;
- установить значение declaration для опции option, независимо от того, что передал сервер;
prepend option declaration;
- добавить значение для опции к значению, переданному сервером, поставив свое значение первым;
append option declaration;
- добавить значение для опции к значению, переданному сервером, поставив свое значение последним.
Директивы prepend и append должны использоваться только для опций, допускающих множественные значения, иначе результат получится непредсказуемым.
reject ip_address;
- не принимать предложения от DHCP-сервера, который идентифицирует себя адресом ip_address.
interface "if_name" { директивы }
- если у компьютера несколько интерфейсов, директивы в разделе interface будут относиться к конфигурации интерфейса if_name. Интерфейсы, не имеющие соответствующих разделов в конфигурационном файле, будут конфигурироваться с учетом глобальных директив или по умолчанию.
Статическая IP-маршрутизация
Сеть Internet с ее протоколами изначально задумывалась как протяженная (WAN - Wide Area Network), состоящая из большого количества машин, соединенных с помощью разных сред обмена данными (как локальных сетей, так и глобальных соединений). Теоретически в Internet могут напрямую работать друг с другом около четырех миллиардов машин (2^32 за вычетом некоторых специальных номеров), а через proxy и того больше.
В силу этих причин Internet - сегментированная сеть. Сегментом является либо прозрачный участок широковещательной (Ethernet) или маркерной (TokenRing) сети, либо соединение точка-точка (модемное).
Теперь - обозначения. IP-номер - четырехбайтное число, записываемое либо в шестнадцатеричном виде типа 0xC0A80E05, либо в десятичном виде, где байты разделены точками типа 192.168.14.5 (в качестве примера в обоих случаях использовался один и тот же номер).
Маска - тоже четырехбайтное число, но все старшие биты, начиная с некоторого, всегда установлены в единицу, а все младшие - в ноль. Примеры: 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.
Номером сети называют число, получаемое из номера интерфейса применением побитовой операции AND с маской, т.е. в номере интерфейса обнуляются биты на тех местах, на которых стоят нулевые биты в маске.
Следует помнить, что IP-номер присваивается не компьютеру, а интерфейсу (сетевому выходу либо последовательному порту). В принципе можно дать нескольким интерфейсам один номер, но это может вызвать сложности. Можно также присвоить несколько адресов одному интерфейсу.
В сегменте сети все машины имеют IP-номера с одинаковым номером сети и одинаковой маской. В одной локальной сети можно совместить две и больше разных IP-сетей, они даже могут знать друг о друге и нормально общаться, но это все-таки будут две разные сети.
Принято следующее деление в зависимости от значения старшего байта IP-адреса:
-
0..127 - сети класса A по 2^24 адресов с маской 0xFF000000;
-
128..191 - сети класса B по 2^16 адресов с маской 0xFFFF0000;
-
192..223 - сети класса C по 2^8 адресов с маской 0xFFFFFF00;
-
224..239 - сети класса D для multicast (групповой) рассылки;
остальные пока зарезервированы.
Многие программы по адресу автоматически определяют класс сети, хотя это можно поправить вручную. В принципе никто не мешает разбить сеть на две или больше подсетей с любыми масками, но организациям как правило выделяют адреса блоками, соответствующими классам A, B и C - это связано с системой DNS, позволяющей узнать доменное имя машины по ее IP-адресу.
Сеть класса A с номером 127 - loopback, т.е. предназначена для общения компьютера с собой. В любой сети номер (IP-номер AND маска) является номером всей сети и не может быть присвоен никому конкретно. Номер (IP-номер OR NOT маска), являющийся последним номером в сети, предназначен для broadcasting (широковещательных) сообщений, которые доставляются всем машинам сегмента сети. Соответственно, при выделении группы адресов в сеть два адреса становятся недоступны.
Рассмотрим маршрутизацию в терминах FreeBSD. В Unix команды настройки сети, как правило, заюпускаются из файла /etc/rc или запускаемых из него файлах, а в MS Windows - загрузчиком операционной системы в соответствие с system.ini или registry.
Главному шлюзу я всегда присваиваю первый (наименьший) номер в сети (нулевой, как я уже говорил, недоступен). Если в сети присутствует второй шлюз, через который подсоединен другой сегмент, то этому шлюзу (промежуточному маршрутизатору) будет присваиваться последний (наибольший) номер в сети. Для этого нет никаких разумных причин - так мне хочется.
Построим первый сегмент сети:
Сконфигурируем рабочую станцию:
ifconfig ep0 inet 192.168.1.5 netmask 255.255.255.0
ifconfig lo0 inet 127.0.0.1 netmask 255.0.0.0
route add default 192.168.1.1
Рассмотрим внимательнее, что делают эти команды:
ifconfig ep0 inet 192.168.1.5 netmask 255.255.255.0
присвоила интерфейсу ep0 номер 192.168.1.5, а также создала в таблице маршрутизации запись о том, что все пакеты с номером сети 192.168.1.0/24 будут направляться прямо через этот интерфейс с использованием протокола ARP.
ifconfig lo0 localhost
конфигурирует интерфейс loopback, т.е. "петлю". Этот интерфейс должен иметь адрес 127.0.0.1 и маску 255.0.0.0 на любой машине, имеющей IP, поэтому некоторые системы (например, MS Windows) делают это автоматически, не требуя от администратора (или пользователя, если он сам настраивает систему) задавать параметры loopback. Так как этот интерфейс настраивается на каждой машине одинаково, я не буду писать эту строчку каждый раз. localhost определяется по файлу /etc/hosts, в котором содержится
127.0.0.1 localhost.домен localhost
а маска берется по умолчанию - 255.0.0.0.
route add default 192.168.1.1
замечу, что маршрутизация "default" на самом деле есть "inet 0x0 netmask 0x0" и это надо прописывать, если старая версия команды route не понимает слова "default". создала запись, в соответствии с которой все пакеты (все, потому что любой пакет подходит под 0.0.0.0/0) будут отправляться на машину, имеющую интерфейс 192.168.1.1. Информация о том, как можно добраться до интерфейса 192.168.1.1 содержится в предыдущей команде, которая определила способ доступа ко всем машинам 192.168.1.* через интерфейс ep0.
Таким образом, у нас сложилась примерно такая ситуация:
Вообще система маршрутизации (за исключением предельно примитивных случаев) древовидна, т.е. одни записи включают в себя другие. Частичное пересечение невозможно, ибо границы адресного пространства, на которое действует каждая запись, выровняны на размер этого пространства. Порядок хранения и просмотра таблицы может быть разный, но должен обеспечивать приоритет записей с маленьким пространством перед записями с большим пространством. В данном случае обращение к машине 192.168.1.9 попадает под юрисдикцию обеих записей, но обращаться к ней наша рабочая станция будет в соответствии с 192.168.1.0/24->ep0.
Интерфейс шлюза надо сконфигурировать так:
ifconfig ed1 inet 192.168.1.1 netmask 255.255.255.0
На самом деле у нашего шлюза много интерфейсов и они будут конфигурироваться по мере надобности. Еще раз обращаю внимание на то, что номер и маска сети совпадают для всех машин этого сегмента.
Второй сегмент содержит в себе машину, к которой по последовательной линии с помощью протокола SLIP подсоединен еще один компьютер.
Сконфигурируем ws.2.1:
slattach -S 0 [...]
ifconfig sl0 192.168.1.81 192.168.1.82 up
ifconfig ep0 inet 192.168.2.7 netmask 255.255.255.0
route add default 192.168.2.1
Сконфигурируем ws.2.2:
slattach -S 0 [...]
ifconfig sl0 192.168.1.82 192.168.1.81 up
route add default 192.168.1.81
Сконфигурируем шлюз:
ifconfig ed2 inet 192.168.2.1 netmask 255.255.255.0
route add host 192.168.2.81 192.168.2.7
route add host 192.168.2.82 192.168.2.7
Третий сегмент будет сочетать в себе две сети - сеть класса C 192.168.2.*/24 и сеть класса B 172.16.*.*/16.
Начнем с шлюза. Ему присвоим два адреса, по одному из каждой сети:
ifconfig ed3 inet 192.168.3.1 netmask 255.255.255.0
ifconfig ed3 inet 172.16.0.1 netmask 255.255.0.0 alias...
Теперь ws.3.1 - ей дадим адрес только из первой сети:
ifconfig ep0 inet 192.168.3.7 netmask 255.255.255.0
route add default 192.168.3.1
В такой конфигурации ws.3.1 отлично сможет общаться с машинами из сети 192.168.3.0/24 и с машинами вне сегмента локальной сети. При попытке же обратиться к машине того же сегмента, но другой IP-сети, пакет будет послан на шлюз. Шлюз знает, что пакеты с этим адресом надо послать в ту локальную сеть; но некоторые операционные системы работают по алгоритму маршрутизации, в котором запрещено посылать пакет туда, откуда он пришел - это делается для того, чтобы избежать зацикливания пакетов.
Во избежание этого ws.3.2 мы настроим с учетом того, что в локальной сети работают машины с адресами из другой IP-сети: