Не секрет, что 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
вполне пригодится, хотя этот момент может наступить еще не скоро.