Не секрет, что Net-Tools пора на почетную отставку. Да, многим админам и мне в том числе, до условного рефлекса Павлова знакомы команды ifconfig, route, netstat. На первый взгляд нет причин что-то менять, а лучшее как всегда враг хорошего.




Давайте узнаем почему Net-Tools уже не тот и как безболезненно с него перейти на iproute2 .


Что не так с ifconfig-ом?


Какие есть претензии к Net-Tools и насколько они обоснованны?


  • Использует устаревший ioctl, в то время как iproute2 использует актуальный netlink.
  • ifconfig показывает вторичные IP адреса как отдельные интерфейсы.

root ~ $ ifconfig dummy0:1 1.2.3.4 up
root ~ $ ifconfig dummy0
dummy0    Link encap:Ethernet  HWaddr FE:50:31:E6:14:17
          BROADCAST NOARP  MTU:1500  Metric:1
[...]

  • ifconfig не видит вторичные IP адреса без маркировки. Попробуйте запустить следующую команду и проверьте затем вывод в ifconfig. На интерфейсе eth0 IP адрес уже должен быть сконфигурен.

ip addr add 192.168.1.2/24 brd + dev eth0

  • ifconfig не знает о существовании CIDR. Только традиционные IPv4 адреса.
  • ifconfig не умеет показывать физический адрес туннельных интерфейсов tun, tap, вместо адреса сплошные нули.

root ~ $ ifconfig tun0
root ~ $ tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:10.0.254.6  P-t-P:10.0.254.5  Mask:255.255.255.255 

  • ifconfig не позволяет создавать создавать tun, tap устройства и статичные l2tp, ipip, gre тунели.
  • ifconfig не показывает одноранговые IP адреса, (peer IP). Можно сконфигурировать одноранговую сеть на eth0, но ifconfig не покажет удаленный IP.

root ~ $ ip addr add 192.168.13.37/32 peer 192.168.13.38 dev eth0
root ~ $ ifconfig eth0 192.168.13.37

  • netstat, пытается быть дружественным в режиме показа статистики, показывая описание SNMP переменных, но не всегда это оправданно. По ссылке история о том, как понять, что такое timeout in transit. Кроме того такой вывод статистики нелегко скормить обработчику регулярных выражений.

Icmp:
    3327 ICMP messages received
    17 input ICMP message failed
    ICMP input histogram:
        destination unreachable: 3151
        timeout in transit: 56

  • netstat не выдает полную статистику, так как показывает только те SNMP переменные из /proc/net/{snmp,netstat}, которые определены в файле statistics.c.

Категория Netstat Nstat Разница
Ip 6 17 +11
Ip6 14 32 +18
Icmp 6 29 +23
Icmp6 25 46 +21
Tcp 10 10 0
Udp 7 8 +1
Udp6 4 8 +4
UdpLite 0 15 +15
UdpLite6 0 7 +7
TcpExt 48 116 +68
IpExt 11 17 +6

Все перечисленные недостатки обусловлены тем, что проект слишком долго не развивался — последний релиз был в 2011 г, а ядро и сетевой стек за это время ушли далеко вперед. Справедливости ради надо отметить, что в последнее время работа над проектом возобновилась, но вряд ли это приведет к существенным изменениям в кодовой базе.


Переучиваемся на iproute2


С iproute2 можно получить все то же, что с Net-Tools и даже больше, но только синтаксис и вывод команд на терминал будут отличаться. Если честно, читебельность некоторых команд ip наводит на мысль, что новое не всегда лучшее.





Следующие две команды призваны заменить ifconfig без дополнительных ключей.


(5:520)$ ip -c link
1: lo: <LOOPBACK,UP> mtu 16436 qdisc noqueue 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 100
    link/ether 00:80:c8:f8:4a:51 brd ff:ff:ff:ff:ff:ff

С ключем -c вывод будет цветным и более читабельным.


(5:521)$ ip -c addr
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 00:80:c8:f8:4a:51 brd ff:ff:ff:ff:ff:ff
    inet 192.0.2.1/24 brd 192.0.2.255 scope global eth0

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


(5:522)$ ip ro

Вся таблица маршрутизации.


