Глава 3. Настройка сетевого оборудования

До сих пор мы мало говорили относительно сетевых интерфейсов и общих проблем TCP/IP и не говорили о том, что происходит, когда сетевой код в ядре обращается к аппаратным средствам. Для этого мы должны немного поговорить о концепциях интерфейсов и драйверов.

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

Для того чтобы использовать Ethernet-карту, необходимы специальные функции, расположенные в ядре Linux, которые знают, как работать с этим устройством. Это так называемые драйверы устройств. Например, Linux имеет драйверы устройства для нескольких марок плат Ethernet, которые очень похожи по выполняемым функциям. Они известны как "Becker Series Drivers", и называются так по имени их автора, Donald Becker. Другой пример: драйвер D-link, который работает с адаптером пакетов D-link, присоединяемым к параллельному порту. Linux имет драйверы для разных интерфейсов сетевых карт: ISA, PCI, MCA, EISA, Parallel port, PCMCIA, не так давно появились и адаптеры на USB.

Но что мы подразумиваем, когда говорим, что драйвер управляет устройством? Давайте вернемся к плате Ethernet, которую мы уже упоминали. Драйвер должен быть способен работать с переферией этой платы: он должен посылать команды и данные плате, в то время как плата должна передавать полученные данные драйверу.

В PC-компьютерах эта связь устанавливается через область памяти ввода-вывода, которая является отображением регистров платы и т.п. Все команды и данные, которые ядро посылает плате, проходят через эти регистры. Память ввода-вывода описывается указанием начального адреса (base address). Типичные основные адреса для Ethernet-плат 0x280 или 0x300. Сетевые карты на интерфейсе PCI обычно получают адрес ввода-вывода автоматически.

Обычно можно не беспокоиться о проблемах аппаратных средств, типа адреса ввода-вывода потому, что ядро делает попытку во время загрузки обнаружить местоположение платы. Это называется autoprobing (автопоиск), который означает, что ядро во время загрузки считывает несколько участков памяти и сравнивает считанные данные с теми, которые должны быть получены, если установлена плата Ethernet. Однако, существуют Ethernet-платы, которые ядро не может автоматически обнаружить. Это часто случается с дешевыми картами Ethernet.

Другой параметр, который Вы могли бы сообщить ядру, interrupt request channel (канал запроса прерывания). Компоненты аппаратных средств обычно прерывают ядро, когда они нуждаются во внимании, например, когда прибыли данные или произошли другие события. В PC прерывание может происходить на одном из каналов (0, 1, 3 и до 15). Номер прерывания, назначенный компоненту аппаратных средств называется interrupt request number или IRQ.

Как описано в главе 2, ядро обращается к устройствам через так называемый интерфейс. Интерфейсы предлагают абстрактный набор функций, которые являются стандартными для всех типов аппаратных средств, типа посылки или получения пакетов данных.

Интерфейсы идентифицируются посредством имен. Эти имена определены внутри ядра, это файлы устройств в каталоге /dev. Если ввести команду ls -las /dev/, Вы увидите много файлов. В колонке прав доступа Вы увидите, что первым символом прав доступа здесь является не такой символ, как для обычных имен файлов. Он показывает тип интерфейса. Символ b задает блочное (block) устройство. Символ c задает символьное (character) устройство, которое обрабатывает данные посимвольно, а не блоками. В поле длины файла Вы увидите два числа, которые называются старшим и младшим номерами устройства.

Каждый драйвер имеет уникальный старший номер в ядре. Каждая копия драйвера (по одной на устройство) имеет свой младший номер. Интерфейсы tty с именами /dev/tty* являются символьными, и имеют первый символ в правах доступа c”, все они имеют общий старший номер 4, но младшие номера у каждого свои: /dev/tty1 имеет младший номер 1 и /dev/tty2 имеет 2.

Наиболее типичные имена перечислены в разделе "Обзор сетевых устройств в Linux". Типичные имена для интерфейсов Ethernet: eth0, eth1 и т.д. Назначение интерфейсов для определенных устройств обычно зависит от способа, которым устройства сконфигурированы. Например, первая установленная Ethernet-плата станет eth0, следующая eth1 и так далее. Исключение из этого правила: интерфейсы SLIP, которые назначаются динамически, То есть: всякий раз, когда устанавливается SLIP-связь, последовательному порту назначается интерфейс.

При загрузке ядро показывает, какие интерфейсы установлены и устройства найдены. Вот образец типичного сообщения при загрузке:

 .
 .  This processor honors the WP bit even when in supervisor mode./
    Good.
Swansea University Computer Society NET3.035 for Linux 2.0
NET3: Unix domain sockets 0.13 for Linux NET3.035.
Swansea University Computer Society TCP/IP for NET3.034
IP Protocols: IGMP,ICMP, UDP, TCP
Swansea University Computer Society IPX 0.34 for NET3.035
IPX Portions Copyright (c) 1995 Caldera, Inc.
Serial driver version 4.13 with no serial options enabled
tty00 at 0x03f8 (irq = 4) is a 16550A
tty01 at 0x02f8 (irq = 3) is a 16550A
CSLIP: code copyright 1989 Regents of the University of California
PPP: Version 2.2.0 (dynamic channel allocation)
PPP Dynamic channel allocation code copyright 1995 Caldera, Inc.
PPP line discipline registered.
eth0: 3c509 at 0x300 tag 1, 10baseT port, address 00 a0 24 0e e4 e0,/
    IRQ 10.
3c509.c:1.12 6/4/97 [email protected]
Linux Version 2.0.32 (root@perf) (gcc Version 2.7.2.1)
#1 Tue Oct 21 15:30:44 EST 1997
 .
 .

Этот пример показывает, что ядро построено с поддержкой сетевого протокола TCP/IP и включает драйверы для SLIP, CSLIP и PPP. Третья строка снизу говорит об обнаружении платы 3C509 Ethernet и установке ее интерфейса eth0. Если у Вас другой тип сетевой карты, будет выведена соответствующая строка, обычно с ее названием. Например, для адаптера D-Link используется имя dl0. А вот если сетевая карта есть, а сообщения о ней нет, тогда плохо дело. Ядро не нашло карту при загрузке. Эта ситуация будет рассмотрена позже.

Настройка ядра

Все дистрибутивы Linux имеют загрузочный диск, рассчитанный на все мыслимое оборудование. Но такое ядро занимает уйму места, а драйверы в нем по большей части не понадобятся. Вывод: надо перестроить ядро, чтобы убрать из него все лишнее и оптимизировать использование памяти.

В любом случае при работе с Linux-системой Вы должны быть знакомы с формированием ядра. Это не так сложно! В данном руководстве рассмотрены только параметры конфигурации, которые воздействуют на работу с сетями.

Очень важна версия ядра. Ядра Linux нумеруются по следущей схеме: 2.2.14. Первая цифра показывает старший номер версии. Эта цифра изменяется, когда вносятся значительные изменения. Старший номер версии сменился с 1 на 2, когда ядро было перенесено на другие платформы (не Intel). Второе число определяет младший номер версии. Разработчики Linux договорились о том, что четный младший номер версии показывает production (готовую) или stable (стабильную) версию ядра, а нечетный показывает development (разрабатываемую) или unstable (нестабильную) версию. Вы должны использовать на машине, которая является важной, стабильные ядра потому, что они надежны настолько, насколько вообще может быть надежна программа. Можно использовать нестабильные ядра, если нужны некоторые экспериментальные возможности Linux, но они не отлажены до конца. Они надежней, чем Windows, но все же ниже того минимума, который позволителен в Linux. Третье число показывает номер редакции версии ядра. Система развивается, в ней устраняются небольшие ошибки, появляются новые возможности, что и отражается этим номером.

При запуске программы make menuconfig Вы получите текстовое меню с опциями настройки ядра. На вопрос о поддержке сетей TCP/IP надо ответить "y" для ее включения.

Опции ядра в Linux 2.0 и выше

