LinuxForum.Fans
Тема

Управление сетевыми настройками (iproute2)

Автор: forkostya 1 сообщений 13792 просмотров
#1432

Автор: Кузнецов Константин

Управление сетевыми настройками (iproute2)

План:
1. Введение
2. Состав утилиты iproute2, коротко об ss
3. Управление сетевыми настройками - ip
3.1 ip link - сетевые интерфейсы
3.2 ip addr - ip-адреса
3.3 ip neigh - arp-данные
3.4 ip rule - таблицы маршрутизации
3.5 ip route - маршруты
4. Используемая и рекомендуемая литература

---------------------------------------------------------------------------------

1. Введение

Вместо предисловия
http://linuxforum.etersoft.ru/index.php?showtopic=9185&start=0&p=97550&#entry97550

"sash-kan" написал:
подвесить энное кол-во ip-адресов на один интерфейс при помощи ip не просто, а очень просто.
и все они так и будут называться eth0. потому как мухи отдельно, котлеты отдельно. то бишь, в терминах iproute - link'и отдельно, addr'есы отдельно.
выполни, например, такую последовательность команд, и тебе станет понятно, о чем речь:
text
ip a
ip l
ip a a 10.0.0.1/24 dev eth0 # добавить ip-адрес к интерфейсу
ip a
ip l
ip a d 10.0.0.1/24 dev eth0 # удалить его
ip a
ip l
ip r add default via 192.168.0.100 dev eth0

Я не случайно привел этот пример кода. Именно наткнувшись на него, я решил "обновить" свои знания о настройке сетей в Linux, тем более, что, насколько мне уже известно, реализация сложной маршрутизации на шлюзах, которой я собираюсь заниматься в будущем, без iproute2 практически не возможна.
На момент написания этих строк я не имел ни теоретического понимания, ни практики работы с iproute2, так что разбираться буду по ходу написания статьи вместе с вами.
Разбираться и описывать понятое я буду опираясь на материалы, найденные в Интернете (см. список используемой литературы)
Итак, что же такого можно делать с помощью iproute2 и почему желательно отказаться от утилит ifconfig, netstat, arp и route в его пользу?

---------------------------------------------------------------------------------

2. Состав утилиты iproute2, коротко об ss

В состав утилиты iproute2 входят 3 компонента: ip, tc и ss
ip — утилита для просмотра параметров и конфигурирования сетевых интерфейсов, сетевых адресов, таблиц маршрутизации, правил маршрутизации, arp‐таблиц, IP‐туннелей, адресов multicast рассылки, маршрутизацией multicast пакетов.
tc — утилита для просмотра и конфигурирования параметров управления трафиком (tc — аббревиатура от traffic control). В данной статье не рассматривается
ss — утилита для просмотра текущих соединений и открытых портов. Аналог традиционной утилиты netstat.

Начнем с самого простого - ss.

text
ss --help
Usage: ss [ OPTIONS ]
       ss [ OPTIONS ] [ FILTER ]
   -h, --help           this message
   -V, --version        output version information
   -n, --numeric        don't resolve service names
   -r, --resolve       resolve host names
   -a, --all            display all sockets
   -l, --listening      display listening sockets
   -o, --options       show timer information
   -e, --extended      show detailed socket information
   -m, --memory        show socket memory usage
   -p, --processes      show process using socket
   -i, --info           show internal TCP information
   -s, --summary        show socket usage summary

-4, --ipv4 display only IP version 4 sockets -6, --ipv6 display only IP version 6 sockets -0, --packet display PACKET sockets -t, --tcp display only TCP sockets -u, --udp display only UDP sockets -d, --dccp display only DCCP sockets -w, --raw display only RAW sockets -x, --unix display only Unix domain sockets -f, --family=FAMILY display sockets of type FAMILY

-A, --query=QUERY QUERY := {all|inet|tcp|udp|raw|unix|packet|netlink}[,QUERY]

-F, --filter=FILE read filter information from FILE FILTER := [ state TCP-STATE ] [ EXPRESSION ]

Сравнив с выводом

