Думаю, очень к месту будет напомнить о модели OSI, ибо с ней (с моделью OSI) в статье будет тесное взаимодействие. Поэтому привожу картинки из статьи. В Linux статическая конфигурация сети настраивается с помощью конфигурационных файлов. Данный способ настройки я рассматривал в статье Настройка сети в Linux, диагностика и мониторинг.
В старых версиях ядер Linux (2.4 и ниже) существовали инструменты настройки сети из пакета net-tools, которые включали в себя такие команды, как ifconfig -для управления сетевыми интерфейсами, route - управление таблицей маршрутизации, arp - управление таблицей разрешения имен, netstat - сетевая статистика, mii-tool - статус сетевых устройств и др. В дистрибутивах, использующих современные ядра внедряется пакет iproute2 (иногда называется iproute) и net-tools оставлен,
как некоторые утверждают,
для совместимости. В пакет iproute входят 3 основных утилиты: ip - команда для просмотра параметров и настройки сетевых интерфейсов, IP-адресов, таблиц маршрутизации, правил маршрутизации, таблиц ARP преобразования, IP-туннелей и т.д. tc (traffic control) - команда для просмотра и настройки параметров управления трафиком (классификация трафика, дисциплины управления очереди для различных классов трафика), ss - команда для просмотра текущих соединений и открытых портов (аналог netstat).
как некоторые утверждают,
для совместимости. В пакет iproute входят 3 основных утилиты: ip - команда для просмотра параметров и настройки сетевых интерфейсов, IP-адресов, таблиц маршрутизации, правил маршрутизации, таблиц ARP преобразования, IP-туннелей и т.д. tc (traffic control) - команда для просмотра и настройки параметров управления трафиком (классификация трафика, дисциплины управления очереди для различных классов трафика), ss - команда для просмотра текущих соединений и открытых портов (аналог netstat).
Управление сетевыми интерфейсами в Linux
Сетевые интерфейсы в линух представляют собой физические устройства, которые взаимодействуют с ядром, а деле и с пользователем через соответствующий драйвер (например Ethernet-драйвера именуют интерфейсы как eth0, eth1 ...). Чтобы сетевой интерфейс функционировал, на нем нужно задать настройки какого-либо протокола сетевого уровня (IP, IPX или др.). В современных сетях используется протокол IP. Для управления сетью используется команда ip. Давайте рассмотрим общие параметры команды ip,данные параметры отлично иллюстрирует википедия:
Настройка параметров сетевых интерфейсов
Давайте разберем некоторые аспекты данных команд. Начнем с аналога команды ifconfig - команда ip с параметром link управляет свойствами сетевого интерфейса:
[proxy ~]# ip link show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000 link/ether 00:1d:72:01:ab:93 brd ff:ff:ff:ff:ff:ff 3: irda0: <NOARP> mtu 2048 qdisc noop state DOWN qlen 8 link/irda 00:00:00:00 brd ff:ff:ff:ff 4: vboxnet0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000 link/ether 0a:00:27:00:00:00 brd ff:ff:ff:ff:ff:ff 5: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1400 qdisc pfifo_fast state UNKNOWN qlen 3 link/ppp
Вывод данной команды содержит пронумерованный список интерфейсов, присутствующих в системе. Информация об интерфейсе содержит две строки: в первой указывается имя интерфейса (lo, eth0 и др.), установленные флаги состояния (в фигурных скобках < и >), MTU (Maximum Transmission Unit, максимально допустимый размер фрейма в байтах), тип и размер очереди фреймов; во второй строке — тип соединения, MAC-адрес, широковещательный адрес и т. п.
Некоторые флаги состояния:
- UP — устройство подключено и готово принимать и отправлять фреймы;
- LOOPBACK — интерфейс является локальным и не может взаимодействовать с другими узлами в сети;
- BROADCAST - устройство способно отправлять широковещательные фреймы;
- POINTTOPOINT — соединение типа "точка-точка"
- PROMISC — устройство находится в режиме "прослушивания" и принимает все фреймы.
- NOARP — отключена поддержка разрешения имен сетевого уровня.
- ALLMULTI — устройство принимает все групповые пакеты.
- NO-CARRIER — нет связи (не подключен кабель).
- DOWN — устройство отключено.
Можно также вывести информацию о выбранном интерфейсе, задав его имя в параметре dev:
[proxy ~]# ip link show dev eth0
или просто:
[proxy ~]# ip link show eth0
Команда ip link также позволяет изменять свойства сетевого интерфейса. Для этого используется параметр set:
iproute:~# ip link show dev eth2 3: eth2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000 link/ether 08:00:27:c9:00:f0 brd ff:ff:ff:ff:ff:ff iproute:~# # установка значения MTU iproute:~# ip link set mtu 1400 eth2 iproute:~# # установка MAC адреса iproute:~# ip link set address 00:11:11:12:FE:09 eth2 iproute:~# # "поднятие" интерфейса iproute:~# ip link set up eth2 iproute:~# ip link show dev eth2 3: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc pfifo_fast state UP qlen 1000 link/ether 00:11:11:12:fe:09 brd ff:ff:ff:ff:ff:ff iproute:~# # отключение интерфейса iproute:~# ip link set down eth2 iproute:~# ip link show dev eth2 3: eth2: <BROADCAST,MULTICAST> mtu 1400 qdisc pfifo_fast state DOWN qlen 1000 link/ether 00:11:11:12:fe:09 brd ff:ff:ff:ff:ff:ff
Указанные тут команды являются аналогами "классических" команд из пакета net-tools:
# ifconfig eth2 mtu 1400 # ifconfig eth2 hw ether 00:11:12:13:14:15 # ifconfig eth2 up # ifconfig eth2 down
Управление физическими параметрами интерфейса
Физические параметры (скорость, технология Ethernet, тип дуплекса) сетевого подключения зависят от используемого оборудования и обычно настраиваются автоматически при подключении компьютера к сети. Но иногда из- за несогласованной работы оборудования и драйверов адаптера параметры необходимо выставить вручную, используя утилиту ethtool. Данная утилита включена в стандартные репозитории Debian и устанавливается из пакетного менеджера. Пример использования утилиты:
iproute:~# ethtool eth2 Settings for eth2: Supported ports: [ TP ] Supported link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Supports auto-negotiation: Yes Advertised link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Advertised pause frame use: No Advertised auto-negotiation: Yes Speed: 1000Mb/s Duplex: Full Port: Twisted Pair PHYAD: 0 Transceiver: internal Auto-negotiation: on MDI-X: Unknown Supports Wake-on: umbg Wake-on: d Current message level: 0x00000007 (7) Link detected: no iproute:~# ethtool -i eth2 driver: e1000 version: 7.3.21-k5-NAPI firmware-version: N/A bus-info: 0000:00:08.0
Настройка параметров сетевых протоколов на физическом интерфейсе
Напомню, что протокол IP является маршрутизируемым протоколом без установления соединения. IP адрес представляет собой комбинацию номера сети и номера узла в данной сети. Количество бит, используемых для номера сети определяется по классу адреса или задается маской подсети. Итого, как я уже говорил, чтобы сетевой интерфейс начал функционировать в соответствии со своим прямым назначением, необходимо на нем задать параметры соответствующего сетевого протокола. Для протокола IP минимально необходимые параметры - это IP адрес и маска подсети. Для настройки параметров протокола IP на сетевом интерфейсе с помощью командной строки необходимо использовать команду ip address (она же ip addr).
user@nout:~$ ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000 link/ether 90:e6:ba:2f:c1:d4 brd ff:ff:ff:ff:ff:ff 3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000 link/ether 00:25:d3:3f:3e:87 brd ff:ff:ff:ff:ff:ff inet 192.168.1.148/24 brd 192.168.1.255 scope global wlan0 inet6 fe80::225:d3ff:fe3f:3e87/64 scope link valid_lft forever preferred_lft forever
Параметр show отображает текущую конфигурацию. Каждая запись о сетевом адресе может содержать информацию о типе адреса (inet — адрес IPv4, inet6 — IPv6 и т. д.), непосредственно адрес, маску подсети (количество сетевых бит), широковещательный адрес данной сети, область видимости (scope global — действителен везде, scope link — только для данного устройства, scope host — для данного узла, доступные области приведены в /etc/iproute2/rt_scopes) и имя логического интерфейса.
user@nout:~$ # добавление адреса выполняется параметром add user@nout:~$ # при этом необходимо задать широковещательный адреc user@nout:~$ # (параметр brd + задает автоматический рассчет широковещательного адреса) user@nout:~$ # данная операция требует прав суперпользователя user@nout:~$ ip address add 192.168.1.3/25 brd + dev eth0 RTNETLINK answers: Operation not permitted user@nout:~$ sudo -s [sudo] password for user: nout:~# ip address add 192.168.1.3/25 brd + dev eth0 nout:~# ip address show dev eth0 2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000 link/ether 90:e6:ba:2f:c1:d4 brd ff:ff:ff:ff:ff:ff inet 192.168.1.3/25 brd 192.168.1.127 scope global eth0 nout:~# # удаление адреса производится параметром del nout:~# ip address del 192.168.1.3/25 dev eth0 nout:~# ip address show dev eth0 2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000 link/ether 90:e6:ba:2f:c1:d4 brd ff:ff:ff:ff:ff:ff
C помощью ip можно задать несколько IP адресов на одном интерфейсе:
nout:~# ip address add 192.168.1.11/25 brd + dev eth0 nout:~# ip address add 192.168.1.12/25 brd + dev eth0 nout:~# ip address show dev eth0 2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000 link/ether 90:e6:ba:2f:c1:d4 brd ff:ff:ff:ff:ff:ff inet 192.168.1.11/25 brd 192.168.1.127 scope global eth0 inet 192.168.1.12/25 brd 192.168.1.127 scope global secondary eth0 nout:~# ip address del 192.168.1.11/25 dev eth0 nout:~# ip address show dev eth0 2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000 link/ether 90:e6:ba:2f:c1:d4 brd ff:ff:ff:ff:ff:ff nout:~# ip address add 192.168.1.12/25 brd + dev eth0 nout:~# ip address add 192.168.1.212/25 brd + dev eth0 nout:~# ip address show dev eth0 2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000 link/ether 90:e6:ba:2f:c1:d4 brd ff:ff:ff:ff:ff:ff inet 192.168.1.12/25 brd 192.168.1.127 scope global eth0 inet 192.168.1.212/25 brd 192.168.1.255 scope global eth0
При добавлении адреса из той же сети, что и существующий, новый адрес становится дополнительным к существующему (secondary), и если удалить основной адрес, то будет удален и дополнительный. При этом, команда ifconfig не умеет отображать второй Ip:
nout:~# ifconfig eth0 eth0 Link encap:Ethernet HWaddr 90:e6:ba:2f:c1:d4 inet addr:192.168.1.12 Bcast:192.168.1.127 Mask:255.255.255.128 UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:1 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) Interrupt:43
Возможно создать ifconfig - совместимую реализацию способа использования нескольких IP-адресов на одном сетевом интерфейсе. Для этого следует в команде ip addr add использовать параметр label:
nout:~# ip address add 192.168.12.212/25 brd + dev eth0 label eth0:newdev nout:~# ifconfig eth0 Link encap:Ethernet HWaddr 90:e6:ba:2f:c1:d4 inet addr:192.168.1.12 Bcast:192.168.1.127 Mask:255.255.255.128 UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:1 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) Interrupt:43 eth0:newdev Link encap:Ethernet HWaddr 90:e6:ba:2f:c1:d4 inet addr:192.168.12.212 Bcast:192.168.12.255 Mask:255.255.255.128 UP BROADCAST MULTICAST MTU:1500 Metric:1 Interrupt:43
nout:~# ip address show dev eth0 2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000 link/ether 90:e6:ba:2f:c1:d4 brd ff:ff:ff:ff:ff:ff inet 192.168.1.12/25 brd 192.168.1.127 scope global eth0 inet 192.168.1.212/25 brd 192.168.1.255 scope global eth0 inet 192.168.12.212/25 brd 192.168.12.255 scope global eth0:newdev nout:~# ip address flush dev eth0 nout:~# ip address show dev eth0 2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000 link/ether 90:e6:ba:2f:c1:d4 brd ff:ff:ff:ff:ff:ff
Как видно, параметр flush очищает все установленные на интерфейсе IP адреса.
Управление ARP-таблицей
В локальной сети текущий хост для определения физических адресов (MAC-адресов) по IP-адресам удаленных узлов используетпротокол ARP и локальный ARP -кэш (ARP-таблицу). Управление ARP-таблицей осуществляется командой ip neigh. Каждый узел локальной сети (в том числе и хабы/свичи) содержат свою локальную ARP-таблицу (кэш), которая устанавливает соответствие между IP и MAC-адресами узлов подсетей, в которые входит данную сеть. В ARP-таблице имеются два вида записей:
- Динамические записи, которые периодически обновляются с использованием протокола ARP (если запись "устаревает", то она удаляется).
- Статические записи, которые создаются пользователем с помощью соответствующих команд и существуют до тех пор, пока текущий узел не будет выключен/перезагружен.
nout:~# # отображение содержимого таблицы ARP nout:~# ip neigh show 192.168.1.1 dev wlan0 lladdr bc:ae:c5:c3:c9:31 REACHABLE nout:~# # добавление статической записи в ARP таблицу nout:~# ip neigh add 192.168.1.100 lladdr 00:00:00:11:00:22 dev wlan0 nout:~# ip neigh show 192.168.1.100 dev wlan0 lladdr 00:00:00:11:00:22 PERMANENT 192.168.1.1 dev wlan0 lladdr bc:ae:c5:c3:c9:31 REACHABLE nout:~# # удаление записи nout:~# ip neigh del 192.168.1.100 dev wlan0 nout:~# ip neigh show 192.168.1.1 dev wlan0 lladdr bc:ae:c5:c3:c9:31 REACHABLE
Управление маршрутизацией с помощью iproute2
Из статьи Основные понятия сетей мы знаем, что если текущему узлу необходимо куда-либо отправить IP пакет, то сетевая подсистема ядра использует таблицу маршрутизации. Если пакет отправляется в ту же подсеть, которой принадлежит хост, то с помощью ARP определяется физический адрес хоста назначения и пакет отправляется напрямую хосту назначения. Если адрес назначения принадлежит не "локальной сети", то пакет отправляется на шлюз (читай - направляется по маршруту), который указан в таблице маршрутизации для сети, которой принадлежит хост назначения. При этом, выбирается та сеть, в которой адрес сети наиболее заполнен (читай - меньше хостов в подсети). Если для хоста назначения не найден маршрут, то пакет отправляется на "шлюз по умолчанию". Все шлюзы должны находиться в той же подсети, что и исходный хост.
Допустим, в локальной сети есть некоторый хост с адресом 192.168.1.100/24, а так же есть хост 192.168.1.1, который является шлюзом в глобальную сеть, а так же есть хост с адресом 192.168.1.2, который является связующим маршрутизатором с сетью 192.168.24.0/24. Для того, чтобы хост с адресом 192.168.1.100/24 имел доступ в сеть Интернет и к локальной сети 192.168.24.0/24, необходимо внести в таблицу маршрутизации соответствующие записи, например с помощью команды ip route add:
# ip route add default via 192.168.1.1 # ip route add 192.168.24.0/24 via 192.168.1.2 # ip route show 192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.100 192.168.24.0/24 via 192.168.1.2 dev eth1 default via 192.168.1.1 dev eth
Первая команда добавляет маршрут по умолчанию (default) через узел 192.168.1.1 (параметр via ). Вторая команда устанавливаетмаршрут на сеть 192.168.24.0/24 через узел 192.168.1.2.
Для вывода на экран содержимого таблицы маршрутизации используется команда ip route show. В данном случае в таблице маршрутизации три записи: первая о том, что сеть 192.168.1.0/24 доступна непосредственно на интерфейсе eth1 (запись добавляется автоматически), и две записи, добавленные пользователем: альтернативный маршрут и маршрут по умолчанию.
Добавление постоянного статического маршрута при инициализации сети
О настройке сети через конфигурационные файлы я рассказывал в статье Настройка сети в Linux, диагностика и мониторинг, в сегодняшней статье я немного дополню эту информацию. С помощью файла /etc/network/interfaces есть возможность задать постоянные маршрута при поднятии интерфейса и удаление маршрута при выключении интерфейса. Это делается с помощью параметра up и down соответственно. Нижеприведенная конфигурация позволяет задать маршрут до сети 192.168.100.0/24 через шлюз 192.168.1.1:
iface eth1 inet static address 192.168.1.100 netmask 255.255.255.0 up ip route add 192.168.100.0/24 via 192.168.1.1 down ip route del 192.168.100.0/24 gateway 192.168.1.3
Выводы
На этом, данную заметку заканчиваю. Подведу краткие итоги. Для управления физическими интерфейсами применяется команда ip link из пакета iproute. Для настройки свойств физического подключения (скорость, технология, тип дуплекса используется команда ethtool. Для того, чтобы хост мог взаимодействовать с другими узлами подсети в рамках локального сегмента (широковещательного домена) на нем должен быть установлен IP-адрес и определена маска подсети. Для управления IP-адресами в Linux можно использовать команду ip addr. В локальной сети данный узел для определения физических адресов(MAC) по IP - адресам других узлов использует протокол ARP и локальный ARP -кэш (таблица). Управление ARP -таблицей осуществляется командой ip neigh. Для взаимодействия с удаленными подсетями на данном узле необходимо определить шлюз по умолчанию или/и альтернативные шлюзы. Все шлюзы должны находиться в той же подсети, что и исходный узел. Управление таблицей маршрутизации на узле может осуществляться командой ip route. У параметров команд пакета iproute2 есть сокращенный синтаксис, например, ip link show eth0 можно записать как ip l sh eth0.
Что почитать