Настройка стека протоколов TCP/IP
Статья включает:
Термин "TCP/IP" обозначает два разных протокола — TCP и IP. Поскольку эти протоколы обычно используются совместно, понятие "TCP/IP" стало стандартным в современном Интернете. В сущности, оно характеризует сетевые средства связи, в которых данные передаются по IP-сетям с помощью протокола TCP.
Эта глава включает в себя сведения о том, как настроить протокол TCP/IP в сети на основе ЗОСРВ «Нейтрино». Кроме того, она содержит информацию о разрешении неполадок и другие подробности, которые важны с точки зрения системного администрирования. Сеть TCP/IP на основе ЗОСРВ «Нейтрино» обеспечивает доступ к ресурсам, которые расположены на любом удаленном компьютере, поддерживающем стек протоколов TCP/IP.
Существуют два типа TCP/IP-хостов: клиенты и серверы. Клиент запрашивает службу TCP/IP, а сервер предоставляет ее. При планировании сети необходимо решить, какие хосты будут серверами, а какие – клиентами.
Например, компьютер, который посылает запросы на соединение через протокол telnet, должен быть настроен как клиент, а компьютер, который принимает эти запросы – как сервер.
В терминологии протокола TCP/IP компьютеры, которые доступны по сети, называются хостами (host) или шлюзами (gateway).
![]() | Для того чтобы воспользоваться протоколом TCP/IP, необходимо знать IP-адрес локального хоста и IP-адрес хоста, к которому требуется подключиться. Обычно обращение к удаленному хосту осуществляется по текстовому имени, которое разрешается в IP-адрес с помощью сервера имен. |
Сервер имен (nameserver) представляет собой базу данных, которая содержит имена и IP-адреса хостов. Доступ к TCP/IP- и интернет-хостам обычно осуществляется через текстовое имя (например, www.kpda.ru) и механизм, который преобразует имя в IP-адрес (например, 209.226.137.1
).
Самый простой способ создать такую привязку — воспользоваться таблицей в файле /etc/hosts. Этот метод эффективен в сетях небольшого и среднего масштаба. Если сеть включает в себя много хостов или не является внутренней, то необходимо использовать сервер имен (например, для подключения к поставщику услуг Интернета).
При подключении к TCP/IP-хосту с использованием имени у сервера имен запрашивается соответствующий IP-адрес, а затем осуществляется соединение с этим IP-адресом. Сервер имен может быть задан следующими способами:
/etc/net.cfg
); nameserver 10.0.0.2 nameserver 10.0.0.3
Для того чтобы сконфигурировать сеть и задать серверы имен, можно воспользоваться инструментом настройки протокола TCP/IP и коммутируемых соединений оконного окружения Photon под названием phlip. Утилита phlip присваивает значение конфигурационной строке _CS_RESOLVE. Эту конфигурационную строку можно также задавать вручную. Если строка _CS_RESOLVE существует, то она всегда используется для поиска сервера имен вместо файла /etc/resolv.conf.
Более подробные сведения о поиске имен хостов и серверов имен в TCP/IP-сетях см. в разделах /etc/hosts и /etc/resolv.conf.
![]() | Если сервер имен не отвечает, то существует таймаут по 1,5 минуты на каждый сервер. Этот таймаут не может быть изменен, но многие утилиты TCP/IP имеют опцию -n, которую можно использовать, что бы избежать поиска имени. |
Маршрутизация определяет, как пакет передается адресату. Существуют следующие категории маршрутизации.
Маршрутизацию и протоколы маршрутизации часто путают друг с другом. Маршрутизация в стеке TCP/IP определяется с помощью таблиц маршрутизации, а протоколы маршрутизации позволяют изменять эти таблицы.
Для использования протокола TCP/IP необходимы следующие программные компоненты (рис. 13.1):
base.io-net
операционной системы NetBSD; Параметры конфигурации задаются с помощью утилит ifconfig и route.
Если используется протокол динамического конфигурирования хостов (Dynamic Host Configuration Protocol, DHCP), то, независимо от версии стека TCP/IP, можно воспользоваться утилитой dhcp.client для того, чтобы автоматически задать конфигурационные параметры, которые предоставляет DHCP-сервер.
![]() | Программа распознавания устройств автоматически запускает менеджер io-pkt-* при загрузке операционной системы, а затем загружает полнофункциональный стек TCP/IP и запускает драйверы обнаруженных устройств. Если при загрузке требуется использовать компактный стек или задавать какие-либо параметры (например, включать протокол IPsec), то необходимо отредактировать файлы распознавания устройств. Более подробные сведения и пример Распознавание устройств. |
Стек TCP/IP, основан на стеке TCP/IP операционной системы NetBSD и поддерживает схожие с ним возможности. Если для конфигурирования полнофункционального стека не используется утилита phlip (инструмент настройки протокола TCP/IP и коммутируемых соединений оконного окружения Photon), то необходимо воспользоваться утилитами ifconfig и route, как показано далее, поскольку конфигурировать полнофункциональный стек с помощью командно-строковых аргументов по аналогии с компактным стеком нельзя.
Для задания IP-адреса интерфейса следует воспользоваться утилитой ifconfig. Чтобы назначить сетевому интерфейсу IP-адрес 10.0.0.100, необходимо ввести команду:
ifconfig if_name 10.0.0.100
где if_name есть имя интерфейса, которое определяет и использует сетевой драйвер.
Если требуется также указать шлюз, следует ввести команду route:
route add default 10.0.0.1
Эта команда устанавливает IP-адрес шлюза 10.0.0.1
.
Чтобы затем просмотреть сетевую конфигурацию, следует воспользоваться командой netstat (команда netstat -in отображает информацию о сетевых интерфейсах):
Name Mtu Network Address Ipkts Ierrs Opkts Oerrs Coll lo0 32976 <Link> 0 0 0 0 0 lo0 32976 127 127.0.0.1 0 0 0 0 0 en0 1500 <Link> 00:50:da:c8:61:92 21 0 2 0 0 en0 1500 10 10.0.0.100 21 0 2 0 0
Чтобы отобразить информацию о таблице маршрутизации в полном стеке, следует воспользоваться командой netstat -rn. Ее результат выглядит так:
Routing tables Internet: Destination Gateway Flags Refs Use Mtu Interface default 10.0.0.1 UGS 0 0 - en0 10 10.0.0.100 U 1 0 - en0 10.0.0.100 10.0.0.100 UH 0 0 - lo0 127.0.0.1 127.0.0.1 UH 0 0 - lo0
Эта таблица показывает, что маршрут по умолчанию задан и его IP-адрес равен 10.0.0.1
.
Если хост является сервером, то он запускает соответствующий сервис для обслуживания клиентских запросов. Сервер TCP/IP обычно запускает сервис inetd, который также называют "суперсервером Интернета". Сервис inetd можно запустить из файла rc.local
(см. описание файла /etc/rc.d/rc.sysinit
в разделе Управление запуском ЗОСРВ «Нейтрино»).
![]() | Запуск сервиса inetd дает внешним пользователям возможность подключаться к локальному компьютеру, поэтому его ненадлежащая настройка способна вызвать проблемы с безопасностью. |
В сети TCP/IP сервис inetd ожидает соединений через порты со стандартными номерами, которые указаны в файле /etc/inetd.conf
. После получения запроса утилита inetd запускает соответствующий серверный сервис. Например, если клиент запрашивает удаленное подключение к хосту с помощью утилиты telnet, то для обслуживания этого запроса сервер inetd запускает сервис удаленного подключения telnetd. В большинстве случаев клиентские запросы обслуживаются таким способом.
Сервисы, которые может запускать утилита inetd, задаются в конфигурационном файле суперсервера /etc/inetd.conf
. Версия этого файла, которая входит в дистрибутив ЗОСРВ «Нейтрино», содержит все сервисы TCP/IP, имеющиеся в дистрибутиве, а также некоторые нестандартные службы утилиты pidin. Редактировать файл /etc/inetd.conf
необходимо лишь тогда, когда требуется добавить или удалить определения сервисов. Утилита inetd считывает конфигурационную информацию из этого файла при запуске. Файл /etc/inetd.conf
включает в себя следующие часто используемые сервисы.
![]() |
|
Существуют и другие резидентные сервисы, которые могут работать независимо от сервера inetd:
Эти сервисы прослушивают свои TCP-порты и управляют собственными транзакциями. Они обычно запускаются при загрузке компьютера и затем работают постоянно. Тем не менее, для экономии системных ресурсов можно запускать сервис bootpd с помощью сервера inetd только при получении запроса на загрузку.
В некоторых ситуациях необходимо запускать несколько экземпляров стека протоколов TCP/IP.
io-pkt-v4 -del900 pci=0x0
io-pkt-v4 -i1 -del900 pci=0x1 -ptcpip prefix=/sock2
Чтобы получить PCI-индексы сетевых плат, можно воспользоваться командой pci -vvv. Если используются различные типы сетевых плат, то указывать PCI-индекс не обязательно.
Параметр -i во втором экземпляре стека TCP/IP указывает утилите io-pkt-v4 зарегистрироваться под префиксом io-pkt1
. Параметр prefix указывает на то, что второй стек должен быть зарегистрирован под префиксом /sock2/dev/socket
вместо префикса по умолчанию /dev/socket
. Приложения, которым необходимо использовать второй стек TCP/IP, должны задать переменную окружения SOCK. Пример:
SOCK=/sock2 telnet 10.59
или
SOCK=/sock2 netstat -in
или
SOCK=/sock2 ifconfig en0 192.168.2.10
Если переменная SOCK не задана, то команда использует первый стек TCP/IP.
Когда хост добавляется в сеть или подключается к Интернету, необходимо задать его адрес и некоторые другие конфигурационные параметры. Для этого существует несколько распространенных механизмов:
Серверы, которые реализуют эти протоколы в корпоративной сети, предоставляют клиенту IP-адрес, шлюз, маску сети, серверы имен и даже принтер. Пользователям не обязательно конфигурировать свои хосты вручную для того, чтобы использовать сеть.
Операционная система ЗОСРВ «Нейтрино» реализует еще один протокол автоматического конфигурирования под названием AutoIP, который является проектом комитета IETF по автоматической настройке. Этот протокол используется в небольших сетях для назначения хостам IP-адресов, локальных для канала (link-local). Протокол AutoIP самостоятельно определяет IP-адрес, локальный для канала, используя схему согласования с другими хостами и не обращаясь к центральному серверу.
Рассмотрим фрагмент сети, включающий узел A (2 сетевых инетрфейса) и узел B (1 сетевой интерфейс):
[ Узел A ] [ Узел B ]<----> [192.168.16.1 192.168.0.1] <----> [192.168.0.22]
Для того, чтобы настроить перенаправление (англ. forwarding) IP-пакетов между сетевыми интерфейсами узла A, необходимо выполнить следующие шаги:
ifconfig igc0 192.168.16.1/24 ifconfig rt0 192.168.0.1/24
и
ifconfig rt0 192.168.0.22/24
io-pkt-ksz -d igc -d rtl8169 -p tcpip forward
Если же сетевой стек уже запущен, следует воспользоваться утилитой sysctl:
echo "net.inet.ip.forwarding=1" >> /etc/sysctl.conf sysctl -f /etc/sysctl.conf
или
sysctl -w net.inet.ip.forwarding=1
![]() | Перенаправление трафика возможно только в пределах сетевых интерфейсов, зарегистрированных в одном процессе сетевого стека. Поскольку пользователь имеет возможность запустить несколько экземпляров сетевого стека с разными наборами драйверов (интерфейсов), это обстоятельство следует учитывать. |
route add -net 192.168.16.0 -netmask 255.255.255.0 \ -gateway 192.168.0.1
так и на узле во внешнем сегменте сети:
route add -net 192.168.0.0 -netmask 255.255.255.0 \ -gateway 192.168.16.1
Сокращение PPPoE расшифровывается как "Point-to-Point Protocol over Ethernet" (протокол соединения "точка-точка" через среду Ethernet). Этот протокол инкапсулирует данные для передачи через сеть Ethernet с мостовой топологией.
PPPoE представляет собой спецификацию подключения пользователей сети Ethernet к Интернету через широкополосное соединение, например, выделенную цифровую абонентскую линию, беспроводное устройство или кабельный модем. Использование протокола PPPoE и широкополосного модема обеспечивает пользователям локальной компьютерной сети индивидуальный аутентифицированный доступ к высокоскоростным сетям передачи данных.
Протокол PPPoE объединяет технологию Ethernet с протоколом PPP, что позволяет эффективно создавать отдельное соединение с удаленным сервером для каждого пользователя. Управление доступом, учет соединений и выбор поставщика услуг определяется для пользователей, а не для узлов сети. Преимущество этого подхода заключается в том, что ни телефонная компания, ни поставщик услуг Интернета не должен обеспечивать для этого какую-либо специальную поддержку.
В отличие от коммутируемых соединений, соединения через цифровую абонентскую линию и кабельный модем всегда активны. Поскольку физическое соединение с удаленным поставщиком услуг совместно используется несколькими пользователями, необходим метод учета, который регистрирует отправителей и адресатов трафика, а также производит начисления пользователям. Протокол PPPoE позволяет пользователю и удаленному узлу, которые участвуют в сеансе связи, узнавать сетевые адреса друг друга во время начального обмена, который называется обнаружением (discovery). После того как сеанс между отдельным пользователем и удаленным узлом (например, поставщиком услуг Интернета) установлен, за этим сеансом можно вести наблюдение для того, чтобы производить начисления. Во многих домах, гостиницах и корпорациях общий доступ к Интернету предоставляется через цифровые абонентские линии с использованием технологии Ethernet и протокола PPPoE.
Соединение через протокол PPPoE состоит из клиента и сервера. Клиент и сервер работают с использованием любого интерфейса, который близок к спецификациям Ethernet. Этот интерфейс применяется для выдачи клиентам IP-адресов с привязкой этих IP-адресов к пользователям и, по желанию, к рабочим станциям, вместо аутентификации на основе только рабочей станции. Сервер PPPoE создает соединение "точка-точка" для каждого клиента.
Для того чтобы создать сеанс PPPoE, следует воспользоваться сервисом pppoed. Модуль io-pkt-* предоставляет службы протокола PPPoE. Сначала необходимо запустить io-pkt-* с подходящим драйвером. Пример:
io-pkt-v6-hc -del900
Затем следует создать сеанс связи с любым сервером с помощью файла /etc/ppp/pppoe-up
для того, чтобы запустить сервис pppd:
pppoed
После этого следует создать сеанс связи с сервером, который имеет имя PPPOE_GATEWAY:
pppoed name=PPPOE_GATEWAY
Когда сеанс PPPoE установлен, сервис pppoed использует сервис pppd для создания соединения "точка-точка" через этот сеанс. Сервис pppd получает локальную конфигурацию протокола TCP/IP от сервера (поставщика услуг Интернета).
Для установления каналов связи "точка-точка" через протокол TCP/IP программе pppoed необходим сервис pppd. При запуске сервиса pppd необходимо воспользоваться несколькими параметрами, которые специфичны для его работы через сеанс PPPoE. Пример файла /etc/ppp/pppoe-up
:
#!/bin/sh pppd debug /dev/io-net/ppp_en -ac -pc -detach defaultroute \ require-ns mtu 1492 name username
Для работы сервиса pppd с сервисом pppoed обязательны следующие параметры.
Хост TCP/IP использует протокол DHCP (Dynamic Host Configuration Protocol, динамический протокол конфигурирования хостов) для получения своих конфигурационных параметров (IP-адреса, шлюза, серверов имен и т.д.) у DHCP-сервера, который содержит конфигурационные параметры всех хостов сети.
Утилита dhcp.client, которая является DHCP-клиентом операционной системы ЗОСРВ «Нейтрино», получает эти параметры и автоматически конфигурирует хост для использования Интернета или локальной сети.
Если утилита dhcp.client не может применить конфигурационные параметры, которые предоставлены DHCP-сервером, она передает эти параметры сценарию, который она исполняет. Этот сценарий можно использовать для применения любых параметров, которые не устанавливаются утилитой dhcp.client. Более подробные сведения см. в разделе о dhcp.client справочника по утилитам.
AutoIP представляет собой модуль, который необходимо смонтировать в менеджер io-pkt-*. Этот модуль используется для быстрого конфигурирования хостов в небольшой сети. Протокол AutoIP назначает своему интерфейсу IP-адрес, локальный для канала, из сети 169.254/16
, если этот адрес не используется никаким другим хостом. Преимущество протокола AutoIP состоит в том, что необходимость в центральном конфигурационном сервере отсутствует. Хосты самостоятельно определяют, какие IP-адреса свободны для использования, и отслеживают возникновение конфликтов.
Обычно хост использует протоколы DHCP и AutoIP одновременно. Когда хост впервые подключается к сети, он не располагает информацией о наличии в сети DHCP-сервера. Если запустить программу dhcp.client с параметром -a (использовать IP-адрес как псевдоним), то интерфейсу одновременно присваивается IP-адрес, локальный для канала, и IP-адрес, который выдается протоколом DHCP. Если DHCP-сервер отсутствует, то наступает тайм-аут, в результате которого программа dhcp.client завершается и оставляет активным IP-адрес, локальный для канала. Если позднее DHCP-сервер становится доступным, то утилиту dhcp.client можно перезапустить и применить IP-адрес, который выдает протокол DHCP, без помех для TCP/IP-соединений, использующих IP-адрес, локальный для канала.
Одновременная активность адреса, который назначается протоколом DHCP, и IP-адреса, локального для канала, обеспечивает связь с хостами, которые имеют как IP-адреса, локальные для канала, так и обычные IP-адреса. Более подробные сведения см. в разделах о lsm-autoip.so и dhcp.client.
Для обнаружения неполадок, которые возникают в сети TCP/IP (например, невозможность передачи пакетов по сети), необходимо использовать несколько утилит. Эти утилиты опрашивают хосты, серверы и шлюзы с целью получения диагностической информации для локализации неисправностей и отвечают на следующие типичные вопросы.
Как было сказано ранее, менеджер io-pkt-* является связующим звеном между драйверами и протоколами. Чтобы проверить наличие неполадок в нем, следует воспользоваться командой pidin:
$ pidin -P io-pkt-v4 mem
Затем надо выполнить поиск разделяемого объекта протокола TCP/IP в выводе этой команды:
pid tid name prio STATE code data stack 126996 1 sbin/io-pkt-v4-hc 21o SIGWAITINFO 872K 904K 8192(516K)* 126996 2 sbin/io-pkt-v4-hc 21o RECEIVE 872K 904K 8192(132K) 126996 3 sbin/io-pkt-v4-hc 21r RECEIVE 872K 904K 4096(132K) 126996 4 sbin/io-pkt-v4-hc 21o RECEIVE 872K 904K 4096(132K) 126996 5 sbin/io-pkt-v4-hc 20o RECEIVE 872K 904K 4096(132K) 126996 6 sbin/io-pkt-v4-hc 9o RECEIVE 872K 904K 4096(132K) libc.so.3 @b0300000 444K 16K devnp-shim.so @b8200000 28K 8192 devn-epic.so @b8209000 40K 4096 lsm-qnet.so @b8214000 168K 36K
Вывод должен содержать разделяемый объект сетевого драйвера (в данном случае это драйвер devnp-shim.so, который позволяет io-pkt-* использовать унаследованный из устаревшего стека io-net драйвер devn-epic.so).
Для того чтобы получить информацию о серверах имен, следует воспользоваться командой:
getconf _CS_RESOLVE
Если конфигурационная строка не используется, то надо ввести команду:
cat /etc/resolv.conf
Файл /etc/hosts содержит информацию, которая относится к известным хостам сети. Каждому хосту должна соответствовать одна строка, которая включает в себя следующие данные:
интернет_адрес официальное_имя_хоста псевдонимы
Чтобы отобразить содержимое этого файла, следует воспользоваться командой:
cat /etc/hosts
Сведения о состоянии сети можно получить с помощью утилиты netstat:
Чтобы определить, подключен ли локальный хост к другим хостам, следует воспользоваться утилитой ping. Пример:
ping isp.com
Если подключение существует, утилита ping отображает приблизительно следующее:
PING isp.com (10.0.0.1): 56 data bytes 64 bytes from 10.0.0.1: icmp seq=0 ttl=255 time=0 ms 64 bytes from 10.0.0.1: icmp seq=1 ttl=255 time=0 ms 64 bytes from 10.0.0.1: icmp seq=2 ttl=255 time=0 ms 64 bytes from 10.0.0.1: icmp seq=3 ttl=255 time=0 ms 64 bytes from 10.0.0.1: icmp seq=4 ttl=255 time=0 ms 64 bytes from 10.0.0.1: icmp seq=5 ttl=255 time=0 ms 64 bytes from 10.0.0.1: icmp seq=6 ttl=255 time=0 ms
Это сообщение продолжает выводиться до тех пор, пока утилита ping не завершится, например, с помощью нажатия комбинации клавиш Ctrl + C
.
Следует воспользоваться командой nicinfo:
/usr/sbin/nicinfo устройство
Эта утилита отображает информацию о соединении заданного сетевого интерфейса или интерфейса /dev/io-net/en0
(если интерфейс не указан). Эта информация включает в себя число переданных и полученных пакетов, коллизий и других ошибок:
3COM (90xC) 10BASE-T/100BASE-TX Ethernet Controller Physical Node ID ................. 000103 E8433F Current Physical Node ID ......... 000103 E8433F Media Rate ....................... 10.00 Mb/s half-duplex UTP MTU .............................. 1514 Lan .............................. 0 I/O Port Range ................... 0xA800 -> 0xA87F Hardware Interrupt ............... 0x7 Promiscuous ...................... Disabled Multicast ........................ Enabled Total Packets Txd OK ............. 1585370 Total Packets Txd Bad ............ 9 Total Packets Rxd OK ............. 11492102 Total Rx Errors .................. 0 Total Bytes Txd .................. 102023380 Total Bytes Rxd .................. 2252658488 Tx Collision Errors .............. 39598 Tx Collisions Errors (aborted) ... 0 Carrier Sense Lost on Tx ......... 0 FIFO Underruns During Tx ......... 0 Tx deferred ...................... 99673 Out of Window Collisions ......... 0 FIFO Overruns During Rx .......... 0 Alignment errors ................. 0 CRC errors ....................... 0
Предыдущий раздел: перейти