Здесь в главном меню задаются параметры для основных возможностей системы, например, поддержки SCSI или звуковых карт. Вы можете нажать ? для получения подробного описания опции. Чтобы включить поддержку некой возможности в ядро постоянно, надо ответить y. Можно ответить m, тогда соответствующий драйвер будет включен в ядро как модуль и загружаться по мере необходимости. При всем своем удобстве модули не могут загружаться при начальной инициализации ядра, так что все необходимое для его загрузки должно быть встроено прямо в ядро без модулей. Наконец, если некая возможность не нужна, от нее можно отказаться ответом n.

Меню настройки имеет иерархический вид. Например, чтобы настроить сеть, Вам сначала нужно подвердить, что Вы вообще включаете ее поддержку, и только потом будут заданы вопросы о том, в чем именно эта поддержка должна выражаться. В ядрах серий 2.0 и 2.1 первый вопрос о сети такой:

*
* Network device support
*
Network device support (CONFIG_NETDEVICES) [Y/n/?]

Вы должны ответить y, чтобы использовать любые типы сетевых интерфейсов: Ethernet, SLIP, PPP или другие. При ответе y поддержка устройств Ethernet включается автоматически. После этого система проведет опрос о конкретных возможностях:

PLIP (parallel port) support (CONFIG_PLIP) [N/y/m/?] y
PPP (point-to-point) support (CONFIG_PPP) [N/y/m/?] y
*
* CCP compressors for PPP are only built as modules.
*
SLIP (serial line) support (CONFIG_SLIP) [N/y/m/?] m
  CSLIP compressed headers (CONFIG_SLIP_COMPRESSED) [N/y/?] (NEW) y
  Keepalive and linefill (CONFIG_SLIP_SMART) [N/y/?] (NEW) y
  Six bit SLIP encapsulation (CONFIG_SLIP_MODE_SLIP6) [N/y/?] (NEW) y

Эти вопросы касаются различных протоколов уровня связи, которые Linux поддерживает. PPP и SLIP позволяют Вам передавать пакеты IP по последовательной линии связи. PPP не ограничен передачей пакетов TCP/IP, он может передавать пакеты IPX.

Если Вы отвечаете y или m на вопрос о поддержке SLIP, Вам придется ответить на три вопроса, которые появляются после этого. Опция "CSLIP compressed headers" позволяет сжимать заголовки пакетов TCP/IP. Заметьте, что эта опция лишь обеспечивает возможность работы с такими заголовками, но не заставляет работать с ними в обязательном порядке! Опция Keepalive and linefill заставляет поддержку SLIP периодически генерировать действия на линии SLIP, чтобы таймер неактивности не разрывал соединение. Опция Six bit SLIP encapsulation позволяет Вам выполнять SLIP на линиях, которые не способны к передаче 8-битных данных в чистом виде.

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

Следующие вопросы касаются драйверов для разных сетевых карт. Можно задать не один драйвер, а несколько, если машина имеет несколько сетевых карт разных фирм:

 .
 .
Ethernet (10 or 100Mbit) (CONFIG_NET_ETHERNET) [Y/n/?]
3COM cards (CONFIG_NET_VENDOR_3COM) [Y/n/?]
3c501 support (CONFIG_EL1) [N/y/m/?]
3c503 support (CONFIG_EL2) [N/y/m/?]
3c509/3c579 support (CONFIG_EL3) [Y/m/n/?]
3c590/3c900 series (592/595/597/900/905) "Vortex/Boomerang" support/
    (CONFIG_VORTEX) [N/y/m/?]
AMD LANCE and PCnet (AT1500 and NE2100) support (CONFIG_LANCE) [N/y/?]
AMD PCInet32 (VLB and PCI) support (CONFIG_LANCE32) [N/y/?] (NEW)
Western Digital/SMC cards (CONFIG_NET_VENDOR_SMC) [N/y/?]
WD80*3 support (CONFIG_WD80x3) [N/y/m/?] (NEW)
SMC Ultra support (CONFIG_ULTRA) [N/y/m/?] (NEW)
SMC Ultra32 support (CONFIG_ULTRA32) [N/y/m/?] (NEW)
SMC 9194 support (CONFIG_SMC9194) [N/y/m/?] (NEW)
Other ISA cards (CONFIG_NET_ISA) [N/y/?]
Cabletron E21xx support (CONFIG_E2100) [N/y/m/?] (NEW)
DEPCA, DE10x, DE200, DE201, DE202, DE422 support (CONFIG_DEPCA) [N/y/m/?]/
    (NEW)