text
netstat --help

сразу становится ясно, что разницы большой нет. Я обычно использую команду netstat -pnat для отображения необходимой мне информации. Используя же ss -pnat можно получить аналогичный, но для меня менее удобный вывод. Таким образом я делаю для себя вывод - ss не для меня.

-------------------------------------------------------------------------------------------------

3. Управление сетевыми настройками - ip

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

Как видно из вывода, мы можем работать с различными объектами, как то: link, addr, addrlabel, route, rule, neigh, ntable, tunnel, maddr, mroute, monitor, xfrm.

Мы рассмотрим только 5 из них:
link - сетевые интерфейсы
addr - ip-адреса
rule - таблицы маршрутизации
route - маршрутизация
neigh - arp-данные (МАС-адреса соседей по подсети)

Вместо полного имени объекта можно указывать только первые буквы, если это не вызывает неоднозначность.
Можно указать команду help, для вывода подсказки. (Если не указывать объект, но указать команду help, то выводится справка о программе).
Если указать объект без команды, то выполняется команда show — распечатывается список объектов указанного типа.

-------------------------------------------------------------------------------------------------

3.1 ip link - сетевые интерфейсы
Посмотрим справку

text
# 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 }
                             netns PID }
       ip link show [ DEVICE ]

ip link поддерживает 2 режима: set и show, использующийся по-умолчанию. С помощью set мы можем устанавливать значения (up - включение/выключение, mtu - максимальный размер блока в байтах, addres - MAC-адрес, name - имя, и прочее) для сетевого интерфейса DEVICE (eth0, lo, ppp0, tun1 и пр.)
С помощью ключа -s можно посмотреть статистику (tx,rx и прочее)

Примеры:

Меняем МАС-адрес

text
# ifconfig eth0 hw ether 00:12:34:56:78:9a
text
# ip link set dev eth0 address 00:12:34:56:78:9a

Меняем Имя сетевого интерфейса

text
не нашел
text
# ip link set dev pan1 name pan0

Меняем MTU

text
# ifconfig eth0 mtu 1480
text
# ip link set dev eth0 mtu 1480

P.S. Наличие слова "dev" обязательно, не смотря на то, что в "ip link set DEVICE" "dev" не указан.

Вывод сведений о сетевых интерфейсах

text
# ip link show
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

Вывод статистики по сетевому интерфейсу

text
# ip -s l sh dev eth0
3: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 00:e0:4c:77:21:cc brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped overrun mcast
    2819610953 4120250  0       0       0       0
    TX: bytes  packets  errors  dropped carrier collsns
    1040941169 4235186  0       0       0       0

Мной проверено - данные совпадают с ifconfig :)

Обратите внимание на флаги, указанные в "< ... >" скобках. Примечательно то, что NO-CARRIER означает отсутствие сетевого кабеля (или он идет в никуда, в неработающее устройство), UP - сетевое устройство используется (включено), DOWN - выключено и т.д.

-------------------------------------------------------------------------------------------------

3.2 ip addr - ip-адреса

text
# ip a help
Usage: ip addr {add|change|replace} IFADDR dev STRING [ LIFETIME ]
                                                      [ CONFFLAG-LIST]
       ip addr del IFADDR dev STRING
       ip addr {show|flush} [ dev STRING ] [ scope SCOPE-ID ]
                            [ to PREFIX ] [ FLAG-LIST ] [ label PATTERN ]
IFADDR := PREFIX | ADDR peer PREFIX
          [ broadcast ADDR ] [ anycast ADDR ]
          [ label STRING ] [ scope SCOPE-ID ]
SCOPE-ID := [ host | link | global | NUMBER ]
FLAG-LIST := [ FLAG-LIST ] FLAG
FLAG  := [ permanent | dynamic | secondary | primary |
           tentative | deprecated | CONFFLAG-LIST ]
CONFFLAG-LIST := [ CONFFLAG-LIST ] CONFFLAG
CONFFLAG  := [ home | nodad ]
LIFETIME := [ valid_lft LFT ] [ preferred_lft LFT ]
LFT := forever | SECONDS

