iproute2 vs. legacy tools для управления сетевым стеком
Введение
Статья для системных администраторов старой закалки, которая поможет отказаться от 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 утилит для управления сетевым стеком в пользу более совершенных инструментов.
This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License
Comments: