Важке розставання з Net-Tools

Не секрет, що 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 euroncap: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 euroncap: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
    ,
    / ip
    ,
    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 0 metric pref medium
local fe80::5166:f6f:fea2:29f dev lo proto none 0 metric pref medium
local fe80::fa61:45ff:f1e0:109e dev lo proto none 0 metric pref medium
local fe80::f5c4:ff:efbf:0455 dev lo proto none 0 metric 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
Команда
s
з лишком перекриває функціонал
Netstat
, в частині виведення інформації про мережевих підключеннях, робить це швидше і копає глибше. Поки
netstat
за кожним чихом лізе в
/proc
і втрачаючи темп,
s
через 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 3 15 
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

Однак
s
дозволяє залізти буквально під капот 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.3 Mbps lastsnd:86100 lastrcv:85680 lastack:5050 pacing_rate 32.7 Mbps 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
цілком згодиться, хоча цей момент може настати ще не скоро.
Використані матеріали
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.