Печать
Категория: Linux
Просмотров: 11238

оригинал тут http://www.k-max.name/linux/nastrojka-i-upravlenie-setevoj-podsistemoj-linux-paket-iproute2/

 

Доброго времени, уважаемые гости и читатели Блога любителя экспериментов. Сегодня хочу затронуть такой вопрос, как управление сетевой подсистемой Linux с помощью программ из пакета iproute2. Для понимания того, о чем здесь пойдет речь обязательно необходимо ознакомиться со статьями Основные понятия сетей и Настройка сети в Linux, диагностика и мониторинг. Начну с небольшой предыстории...

 

 

 


Думаю, очень к месту будет напомнить о модели 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).

 

 

 

Управление сетевыми интерфейсами в 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-адрес, широковещательный адрес и т. п.

 

 

 

Некоторые флаги состояния:

 

 

 

 

 

 

Можно также вывести информацию о выбранном интерфейсе, задав его имя в параметре 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-таблице имеются два вида записей:

 

 

 

 

 

 

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.