EtherWORKS 3 (DE203, DE204, DE205) support (CONFIG_EWRK3) [N/y/m/?] (NEW)
EtherExpress 16 support (CONFIG_EEXPRESS) [N/y/m/?] (NEW)
HP PCLAN+ (27247B and 27252A) support (CONFIG_HPLAN_PLUS) [N/y/m/?] (NEW)
HP PCLAN (27245 and other 27xxx series) support (CONFIG_HPLAN) [N/y/m/?]/
    (NEW)
HP 10/100VG PCLAN (ISA, EISA, PCI) support (CONFIG_HP100) [N/y/m/?] (NEW)
NE2000/NE1000 support (CONFIG_NE2000) [N/y/m/?] (NEW)
SK_G16 support (CONFIG_SK_G16) [N/y/?] (NEW)
EISA, VLB, PCI and on card controllers (CONFIG_NET_EISA) [N/y/?]
Apricot Xen-II on card ethernet (CONFIG_APRICOT) [N/y/m/?] (NEW)
Intel EtherExpress/Pro 100B support (CONFIG_EEXPRESS_PRO100B) [N/y/m/?]/
    (NEW)
DE425, DE434, DE435, DE450, DE500 support (CONFIG_DE4X5) [N/y/m/?] (NEW)
DECchip Tulip (dc21x4x) PCI support (CONFIG_DEC_ELCP) [N/y/m/?] (NEW)
Digi Intl. RightSwitch SE-X support (CONFIG_DGRS) [N/y/m/?] (NEW)
Pocket and portable adaptors (CONFIG_NET_POCKET) [N/y/?]
AT-LAN-TEC/RealTek pocket adaptor support (CONFIG_ATP) [N/y/?] (NEW)
D-Link DE600 pocket adaptor support (CONFIG_DE600) [N/y/m/?] (NEW)
D-Link DE620 pocket adaptor support (CONFIG_DE620) [N/y/m/?] (NEW)
Token Ring driver support (CONFIG_TR) [N/y/?]
IBM Tropic chipset based adaptor support (CONFIG_IBMTR) [N/y/m/?] (NEW)
FDDI driver support (CONFIG_FDDI) [N/y/?]
Digital DEFEA and DEFPA adapter support (CONFIG_DEFXX) [N/y/?] (NEW)
ARCnet support (CONFIG_ARCNET) [N/y/m/?]
  Enable arc0e (ARCnet "Ether-Encap" packet format) (CONFIG_ARCNET_ETH)/
      [N/y/?] (NEW)
  Enable arc0s (ARCnet RFC1051 packet format) (CONFIG_ARCNET_1051)/
      [N/y/?] (NEW)
 .
 .

Наконец, в секции файловых систем, Вас спросят о необходимости поддержки сетевой файловой системы NFS. NFS позволяет обращаться по сети к дискам и каталогам удаленной машины, как к своим собственным:

NFS file system support (CONFIG_NFS_FS) [y]
NFS детально описана в главе 14.

Сетевые опции в ядре Linux 2.2.0 и выше

Linux 2.2.0 отмечена серьезными изменениями в сетевой части ядра. Появилось много новых опций, а также поддержка протокола IPX. Большая часть этих опций нужна только в особых конфигурациях, так что я их не описываю. Подробно с ними можно ознакомиться в Networking HOWTO. Я перечислю наиболее часто используемые опции:

Basics

Нужна для работы с протколом TCP/IP, если ответите n, лишитесь этого протокола, но протокол IPX останется доступен:

Networking options  --->
    [*] TCP/IP networking

Gateways