(5:523)$ ip ro list table all
broadcast 127.255.255.255 dev lo  proto kernel  scope link  src 127.0.0.1 
local 10.0.0.1 dev eth0  proto kernel  scope host  src 10.0.0.1 
broadcast 10.0.0.0 dev eth0  proto kernel  scope link  src 10.0.0.1 
local 212.64.94.251 dev ppp0  proto kernel  scope host  src 212.64.94.251 
broadcast 10.255.255.255 dev eth0  proto kernel  scope link  src 10.0.0.1 
broadcast 127.0.0.0 dev lo  proto kernel  scope link  src 127.0.0.1 
local 127.0.0.1 dev lo  proto kernel  scope host  src 127.0.0.1 
local 127.0.0.0/8 dev lo  proto kernel  scope host  src 127.0.0.1
local ::1 dev lo  proto none  metric 0  pref medium
local fe80::5166:f6f:fea2:29f dev lo  proto none  metric 0  pref medium
local fe80::fa61:45ff:f1e0:109e dev lo  proto none  metric 0  pref medium
local fe80::f5c4:ff:efbf:0455 dev lo  proto none  metric 0  pref medium
fe80::/64 dev eth0  proto kernel  metric 256  pref medium
fe80::/64 dev ppp0  proto kernel  metric 256 linkdown  pref medium
ff00::/8 dev eth0  metric 256  pref medium
ff00::/8 dev ppp0  metric 256 linkdown  pref medium
ff00::/8 dev lo  metric 256  pref medium

Обратите внимание, что вывод команд из набора iproute2 зачастую не тривиально парсить в скрипте. Это не добавляет популярности мейнтейнерам, которые пытаются выкинуть Net-Tools из дистрибутива.


Просмотреть физические адреса соседних узлов из ARP кэша. Для наглядности варианты с Net-Tools и iproute2 пишем рядом.


(5:524)$ arp -a
(5:525)$ ip neigh show

Перейдем теперь к настройкам. Поднять интерфейс.


(5:501)$ ifconfig eth0 up
(5:502)$ ip link set eth0 up

Выключить интерфейс.


(5:503)$ ifconfig eth0 down
(5:504)$ ip link set eth0 down

Задать IP адрес.


(5:504)$ ifconfig eth0 192.168.0.77 netmask 255.255.255.0 broadcast 192.168.0.255
(5:505)$ ip addr add 192.168.0.77/24 broadcast 192.168.0.255 dev eth0

В отличии от Net-Tools, iproute2 позволяет также удалить IP адрес.


(5:506)$ ip addr del 192.168.0.77/24 dev eth0

Добавить вторичный адрес.


(5:507)$ ifconfig eth0:1 10.0.0.1/8
(5:508)$ ip addr add 10.0.0.1/8 dev eth0 label eth0:1

Добавляем маршрут.


(5:509)$ route add -net 192.168.4.0/24 dev eth2
(5:510)$ ip route add 192.168.4.0/24 dev eth2

И удаляем его же.


(5:511)$ route del -net 192.168.4.0/24 dev eth2
(5:512)$ ip route del 192.168.4.0/24 dev eth2

Добавляем маршрут по умолчанию (a. k. a. gateway).


(5:513)$ route add default gw 192.0.2.1
(5:514)$ ip route add default via 192.0.2.1

Мы рассмотрели только базовые команды мониторинга и настройки, чуть менее чем полный список команд iproute2 по ссылке.


Nstat вместо netstat


Nstat в отличие от своего более старого аналога выдает только SNMP метрики в строго определенном порядке и выдает их все.


(5:526)$ nstat -a
#kernel
IpInReceives            69783          0.0
IpInDelivers            69469          0.0
IpOutRequests           68643          0.0
...

Еще одно отличие состоит в том, что netstat показывает кумулятивное значение метрик с момента запуска ОС, в то время как nstat по умолчанию показывает дельту значений и поэтому при первом запуске обеих команд значения будут одинаковы. Для того, чтобы nstat повел себя привычно, надо запускать его с ключем -s.


(5:527)$ nstat -sa #кумулятивные значения

С ключем --zero получаем только нулевые значения.


(5:528)$ nstat --zero
#kernel
IpInReceives                0              0.0
IpInHdrErrors               0              0.0
IpInAddrErrors              2              0.0
IpForwDatagrams             0              0.0
IpInUnknownProtos           0              0.0
IpInDiscards                0              0.0
(...)

Не знаю, хорошо ли это или плохо, но еще nstat умеет выдавать результат в формате json.


(5:528)$ nstat --json
{"kernel":{"TcpInSegs":2,"TcpOutSegs":4,"Ip6InReceives":2,"Ip6InDelivers":2,"Ip6OutRequests":4,"Ip6InOctets":776,"Ip6OutOctets":770,"Ip6InNoECTPkts":2,"TcpExtTCPHPHits":1,"TcpExtTCPHPAcks":1,"TcpExtTCPOrigDataSent":2}}

Ss вместо netstat


Команда ss с лихвой перекрывает функционал Netstat, по части вывода информации о сетевых подключениях, делает это быстрее и копает глубже. Пока netstat за каждым чихом лезет в /proc и теряя темп, ss через Netlink интерфейс быстро качает информацию из ядра.


(5:529)$ sudo ss --summary
Total: 348 (kernel 352)
TCP:   15 (estab 9, closed 1, orphaned 0, synrecv 0, timewait 1/0), ports 0

Transport Total     IP        IPv6
*         352       -         -        
RAW       1         0         1        
UDP       3         3         0        
TCP       14        12        2        
INET      18        15        3        
FRAG      0         0         0 

Отрадно, что синтаксис у обеих команд схожий, поэтому привыкать долго не придется.


(5:530)$ ss -t
State      Recv-Q Send-Q    Local Address:Port        Peer Address:Port   
ESTAB      0      0           192.168.1.2:43839     108.160.162.37:http    
ESTAB      0      0           192.168.1.2:43622     199.59.149.201:https   
ESTAB      0      0           192.168.1.2:33141      83.170.73.249:ircd    
ESTAB      0      0           192.168.1.2:54028     74.125.135.125:xmpp-client

Однако ss позволяет залезть буквально под капот tcp соединениям.


(5:531)$ sudo ss --tcp --info |tail -n 1
         cubic wscale:4,7 rto:280 rtt:71.541/13.487 ato:40 mss:1460 cwnd:100 bytes_acked:465157 bytes_received:513194 segs_out:604 
segs_in:937 send 16.3Mbps lastsnd:86100 lastrcv:85680 lastack:5050 pacing_rate 32.7Mbps rcv_rtt:12120 rcv_space:186376

Тут есть все: таймеры подтверждения доставки, дорога туда-обратно, механизм контроля перегрузки канала cubic и много чего еще.


Тяни-толкай вокруг Net-Tools


По этому вопросу консенсуса в Linux сообществе пока нет. В OpenSuse в 2009 г. состоялся пленум завязалась дискуссия по этому вопросу, но на жесткие меры не пошли, а вот RedHat и Fedora в 2011 г. решили, что с них хватит, и уже начиная с 7-й версии RHEL не ставит Net-Tools. В 7.1 была безуспешная попытка его вернуть, что показывает неизбывную популярность Net-Tools. В Debian Linux после неудачной попытки в 2009 г. объявить Net-Tools устаревшим и начать процесс его замены, несколько лет об этом не вспоминали, и вот недавно спор возобновился с новой силой. Дело в том, что в Debian до сих пор значительное количество пакетов от него зависит. В Gentoo как всегда решаешь ты, ставить или нет, однако зависимостей по сабжу нет.


(5:532)$ equery depends net-tools
 * These packages depend on net-tools:
net-misc/openvpn-2.3.12 (!iproute2 ? sys-apps/net-tools)

Мне лично кажется, что пока нет причин отказываться от Net-Tools там, где это возможно. Если у вас два с половиной сетевых интерфейса на локалхосте, включая loopback, вы спокойно можете продолжать использовать эти программы, но на приличном боевом или даже на тестовом сервере iproute2 все же будет предпочтительнее, как бы пальцы ни дергались набрать привычные старые команды. Рано или поздно все Linux дистрибутивы и даже Debian перестанут ставить этот пакет по умолчанию, и тогда знание команд из набора iproute2 вполне пригодится, хотя этот момент может наступить еще не скоро.


Использованные материалы


Поделиться с друзьями
-->

Комментарии (40)


  1. kilgur
    26.01.2017 15:42
    +1

    Заинтересовала опция -c. У меня (CentOS 7.3.1611, iproute2-ss130716) такой нет. Нагуглил только патч от 2015 года, добавляющий цветной вывод. Видимо, этот патч в основную поставку не вошел. У вас какая версия iproute2?


    1. kilgur
      26.01.2017 16:00
      +1

      В версии iproute2-ss130716 год — это не 16 (как я понадеялся), а 13. Т.е. в последней CentOS весьма древняя версия пакета — от 2013 года. В debian 8.1 посвежее — 140804, но тоже без "-c". В Fedora25 — 160518.


      1. lolipop
        27.01.2017 02:43

        debian 8.7, работают цвета.


        1. kilgur
          27.01.2017 08:45

          Странно. У меня на домашнем сервере был установлен 8.1. Только что обновил:
          `cat /etc/debian_version` показывает «8.7», `ip -V` — «ip utility, iproute2-ss140804».

          $ ip -c addr
          Option "-c" is unknown, try "ip -help".
          


          1. lolipop
            27.01.2017 09:50

            да, был неправ, пакет приехал из репозитория proxmox.

            Скрытый текст
            # ip -V
            ip utility, iproute2-ss160111
            # apt-cache policy iproute2
            iproute2:
            Installed: 4.4.0-2
            Candidate: 4.4.0-2
            Version table:
            *** 4.4.0-2 0
            500 http://download.proxmox.com/debian/ jessie/pve-no-subscription amd64 Packages
            100 /var/lib/dpkg/status
            4.4.0-1 0
            500 http://download.proxmox.com/debian/ jessie/pve-no-subscription amd64 Packages
            4.2.0-2 0
            500 http://download.proxmox.com/debian/ jessie/pve-no-subscription amd64 Packages
            3.16.0-2 0
            500 http://mirror.yandex.ru/debian/ jessie/main amd64 Packages


  1. temujin
    26.01.2017 15:42

     sys-apps/iproute2
         Доступные версии:      4.4.0 


  1. Sabin
    26.01.2017 15:43

    Дилетантский вопрос: речь в статье о linux, но насколько предустановленный в windows netstat совместим с тем, что вы описываете? Или это 2 абсолютно разные утилиты, у которых совпадает только название?


    1. Sabin
      26.01.2017 15:57

      Невнимательно прочитал, вопрос снимаю. Тут речь про iproute2


    1. temujin
      26.01.2017 18:10

      Кажется у них свой.



  1. MasMaX
    26.01.2017 15:51
    +5

    А как через ss сделать красивый вывод об открытых портах. Вот аналогичные команды, но вывод у ss полная каша.

    image


    1. bamond
      26.01.2017 18:01

      ss -tuln


      1. iborzenkov
        26.01.2017 20:55

        не показывает процесс, а это как раз чаще всего и нужно


    1. Domini
      26.01.2017 22:45
      +2

      Попробуйте добавить | cat в конце. Возможно это то, что вы хотите.


      1. ssgu85
        27.01.2017 12:20
        +1

        С | column -t будет ещё красивее.


    1. Night_Snake
      27.01.2017 23:04

      я обычно пользуюсь netstat -apnout


  1. VBKesha
    26.01.2017 15:51
    +1

    Осталось чтобы кто то написал врапер ifconfig<->iproute2


    1. temujin
      26.01.2017 22:49

      Было обсуждено в багрепорте Шапки. У команд слишком разный синтаксис.


  1. ghostinushanka
    26.01.2017 16:02

    Автор, стаья о iproute2 без ссылки на LARTC — «деньги на ветер» :)
    Добавьте пожалуйста.
    Его почитать стоит уже только ради этой фразы:

    Unbeknownst to most users, you already run tools which allow you to do spectacular things. Commands like route and ifconfig are actually very thin wrappers for the very powerful iproute2 infrastructure.


    1. temujin
      26.01.2017 17:04

      Заглавная вырвиглазно выгладит, лучше ссылку на http://www.lartc.org/lartc.html.


  1. OnlySlon
    26.01.2017 16:51
    -5

    CIDR? Он еще где-то используется?
    Извиняюсь, но какой hwaddr может у туннельного интерфейса?
    hwaddr tap-интерфейса показывает и меняетя нормально.
    ЧЯДНТ?
    Вывод ifconfig и route по ламповому теплый и более читаемый.
    Руки прочь от Ifconfig'a!


  1. nobodysu
    26.01.2017 16:59
    +1

    Кому-нибудь известен быстрый аналог netstat для фряхи?


    1. Scf
      26.01.2017 18:23
      +1

      быстрый аналог — netstat -n
      Оригинальная команда тормозит потому, что пытается резолвить dns-имена для каждого IP.


    1. Night_Snake
      27.01.2017 23:03

      sockstat же?


  1. bykvaadm
    26.01.2017 18:05
    +1

    Еще интересен тот факт что ключи в ip route можно сокращать до 1 буквы:

    (5:504)$ ifconfig eth0 192.168.0.77 netmask 255.255.255.0 broadcast 192.168.0.255
    (5:505)$ ip a a 192.168.0.77/24 dev eth0


  1. k3NGuru
    27.01.2017 06:35

    Может кто подскажет, делаю
    ip addr add 192.168.99.58/24 brd + dev vpn_smlvpn
    при перезагрузки машины, интерфейс теряется, каждый раз приходит вводить данную команду. Как сделать, что система запомнила данный интерфейс?


    1. trublast
      27.01.2017 09:21

      Ну к примеру, в качестве костыля

       echo "ip addr add 192.168.99.58/24 brd + dev vpn_smlvpn" >>  /etc/rc.local
      

      Работает везде, иначе зависит от используемой ОС


  1. Slot
    27.01.2017 08:32
    +1

    не убедили


  1. muon
    27.01.2017 12:08

    # ip link
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    2: venet0: <BROADCAST,POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT
        link/void
    #
    

    Хм, а как же я его по SSH админю?..


    1. Mystray
      27.01.2017 22:39

      А что не так? Что мешает, по вашему?
      venet всегда был костылем, потому и не место ему в ванилле.


      1. muon
        28.01.2017 14:32

        Отсутствие IP-адреса.
        Насчёт костыля: мне в общем-то всё равно, чем хостер даёт сеть в мой контейнер, пока это не мешает работоспособности. В этой суровой данности бытия ifconfig работает, а ip — нет.


        1. Hamer13
          28.01.2017 23:53

          Вообще-то «ip link» показывает L2. Для просмотра IP адресов нужно «ip addr».


          root@h13-remote: ~# ip -4 link
          1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT
              link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
          2: venet0: <BROADCAST,POINTOPOINT,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT
              link/void
          3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT
              link/ether ea:5d:05:77:16:8c brd ff:ff:ff:ff:ff:ff
          4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN mode DEFAULT qlen 100
              link/none

          root@h13-remote: ~# ip -4 addr
          1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
              inet 127.0.0.1/8 scope host lo
          3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
              inet 10.10.160.17/24 brd 10.10.160.255 scope global eth0
          4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 100
              inet 192.168.13.242/28 brd 192.168.13.255 scope global tun0


  1. Ivan_83
    27.01.2017 14:02
    +2

    Претензии к ifconfig и прочим более чем надуманы: ничего не мешало взять и научить его новым трюкам. На фре так и сделали.
    Только ФГМ и прочие расстройства психики мешают линуксойдам иметь оба набора в системе одновременно в полностью пригодном состоянии.

    ip дуратское название, особенно нелепо выглядит ip link когда мы вроде как командой для работы с Internet Protocol настраиваем более нижний уровень.
    А вот эти ip a a — это вообще для кого? Для роботов?


    1. VJean
      27.01.2017 22:39

      «ip a a» — сокращенная команда «ip addr add»


    1. caban
      28.01.2017 21:14
      +1

      А на фре ifconfig или route умеет например source based routing? Iproute умеет очень много и это замена не только ifconfig.


  1. kelevra
    27.01.2017 21:14
    +2

    я просто оставлю это здесь.


    1. agorbachev
      31.01.2017 14:08

      вот это просто огонь. Спасибо


      1. selivanov_pavel
        31.01.2017 15:40

        .


    1. selivanov_pavel
      31.01.2017 15:40

      Спасибо, полезное


  1. Mystray
    27.01.2017 22:58

    К сожалению, у iproute2 есть огромный минус — актуальная документация на многие возможности только в виде «см. исходный код».
    Кроме того, к примеру, ip neighbour не может показать все, что может показать arp (proxy записи например)


  1. VJean
    28.01.2017 01:51
    +3

    Рискую быть закиданным помидорами, но все-таки выскажу свое мнение.
    В статье стоит упомянуть nftables, как наиболее вероятную будущую замену {ip,ip6,arp,eb}tables. Косвенно на это указывает появление бoльшего количества модулей ядра (grep NFT /boot/config-`uname -r`) за последние полтора года и их активную разработку, включая утилиту конфигурирования nft и сопутствующие библиотеки (libmnl, libnftnl).
    Весной пробовал nft на виртуалке, с долгим курением манов и сорцов. Несмотря на некоторые баги (в основном с icmp), знакомство очень порадовало: вельми читабельные и логичные конфиги, по сравнению с километровыми конфигами iptables. Субъективно, т.к. тестами не занимался, производительность была лучше {ip,ip6}tables.