iproute2 vs. legacy tools для управления сетевым стеком

Thanks: 143
Say if this page is useful for you
Author: Sergey Popov (aka azure)
Published on 2009.07.23
Last modified on 2010.10.08
  1. Введение
  2. ifconfig
  3. route
  4. Заключение

Введение

Статья для системных администраторов старой закалки, которая поможет отказаться от legacy программ для работы с сетевым стеком в пользу пакета iproute2.

ifconfig

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

# ifconfig 
eth0      Link encap:Ethernet  HWaddr 00:16:17:6D:13:D9  
          inet addr:192.168.0.3  Bcast:192.168.0.15  Mask:255.255.255.240 
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1 
          RX packets:110724 errors:0 dropped:0 overruns:0 frame:0 
          TX packets:107049 errors:0 dropped:0 overruns:0 carrier:0 
          collisions:0 txqueuelen:1000 
          RX bytes:74654813 (71.1 Mb)  TX bytes:40685040 (38.8 Mb) 
          Interrupt:29 Base address:0x8000 

eth1      Link encap:Ethernet  HWaddr 00:11:22:33:44:55  
          inet addr:193.30.243.210  Bcast:193.30.243.223  Mask:255.255.255.240 
          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:0 
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b) 
          Interrupt:30 Base address:0xc000 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0 
          UP LOOPBACK RUNNING  MTU:16436  Metric:1 
          RX packets:65486 errors:0 dropped:0 overruns:0 frame:0 
          TX packets:65486 errors:0 dropped:0 overruns:0 carrier:0 
          collisions:0 txqueuelen:0 
          RX bytes:25657290 (24.4 Mb)  TX bytes:25657290 (24.4 Mb)

Для получения тех же данных можно и нужно использовать программу ip. Вообще говоря, ip — программа охватывающая многие аспекты сетевого стека. Вызванная без параметров она выведет краткую инструкцию по использованию:

# ip 
Usage: ip [ OPTIONS ] OBJECT { COMMAND | help } 
       ip [ -force ] [-batch filename 
where  OBJECT := { link | addr | route | rule | neigh | ntable | tunnel | 
                   maddr | mroute | monitor | xfrm } 
       OPTIONS := { -V[ersion] | -s[tatistics] | -r[esolve] | 
                    -f[amily] { inet | inet6 | ipx | dnet | link } | 
                    -o[neline] | -t[imestamp] } 

В отсутствии особых опций, первым параметром для программы ip является режим работы. Т.е. Программа ip требует, чтобы был указан объект, с которым будут проводиться манипуляции. Для работы с адресами устройств используется режим address.

# ip address 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 
    inet 127.0.0.1/8 scope host lo 
2: teql0: <NOARP> mtu 1500 qdisc noop qlen 100 
    link/void 
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000 
    link/ether 00:16:17:6d:13:d9 brd ff:ff:ff:ff:ff:ff 
    inet 192.168.0.3/28 brd 192.168.0.15 scope global eth0 
4: eth1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000 
    link/ether 00:11:22:33:44:55 brd ff:ff:ff:ff:ff:ff 
    inet 193.30.243.210/28 brd 193.30.243.223 scope global eth1 

Вместо ip address можно также писать ip addr, ip add, ip ad и даже ip a. В каждодневной работе я пользуюсь однобуквенными сокращениями (ip a), это очень удобно! Жаль, что эта фича недокументирована, и многие о ней просто не знают. В выводе ip a видны все существующие интерфейсы, их основные характеристики: обладают ли способностью отправлять броадкасты (BROADCAST), мультикасты (MULTICAST), поднят ли интерфейс (UP), и не отключен ли кабель (NO-CARRIER). Также отображаются hardware-адреса (link/ether 00:16:17:6d:13:d9) и ip-адреса с CIDR-масками (inet 192.168.0.3/28).

«А где же статистика по интерфейсу?», грозно спросит бывалый сисадмин. А я отвечу, что можно и статистику пакетов глянуть. Но не в режиме управления адресами. А в режиме управления линком. Попробуем глянуть, что может ip link.

# ip link 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 
2: teql0: <NOARP> mtu 1500 qdisc noop qlen 100 
    link/void 
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000 
    link/ether 00:16:17:6d:13:d9 brd ff:ff:ff:ff:ff:ff 
4: eth1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000 
    link/ether 00:11:22:33:44:55 brd ff:ff:ff:ff:ff:ff

По умолчанию ip link выводит характеристики интерфейсов применительно к канальному уровню. Введя ip link help увидим краткую справку по работе в этом режиме:

# ip link help 
Usage: ip link set DEVICE { up | down | 
	                     arp { on | off } | 
	                     dynamic { on | off } | 
	                     multicast { on | off } | 
	                     allmulticast { on | off } | 
	                     promisc { on | off } | 
	                     trailers { on | off } | 
	                     txqueuelen PACKETS | 
	                     name NEWNAME | 
	                     address LLADDR | broadcast LLADDR | 
	                     mtu MTU } 
       ip link show [ DEVICE ] 

Как и с address, могут быть использованы сокращения: ip lin, ip li и, наконец, ip l. Самую короткую запись я и рекомендую использовать. Без указания параметров работы программы ip в режиме link, будет выведена вся информация по всем интерфейсам. Как видно, здесь же можно установить различные параметры интерфейса: поднять (up) или опустить (down), переименовать, назначить новый hardware-адрес и т.п.

«Ну так и где же статистика по пакетам?» - напоминает мне бывалый сисадмин. Глянем на короткую справку по программе ip, увидим опцию -s[tatistics] и вставим её перед указанием режима работы. И вот она!

# ip -s link show dev eth0 
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000 
    link/ether 00:16:17:6d:13:d9 brd ff:ff:ff:ff:ff:ff 
    RX: bytes  packets  errors  dropped overrun mcast   
    132191201  200050   0       0       0       0      
    TX: bytes  packets  errors  dropped carrier collsns 
    84500703   193790   0       0       0       0      

Как и многое в программе ip, команда show может быть укорочена до одной буквы s. Это тоже всё, к сожалению, не документировано. В более короткой форме, команда выглядела бы так: ip -s l s dev eth0. Или по-русски: программа ip, статистику (-s) для линка (l) покажи-ка (s), причем только для устройства (dev) eth0.

А вот так мы можем выключить интерфейс:

# ip l set dev eth1 down

А вот так мы можем переименовать интерфейс (для переименовывания интерфейс должен быть выключен (down)):

# ip l set dev eth1 name br4 

А вот так мы можем поменять mac-адрес нашей сетевой карты:

# ip l set dev br4 address 00:12:34:56:78:9a

Вместо слова address можно опять таки писать только первую букву. Вернемся теперь к ip-адресам. Добавить ip-адрес к интерфейсу очень просто:

# ip a add 192.168.0.2/24 dev eth0

Очень наглядная и понятная запись: добавить адрес 192.168.0.2 с CIDR-маской /24 на устройство eth0. При этом автоматически создается локальный route.

# ip a show dev eth0
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:16:17:6d:13:d9 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.3/28 brd 192.168.0.15 scope global eth0
    inet 192.168.0.2/24 scope global eth0

Теперь у меня два адреса на сетевой карте. Удалим вновь созданный:

# ip a del 192.168.0.2/24 dev eth0

Очистить весь интерфейс от адресов тоже просто:

# ip a flush dev eth0

route

Перейдем к таблицам маршрутизации. Всем известна программа route. По умолчанию она выводит текущую таблицу маршрутизации ядра. Как правило используется с ключем -n который отключает разрешение имён для ускорения вывода.

# route -n 
Kernel IP routing table 
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface 
192.168.0.0     0.0.0.0         255.255.255.240 U     0      0        0 eth0 
193.30.243.208  0.0.0.0         255.255.255.240 U     0      0        0 eth1 
10.0.0.0        193.30.243.209  255.0.0.0       UG    4      0        0 eth1 
127.0.0.0       127.0.0.1       255.0.0.0       UG    0      0        0 lo 
0.0.0.0         192.168.0.1     0.0.0.0         UG    3      0        0 eth0

Для работы с таблицами маршрутизации программа ip имеет режим работы route:

# ip route 
192.168.0.0/28 dev eth0  proto kernel  scope link  src 192.168.0.3 
193.30.243.208/28 dev eth1  proto kernel  scope link  src 193.30.243.210 
10.0.0.0/8 via 193.30.243.209 dev eth1  metric 4 
127.0.0.0/8 via 127.0.0.1 dev lo 
default via 192.168.0.1 dev eth0  metric 3

В выводе ip r[oute] видна вся таже информация, что и в выводе route -n. Как по-мне, то в более удобном для понимания виде. Возможно использование короткого названия режима: ip r. Вспомним, как же мы добавляли маршруты с помощью утилиты route: (в квадратных скобках опциональные параметры)

# route add -net 192.168.10.0 netmask 255.255.255.0 gw 192.168.0.1 metric 3 [dev eth0]
К сети 192.168.10.0/24 ходить через шлюз 192.168.0.1 (через устройство eth0) и назначить этому маршруту метрику 3. Теперь гляньте, как это делается с помощью ip r:
# ip route add 192.168.10.0/24 via 192.168.0.1 [dev eth0] metric 3
Либо в короткой форме:
# ip r a 192.168.10.0/24 via 192.168.0.1 m 3
Кроме того, ip r позволяет определить маршрут, по которому пойдет пакет.
# ip r get 194.87.0.50
194.87.0.50 via 192.168.0.1 dev eth0  src 192.168.0.3 
    cache  mtu 1500 advmss 1460 hoplimit 64

Также можно указать значение полей TOS, исходящий адрес и другие параметры, чтобы увидеть маршрут, по которому пойдет реальный пакет. Это очень полезно при настройке routing policy — когда решение о маршруте принимается не только исходя из адреса назначения.

Заключение

Эта статья, конечно, не претендует на полноту изложения, и некороые аспекты здесь вовсе не затронуты (например, туннели). Целью было лишь показать простоту и мощь пакета утилит iproute2 и помочь системным администраторам отказаться от legacy утилит для управления сетевым стеком в пользу более совершенных инструментов.

Comments:

FireaL: Полезная статья :) С маршрутизацией знаком слегка через legacy-утилиты, думаю углубиться в вопрос и подробней освоить iproute2.
Сергей: Спасибо, крайне познавательно! Так обрадовался, когда смог прицепить к себе несколько IP адресов))
Аноним: Полезно.
Сергей: автору спасибо! полезно к прочтению, особенно новичкам
athlon128: Мега круто. Спасибо.
Алексей: дело хорошее.спасибо
deepman: Отлично! Спасибо!
Yumaly: Спасибо! Освоить новое всегда полезно.
Herinerse: Спасибо, полезный материал. Добавил ваш блог в закладки.
cooldvodeRep: Лучше не бывает, поверьте мне ;) секреты форекса
ext2 windows: Ой, читай, прям обчитаешься! спасибо за интересную статью
Draibebique: статья super, автору респект
Alex86: Как по мне, то iproute2 намного удобнее и проще. Спасибо, отличная статья!
Cicely Heys : Автору нужно памятник постаить за такое!:) Прикольный сайт! Все умно сделано.
Asvtnde: Hack again?!
mylove: Хорошо! Все бы так писали :)
Аноним: В целом конечно очень даже неплохо. Но: "...В выводе ip r[oute] видна вся таже информация, что и в выводе route -n. Как по-мне, то в более удобном для понимания виде..." Я, конечно, понимаю, что там больше слов, а не символов с циферками. Наверное вы робот, раз информация без табуляций воспринимается легче.
alphacool: Отлично...автору спасибо.
ЧИМ: Грамотно расжовано! Спасибо за статью и стиль написания!

Nickname:
Creative Commons License This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License