Если машина используется как шлюз между сетями или между LAN и SLIP-связью (или в других подобных ситуациях), включите эту опцию. А вот если Вы используете свою машину как firewall, выключите ее! Firewall называется машина, которая связана с двумя сетями, но передает информацию между ними по сложному алгоритму. Эта система используется, чтобы внутренние машины могли выйти в Internet, но внешние машины не могли попасть во внутреннюю сеть (подробно firewall рассматриваются в главе 9):

     [*] IP: forwarding/gatewaying

Virtual hosting

Эта опция позволяет иметь более одного сетевого адреса на интерфейс, что полезно при создании виртуальных сайтов, то есть когда одна машина представлена в сети под разными именами. Псевдонимы в IP-адресах будут рассмотрены чуть ниже:

    [*] Network aliasing
        <*> IP: aliasing support

Accounting

Эта опция позволяет собирать информацию о IP-трафике этой машины (вопрос детально обсуждается в главе 10):

    [*] IP: accounting

PC hug

Эта опция дает возможность обойти несовместимость с некоторыми версиями PC/TCP и коммерческими версиями TCP/IP для DOS-машин. При включении этой опции работа с нормальными Unix-машинами будет возможна, хотя скорость несколько упадет:

    --- (it is safe to leave these untouched)
    [*] IP: PC/TCP compatibility mode

Diskless booting

Включает Reverse Address Resolution Protocol (RARP). RARP используется бездисковыми терминалами и X-ьерминалами для запроса своего IP-адреса при загрузке. Если у Вас есть такие клиенты, RARP Вам понадобится. Маленькая программа rarp, которая входит в стандартный сетевой пакет, используется для управления записями в таблице RARP ядра:

    <*> IP: Reverse ARP

MTU

При передаче данных по TCP, ядро разделяет поток данных на блоки для передачи по IP. Размер блока называется Maximum Transmission Unit или MTU. Для машин в сети Ethernet MTU обычно большой и составляет максимальную длину пакетов Ethernet (1500 байт). Но при работе с модемом стоит подобрать нужное значение. Ядро может само определить минимальный размер пакетов и соответственно настроить TCP. Это можно отменить ответом y на этот вопрос.

Если нужно маленькие пакеты для отдельных систем, например, при работе с протоколом SLIP, используйте опцию mss команды route, которая обсуждается в следующей главе:

    [ ] IP: Disable Path MTU Discovery (normally enabled)

Security feature

Протокол IP поддерживает сервис Source Routing. Он позволяет Вам определять маршрут по которому пакет должен проследовать, программируя маршрут в пакете непосредственно. Это было полезно до появления протоколов RIP и OSPF. Но сегодня это рассматривается как угроза безопасности системы, потому что эта функция может обеспечивать нападающих путем обхода некоторых типов защиты firewall, за счет обхода таблицы маршрутизатора. При фильтрации пакетов ничего страшного в ней нет:

     [*] IP: Drop source routed frames

Novell support

Включает поддержку IPX, транспортного протокола Novell Networking. Linux будет функционировать как IPX маршрутизатор. Эта поддержка полезна в средах, где Вы имеете файловый сервер Novell. Файловая система NCP также требует поддержки IPX. Она понадобится, если нужно монтировать по сети файловые системы фирмы Novell (я подробно рассмотрю IPX и файловую систему NCP в главе 15):

    <*> The IPX protocol

Amateur radio

Эта опция включает поддержку Linux протоколов Amateur Radio: AX.25, NetRom и Rose (они подробно описаны в AX25 HOWTO):

    <*> Amateur Radio AX.25 Level 2
    <*> Amateur Radio NET/ROM
    <*> Amateur Radio X.25 PLP (Rose)

Linux поддерживает еще один тип драйверов: тупой драйвер. Следующий вопрос появляется в начале раздела драйверов устройств:

    <*> Dummy net driver support

Такой драйвер маскирует кольцевой интерфейс и очень полезен на отдельной или PPP/SLIP машине. На машинах только с интерфейсом PPP/SLIP он будет обеспечивать передачу трафика IP. Подробно он рассмотрен в разделе Dummy Interface в главе 5. Обратите внимание, что сегодня Вы можете достичь того же самого результата, используя IP псевдоним и конфигурируя свой адрес IP как псевдоним на кольцевом интерфейсе.