ip addr может делать add, change, replace, del, show, flush.

В man change и replace не рассматриваются, видимо смысл итак понятен. flush использовать рекомендуется исключительно в том случае, если точно знаешь, что делаешь. Я так понял, он удаляет все адреса, привязанные к сетевому интерфейсу.

Остается add (добавить), del (удалить) и show (показать, используется по-умолчанию).

Примеры:

Добавить ip-адрес

text
# ifconfig eth0:1 192.168.1.1 netmask 255.255.255.0 up
text
# ip addr add 192.168.1.1/24 dev eth0

На интерфейсе eth0 добавится еще один адрес, который не будет виден ifconfig. Для того, чтобы он все-таки был виден, необходимо назначать label

text
ip ad ad 192.168.0.1/24 label eth0:1 dev eth0

При этом "eth0:" - обязательная часть label, т.е. нельзя написать <label 1> или <label yahoo>

Удалить ip-адрес

text
# ifconfig eth0:1 up
text
# ip addr del 192.168.1.1/24 dev eth0

Показать все ip-адреса

text
# 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)

text
# 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 

В данном примере использовано ifconfig, показывающее только "поднятые" (включенные) адреса/устройства. Если бы вы ввели ifconfig -a, то среди них появился бы teql0, который присутствует в выводе ip address, но не имеет ключа UP (выключен)

Показать все адреса на устройстве eth0

text
# ip addr show eth0

-------------------------------------------------------------------------------------------------

3.3 ip neigh - arp-данные

text
# ip neigh help
Usage: ip neigh { add | del | change | replace } { ADDR [ lladdr LLADDR ]
          [ nud { permanent | noarp | stale | reachable } ]
          | proxy ADDR } [ dev DEV ]
       ip neigh {show|flush} [ to PREFIX ] [ dev DEV ] [ nud STATE ]

Смотрим, add - добавить, del -удалить, change - изменить, replace - (переместить?), show - показать (по-умолчанию), flush - наверное, очистить.
Используем только show, add и del.

Примеры:

Вывод имеющихся данных

text
# arp -n
text
# ip ne show

Добавление соседа

text
# arp -s 192.168.0.99 00:19:c6:6b:b6:17 -i eth1
text
# ip neigh add to 192.168.0.99 lladdr 00:19:c6:6b:b6:17 dev eth1

Удаление соседа

text
# arp -d 192.168.0.99 -i eth1
text
# ip neigh del 192.168.0.99 dev eth1

-------------------------------------------------------------------------------------------------

3.4 ip rule - таблицы маршрутизации

text
$ ip ru help
Usage: ip rule [ list | add | del | flush ] SELECTOR ACTION
SELECTOR := [ not ] [ from PREFIX ] [ to PREFIX ] [ tos TOS ] [ fwmark FWMARK[/MASK] ]
            [ dev STRING ] [ pref NUMBER ] [ prio NUMBER ]
ACTION := [ table TABLE_ID ]
          [ prohibit | reject | unreachable ]
          [ realms [SRCREALM/]DSTREALM ]
          [ goto NUMBER ]
TABLE_ID := [ local | main | default | NUMBER ]

Когда ядру необходимо выбрать маршрут, оно определяет в соответствии с какой таблицей это нужно делать. По-умолчанию, определены три таблицы. Старая утилита route изменяет таблицы main и local, как и утилита ip (по-умолчанию).
Правила по-умолчанию:

text
$ ip rule list
0:    from all lookup local 
32766:    from all lookup main 
32767:    from all lookup default

В этом листинге приведены приоритеты всех правил. Мы видим, что правила применяются ко всем пакетам (from all). Мы уже видели таблицу 'main', она выводится командой ip route ls , но таблицы 'local' и 'default' для нас новые. Если мы хотим сделать что-то интересное, то нужно задать правила, использующие разные таблицы маршрутизации. Это позволит нам переопределить общесистемную таблицу маршрутизации. Таблицы маршрутизации хранятся в файле /etc/iproute2/rt_tables

text
$ cat /etc/iproute2/rt_tables

# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
Чтобы добавить еще одну таблицу достаточно просто внести в этот файл соответствующую запись
text
echo 252 newtable >> /etc/iproute2/rt_tables

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

text
$ ip rule add from 192.168.0.2 table newtable

или по маркировке, которую устанавливает iptables

text
$ ip rule add fwmark 80 table newtable

После чего мы можем назначить маршрутизацию данной таблицы. Например добавим маршрут по умолчанию (см. следующий раздел)

-------------------------------------------------------------------------------------------------

3.5 ip route - маршруты
Мы дошли, наконец, до маршрутизации - самого вкусного.

text
# ip ro help
Usage: ip route { list | flush } SELECTOR
       ip route get ADDRESS [ from ADDRESS iif STRING ]
                            [ oif STRING ]  [ tos TOS ]
       ip route { add | del | change | append | replace | monitor } ROUTE
SELECTOR := [ root PREFIX ] [ match PREFIX ] [ exact PREFIX ]
            [ table TABLE_ID ] [ proto RTPROTO ]
            [ type TYPE ] [ scope SCOPE ]
ROUTE := NODE_SPEC [ INFO_SPEC ]
NODE_SPEC := [ TYPE ] PREFIX [ tos TOS ]
             [ table TABLE_ID ] [ proto RTPROTO ]
             [ scope SCOPE ] [ metric METRIC ]
INFO_SPEC := NH OPTIONS FLAGS [ nexthop NH ]...
NH := [ via ADDRESS ] [ dev STRING ] [ weight NUMBER ] NHFLAGS
OPTIONS := FLAGS [ mtu NUMBER ] [ advmss NUMBER ]
           [ rtt TIME ] [ rttvar TIME ] [ window NUMBER]
           [ cwnd NUMBER ] [ hoplimit NUMBER ] [ initcwnd NUMBER ]
           [ ssthresh NUMBER ] [ realms REALM ] [ src ADDRESS ]
           [ rto_min TIME ]
TYPE := [ unicast | local | broadcast | multicast | throw |
          unreachable | prohibit | blackhole | nat ]
TABLE_ID := [ local | main | default | all | NUMBER ]
SCOPE := [ host | link | global | NUMBER ]
FLAGS := [ equalize ]
MP_ALGO := { rr | drr | random | wrandom }
NHFLAGS := [ onlink | pervasive ]
RTPROTO := [ kernel | boot | static | NUMBER ]
TIME := NUMBER[s|ms|us|ns|j]

Возможные действия: list (show), flush (очистить согласно заданному критерию, удалить все), get (получить конкретный маршрут до хоста), add (добавить маршрут), delete (удалить маршрут), change (изменить маршрут), replace (переместить, изменить, заменить или добавить маршрут)

Нас интересуют только show, get, add, delete и flush. Сразу хочу заметить, что в отличие от стандартной (устаревшей) утилиты route, iproute2 умеет добавлять маршруты (в том числе и по-умолчанию) для таблиц (об этом позже, когда рассмотрим ip rule).

Примеры:

Показать таблицу маршрутизации

text
# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
204.152.191.37  213.134.203.49  255.255.255.255 UGH   0      0        0 eth1
81.195.231.88   0.0.0.0         255.255.255.248 U     0      0        0 eth0
213.134.203.48  0.0.0.0         255.255.255.248 U     0      0        0 eth1
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
0.0.0.0         213.134.203.49  0.0.0.0         UG    0      0        0 eth1
text
# ip ro sh
204.152.191.37 via 213.134.203.49 dev eth1
81.195.231.88/29 dev eth0  proto kernel  scope link  src 81.195.231.90
213.134.203.48/29 dev eth1  proto kernel  scope link  src 213.134.203.50
192.168.0.0/24 dev eth1  proto kernel  scope link  src 192.168.0.1
169.254.0.0/16 dev eth0  scope link  metric 1000
default via 213.134.203.49 dev eth1

Получить конкретный маршрут до хоста

text
# ip ro get 85.141.9.19
85.141.9.19 via 213.134.203.49 dev eth1  src 213.134.203.50
cache  mtu 1500 advmss 1460 hoplimit 64

Добавить маршрут до хоста

text
# route add -host 85.141.9.18 gw 192.168.113.1
text
# ip ro a 85.141.9.18/32 via 192.168.113.1 dev eth0

Добавить маршрут до сети

text
# route add -net 85.141.9.16 netmask 255.255.255.240 gw 192.168.113.1
text
# ip ro add 85.141.9.16/28 dev eth0

Удалить маршрут

text
# route del -net 85.141.9.16 netmask 255.255.255.240
text
# ip ro del 85.141.9.16/28 dev eth0

Добавить маршрут по-умолчанию:

text
# route add default gw 192.168.0.1
text
# ip route add default via 192.168.0.1 dev eth0

Добавить маршрут по-умолчанию для таблицы

text
# ip route add default via 192.168.0.1 dev eth0 table eth0-out

Просмотреть маршрутизацию таблицы

text
# ip ro ls ta eth0-out

Можно использовать два шлюза как один большой канал! Для этого маршрут по умолчанию надо описать так:

text
ip route add default nexthop via шлюз1 nexthop via шлюз2

Сбросить кэш маршрутов

text
# ip route flush cache  

---------------------------------------------------------------------------------

4. Используемая и рекомендуемая литература

1. iproute2 на wikipedia

iproute2 — это набор утилит для управления параметрами сетевых устройств в ядре Linux. Эти утилиты были разработаны в качестве унифицированного интерфейса к ядру Linux, которое непосредственно управляет сетевым трафиком. iproute2 бессилен изменить параметры, если их не поддерживает ядро.
Общие слова о том, что за утилита, что в нее входит, кто написал, некоторые примеры.
Вывод: Стоит прочитать для общего развития.


2. Статья для системных администраторов старой закалки, которая поможет перейти на iproute2 с legacy-утилит
Эта статья, конечно, не претендует на полноту изложения, и некоторые аспекты здесь вовсе не затронуты (например, туннели). Целью было лишь показать простоту и мощь пакета утилит iproute2 и помочь системным администраторам отказаться от legacy утилит для управления сетевым стеком в пользу более совершенных инструментов.
На эту статью я возлагал большие надежды исходя из нё названия. Хорошо изложено, последовательно, но как только я вошел во вкус, статья, вдруг, закончилась.
Вывод: Читать обязательно, для затравки, но на этом не останавливаться - рассмотрено не все!


3. IPROUTE2 Utility Suite Documentation
This docvumentation covers the ip utility from IPROUTE2. This utility is written by Alexey N. Kuznetsov who also wrote the IPv6 and IPv4 routing code for Linux 2.2. This is the utility he uses for manipulating the Linux 2.2-2.6 network interface code.
Много, но на английском. Вообще в интернете хорошую документацию можно найти либо на английском, либо на родном для разработчиков языке. Учитывая то, что разработчик iproute2 - наш соотечественник Алексей Кузнецов, я расчитывал быстро овладеть этим инструментом, но не тут то было.
Вывод: я читать не стал :)

4. Linux Advanced Routing & Traffic Control HOWTO
Этот документ расскажет вам -- как повысить эффективность управления трафиком в системах, построеных на базе Linux 2.2/2.4. Многие из вас даже не подозревают, что уже работают с инструментальными средствами, которые позволяют делать весьма интересные вещи. Широко известные команды, такие как route и ifconfig -- фактически являются довольно тонкой оберткой вокруг очень мощной инфраструктуры iproute2.
Хороший документ, часто к нему обращаюсь, но рассчитан на опытных пользователей.

5. ip(8) - Linux man page
ip - show / manipulate routing, devices, policy routing and tunnels
Если вы введете в терминале man ip, то увидете тоже самое, что и по этой ссылке. Да, на английском, но тут я нашел наиболее исчерпывающие объяснения.
Вывод: man - как всегда наилучший источник.
Войдите или зарегистрируйтесь, чтобы ответить.