Этот материал — первый в серии статей, построенных на рекомендациях, собранных от множества знатоков Linux. А именно, я спросил у наших основных разработчиков об их любимых Linux-командах, после чего меня буквально завалили ценными сведениями. А именно, речь идёт о 46 командах, некоторые из которых отличает тот факт, что о них рассказало несколько человек.
В данной серии статей будут представлены все эти команды, разбитые по категориям. Первые 7 команд, которым и посвящена эта статья, направлены на работу с сетью.
Команда ip
Команда
ip
— это один из стандартных инструментов, который необходим любому системному администратору для решения его повседневных задач — от настройки новых компьютеров и назначения им IP-адресов, до борьбы с сетевыми проблемами существующих систем. Команда ip
может выводить сведения о сетевых адресах, позволяет управлять маршрутизацией трафика и, кроме того, способна давать данные о различных сетевых устройствах, интерфейсах и туннелях.Синтаксис этой команды выглядит так:
ip <OPTIONS> <OBJECT> <COMMAND>
Самое важное тут — это
<OBJECT>
(подкоманда). Здесь можно использовать, помимо некоторых других, следующие ключевые слова:-
address
— адрес протокола (IPv4 или IPv6) на устройстве. -
tunnel
— IP-туннель. -
route
— запись таблицы маршрутизации. -
rule
— правило в базе данных политики маршрутизации. -
vrf
— управление виртуальными устройствами маршрутизации и перенаправления трафика. -
xfrm
— управление IPSec-политикой.
Ниже приведены примеры, демонстрирующие распространённые сценарии использования команды
ip
.Вывод IP-адресов, назначенных интерфейсу на сервере:
[root@server ~]# ip address show
Назначение IP-адреса интерфейсу, например —
enps03
:[root@server ~]# ip address add 192.168.1.254/24 dev enps03
Удаление IP-адреса из интерфейса:
[root@server ~]# ip address del 192.168.1.254/24 dev enps03
Изменение статуса интерфейса, в данном случае — включение
eth0
:[root@server ~]# ip link set eth0 up
Изменение статуса интерфейса, в данном случае — выключение
eth0
:[root@server ~]# ip link set eth0 down
Изменение статуса интерфейса, в данном случае — изменение MTU
eth0
:[root@server ~]# ip link set eth0 mtu 9000
Изменение статуса интерфейса, в данном случае — перевод
eth0
в режим приёма всех сетевых пакетов:[root@server ~]# ip link set eth0 promisc on
Добавление маршрута, используемого по умолчанию (для всех адресов), через локальный шлюз 192.168.1.254, который доступен на устройстве
eth0
:[root@server ~]# ip route add default via 192.168.1.254 dev eth0
Добавление маршрута к 192.168.1.0/24 через шлюз на 192.168.1.254:
[root@server ~]# ip route add 192.168.1.0/24 via 192.168.1.254
Добавление маршрута к 192.168.1.0/24, который доступен на устройстве
eth0
:[root@server ~]# ip route add 192.168.1.0/24 dev eth0
Удаление маршрута для 192.168.1.0/24, для доступа к которому используется шлюз 192.168.1.254:
[root@server ~]# ip route delete 192.168.1.0/24 via 192.168.1.254
Вывод маршрута к IP 10.10.1.4:
[root@server ~]# ip route get 10.10.1.4
Команда ifconfig
Команда
ifconfig
до определённого времени представляла собой один из основных инструментов, используемых многими системными администраторами для настройки сетей и решения сетевых проблем. Теперь ей на замену пришла команда ip
, о которой мы только что говорили. Но если вас, всё же, интересует эта команда, можете взглянуть на данный материал.Команда mtr
MTR
(Matt's traceroute) — это программа, работающая в режиме командной строки, представляющая собой инструмент для диагностики сетей и устранения сетевых неполадок. Эта команда совмещает в себе возможности ping
и traceroute
. Она, как traceroute
, может выводить сведения о маршруте, по которому сетевые данные идут от одного компьютера к другому. Она выводит массу полезных сведений о каждом шаге маршрутизации, например — время ответа системы. Благодаря использованию команды mtr
можно получить довольно подробные сведения о маршруте, можно обнаружить устройства, которые вызывают проблемы при прохождении данных по сети. Если, например, наблюдается рост времени ответа системы, или рост числа потерянных пакетов, это позволяет с уверенностью говорить о том, что где-то между исследуемыми системами возникла проблема с сетевым соединением.Синтаксис команды выглядит так:
mtr <options> hostname/IP
Рассмотрим несколько распространённых способов применения
mtr
.Если вызвать эту команду, указав лишь имя или адрес хоста — она выведет сведения о каждом шаге маршрутизации. В частности — имена хостов, сведения о времени их ответа и о потерянных пакетах:
[root@server ~]# mtr google.com
Вот — вариант использования
mtr
, когда вместо имён хостов выводятся их IP-адреса (речь идёт о ключе -g
, благодаря которому вместо имён выводятся числовые IP-адреса):[root@server ~]# mtr -g google.com
А следующий вариант команды позволяет выводить и имена, и IP-адреса хостов:
[root@server ~]# mtr -b google.com
Так можно задать количество ping-пакетов, которые нужно отправить системе, маршрут к которой подвергается анализу:
[root@server ~]# mtr -c 10 google.com
А так можно получить отчёт, содержащий результаты работы
mtr
:[root@server ~]# mtr -r -c 10 google.com > mtr-command-google-output
Вот — ещё один вариант получения такого отчёта:
[root@server ~]# mtr -rw -c 10 google.com > mtr-command-google-output
Для того чтобы принудительно использовать TCP вместо ICMP — надо поступить так:
[root@server ~]# mtr –tcp google.com
А вот так можно использовать UDP вместо ICMP:
[root@server ~]# mtr –udp google.com
Вот — вариант команды, где задаётся максимальное количество шагов маршрутизации:
[root@server ~]# mtr -m 35 216.58.223.78
Так можно настроить размер пакета:
[root@server ~]# mtr -r -s 50 google.com
Для вывода результатов работы
mtr
в формате CSV используется такая команда:[root@server ~]# mtr –csv google.com
Вот — команда для вывода результатов работы
mtr
в формате XML:[root@server ~]# mtr –xml google.com
Команда tcpdump
Утилита
tcpdump
предназначена для захвата и анализа пакетов.Установить её можно так:
[root@server ~]# dnf install -y tcpdump
Прежде чем приступить к захвату пакетов, нужно узнать о том, какой интерфейс может использовать эта команда. В данном случае нужно будет применить команду
sudo
или иметь root-доступ к системе.[root@server ~]# tcpdump -D
1 eth0
2 nflog
3 nfqueue
4 usbmon1
5 any
6 lo (Loopback)
Если нужно захватить трафик с интерфейса
eth0
— этот процесс можно запустить такой командой:[root@server ~]# tcpdump -i eth0
Или — такой, с указанием (через ключ
-c
) количества пакетов, которые нужно захватить:[root@server ~]# tcpdump -i eth0 -c 10
▍ Захват трафика, идущего к некоему хосту и от него
Можно отфильтровать трафик и захватить лишь тот, который приходит от определённого хоста. Например, чтобы захватить пакеты, идущие от системы с адресом 8.8.8.8 и уходящие к этой же системе, можно воспользоваться такой командой:
[root@server ~]# tcpdump -i eth0 -c 10 host 8.8.8.8
Для захвата трафика, идущего с хоста 8.8.8.8, используется такая команда:
[root@server ~]# tcpdump -i eth0 src host 8.8.8.8
Для захвата трафика, уходящего на хост 8.8.8.8, применяется такая команда:
[root@server ~]# tcpdump -i eth0 dst host 8.8.8.8
▍ Захват трафика, идущего в некую сеть и из неё
Трафик можно захватывать и ориентируясь на конкретную сеть. Делается это так:
[root@server ~]# tcpdump -i eth0 net 10.1.0.0 mask 255.255.255.0
Ещё можно поступить так:
[root@server ~]# tcpdump -i eth0 net 10.1.0.0/24
Можно, кроме того, фильтровать трафик на основе его источника или места, в которое он идёт.
Вот — пример захвата трафика, отфильтрованного по его источнику (то есть — по той сети, откуда он приходит):
[root@server ~]# tcpdump -i eth0 src net 10.1.0.0/24
Вот — захват трафика с фильтрацией по сети, в которую он направляется:
[root@server ~]# tcpdump -i eth0 dst net 10.1.0.0/24
▍ Захват трафика, поступающего на некий порт и выходящего из некоего порта
Вот пример захвата трафика только для DNS-порта по умолчанию (53):
[root@server ~]# tcpdump -i eth0 port 53
Захват трафика для заданного порта:
[root@server ~]# tcpdump -i eth0 host 8.8.8.8 and port 53
Захват только HTTPS-трафика:
[root@server ~]# tcpdump -i eth0 -c 10 host www.google.com and port 443
Захват трафика для всех портов кроме 80 и 25:
[root@server ~]# tcpdump -i eth0 port not 80 and not 25
Команда netstat
Инструмент
netstat
используется для вывода сведений о сетевых соединениях и таблицах маршрутизации, данных о работе сетевых интерфейсов, о masquerade-соединениях, об элементах групп многоадресной рассылки. Эта утилита является, как и ifconfig
, частью пакета net-tools
. В новом пакете iproute2
для достижения тех же целей используется утилита ss
.Если в вашей системе
netstat
отсутствует, установить эту программу можно так:[root@server ~]# dnf install net-tools
Ей, в основном, пользуются, вызывая без параметров:
[root@server ~]# netstat
В более сложных случаях её вызывают с параметрами, что может выглядеть так:
netstat <options>
Можно вызывать
netstat
и с несколькими параметрами, перечислив их друг за другом:netstat <option 1> <option 2> <option 3>
Для вывода сведений обо всех портах и соединениях, вне зависимости от их состояния и от используемого протокола, применяется такая конструкция:
[root@server ~]# netstat -a
Для вывода сведений обо всех TCP-портах применяется такой вариант команды:
[root@server ~]# netstat -at
Если нужны данные по UDP-портам — утилиту вызывают так:
[root@server ~]# netstat -au
Список портов любых протоколов, ожидающих соединений, можно вывести так:
[root@server ~]# netstat -l
Список TCP-портов, ожидающих соединений, выводится так:
[root@server ~]# netstat -lt
Так выводят список UDP-портов, ожидающих соединений:
[root@server ~]# netstat -lu
А так — список UNIX-портов, ожидающих соединений:
[root@server ~]# netstat -lx
Вот — команда для вывода статистических сведений по всем портам вне зависимости от протокола:
[root@server ~]# netstat -s
Так выводятся статистические сведения по TCP-портам:
[root@server ~]# netstat -st
Для просмотра списка TCP-соединений с указанием PID/имён программ используется такая команда:
[root@server ~]# netstat -tp
Для того чтобы найти процесс, который использует порт с заданным номером, можно поступить так:
[root@server ~]# netstat -an | grep ‘:<port number>’
Команда nslookup
Команда
nslookup
используется для интерактивного «общения» с серверами доменных имён, находящимися в интернете. Она применяется для выполнения DNS-запросов и получения сведений о доменных именах или IP-адресах, а так же — для получения любых других специальных DNS-записей.Рассмотрим распространённые примеры использования этой команды.
Получение A-записи домена:
[root@server ~]# nslookup example.com
Просмотр NS-записей домена:
[root@server ~]# nslookup -type=ns example.com
Выяснение сведений о MX-записях, в которых указаны имена серверов, ответственных за работу с электронной почтой:
[root@server ~]# nslookup -query=mx example.com
Обнаружение всех доступных DNS-записей домена:
[root@server ~]# nslookup -type=any example.com
Проверка использования конкретного DNS-сервера (в данном случае запрос производится к серверу имён
ns1.nsexample.com
):[root@server ~]# nslookup example.com ns1.nsexample.com
Проверка A-записи для выяснения IP-адресов домена — это распространённая практика, но иногда нужно проверить то, имеет ли IP-адрес отношение к некоему домену. Для этого нужно выполнить обратный просмотр DNS:
[root@server ~]# nslookup 10.20.30.40
Команда ping
Команда
ping
— это инструмент, с помощью которого проверяют, на уровне IP, возможность связи одной TCP/IP-системы с другой. Делается это с использованием эхо-запросов протокола ICMP (Internet Control Message Protocol Echo Request). Программа фиксирует получение ответов на такие запросы и выводит сведения о них вместе с данными о времени их приёма-передачи. Ping
— это основная команда, используемая в TCP/IP-сетях и применяемая для решения сетевых проблем, связанных с целостностью сети, с возможностью установления связи, с разрешением имён.Эта команда, при простом способе её использования, принимает лишь один параметр: имя хоста, подключение к которому надо проверить, или его IP-адрес. Вот как это может выглядеть:
[root@server ~]# ping google.com
PING google.com (216.58.206.174) 56(84) bytes of data.
64 bytes from sof02s27-in-f14.1e100.net (216.58.206.174): icmp_seq=1 ttl=56 time=10.7 ms
64 bytes from sof02s27-in-f14.1e100.net (216.58.206.174): icmp_seq=2 ttl=56 time=10.2 ms
64 bytes from sof02s27-in-f14.1e100.net (216.58.206.174): icmp_seq=3 ttl=56 time=10.4 ms
64 bytes from sof02s27-in-f14.1e100.net (216.58.206.174): icmp_seq=4 ttl=56 time=10.4 ms
64 bytes from sof02s27-in-f14.1e100.net (216.58.206.174): icmp_seq=5 ttl=56 time=17.3 ms
^C
--- google.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4005ms
rtt min/avg/max/mdev = 10.219/11.844/17.381/2.773 ms
В данном случае работу команды
ping
можно остановить, воспользовавшись сочетанием клавиш CTRL+C
. В противном случае она будет выполнять запросы до тех пор, пока её не остановят. После каждой ping-сессии выводятся сводные данные, содержащие следующие сведения:-
Min
— минимальное время, которое требуется на получение ответа от пингуемого хоста. -
Avg
— среднее время, которое требуется на получение ответа. -
Max
— максимальное время, которое требуется на получение ответа.
Кроме того, среди данных, выводимых программой о пакетах, есть такой параметр, как TTL (Time To Live, время жизни пакета). Тут используются числовые значения TTL, указывающие на то, сколько шагов маршрутизации может пройти пакет. Это значение ещё известно как «лимит переходов» (hop limit).
Обычно, если запустить команду
ping
в её простом виде, не передавая ей дополнительные параметры, Linux будет пинговать интересующий пользователя хост без ограничений по времени. Если нужно изначально ограничить количество ICMP-запросов, например — до 10, команду ping
надо запустить так:[root@server ~]# ping -c 10 google.com
А для того чтобы увидеть лишь итоговый отчёт работы
ping
— можно воспользоваться ключом -q
:[root@server ~]# ping -c 10 -q google.com
В системах с несколькими сетевыми интерфейсами можно задавать конкретный интерфейс, которым должна пользоваться команда
ping
. Например, есть компьютер, имеющий интерфейсы eth0
и eth1
. Если нужно, чтобы команда ping
использовала бы интерфейс eth0
— надо запустить её так:[root@server ~]# ping -I eth0 google.com
Или можно указать адрес интерфейса. В данном случае речь идёт об IP-адресе 10.233.201.45:
[root@server ~]# ping -I 10.233.201.45 google.com
Применяя эту команду, можно указать и то, какую версию протокола IP использовать — v4 или v6:
[root@server ~]# ping -4 google.com
[root@server ~]# ping -6 google.com
В процессе работы с утилитой
ping
вы столкнётесь с различными результатами. В частности, это могут быть сообщения о нештатных ситуациях. Рассмотрим три таких ситуации.▍ Destination Host Unreachable
Вероятной причиной получения такого ответа является отсутствие маршрута от локальной хост-системы к целевому хосту. Или, возможно, это удалённый маршрутизатор сообщает о том, что у него нет маршрута к целевому хосту.
▍ Request timed out
Если результат работы
ping
выглядит именно так — это значит, что локальная система не получила, в заданное время, эхо-ответов от целевой системы. По умолчанию используется время ожидания ответа в 1 секунду, но этот параметр можно настроить. Подобное может произойти по разным причинам. Чаще всего это — перегруженность сети, сбой ARP-запроса, отбрасывание пакетов фильтром или файрволом и прочее подобное.▍ Unknown host/Ping Request Could Not Find Host
Такой результат может указывать на то, что неправильно введено имя хоста, или хоста с таким именем в сети просто не существует.
О хорошем качестве связи между исследуемыми системами говорит уровень потери пакетов в 0%, а так же — низкое значение времени получения ответа. При этом в каждом конкретном случае время получения ответа варьируется, так как оно зависит от разных параметров сети. В частности — от того, какая среда передачи данных используется в конкретной сети (витая пара, оптоволокно, радиоволны).
Итоги
Надеемся, вам пригодятся команды и примеры их использования, о которых мы сегодня рассказали. А если они вам и правда пригодились — возможно, вам будет интересно почитать продолжение этого материала.
Комментарии (22)
rionnagel
19.07.2021 21:03+2Эх, забыли про) nc, arp, curl, wget, whois, nmap, iperf3, telnet, sngrep, iftop, nmcli (кто пользуется NM).
Кто любит сразу в wireshark - можно "лайфхак" в пример): ssh root@my-server-ip tcpdump -U -s0 -w - 'not port 22' | wireshark -k -i -
MrAlone
19.07.2021 21:13+1Всё очень просто - нужно знать команды, которые входят в базовую установку дистро. Если netstat и ifconfig устарели, значит нужно знать ip и ss, а не пытаться доставлять пакеты.
Bytamine
19.07.2021 22:37+3Если в вашей системе
netstat
отсутствуетТо это потому, что он deprecated и пользоваться надо ss.
KolyaniuS
20.07.2021 03:51Что ж
Выше сделали важное замечание про ss - забудьте уже про netstat, а за использование ifconfig надо отнимать доступ к серверу.
К слову и где:
- arp
- tracepath
- nmap
- dig
- lsof тоже полезен при анализе сетевых соединений, к примеру, по конкретному процессу
Конечно, все не уместить в одной статье, но вот потратить целый абзац на морально устаревший ifconfig - это норм?
Заголовки как мне кажется должны отделять либо смысловую нагрузку, либо заменять список. Например, выделять заголовком только название новой команды, а примеры использования (типа захвата трафика) и статусы на пинг логичнее форматировать обычным текстом из абзаца, выделив жирным шрифтом.
Про запуск от рута я конечно промолчу - с кем не бывает.
На кого статья рассчитана даже сложно представить, начинающим девопсам с бесконечных онлайн-курсов с громкими заголовками вида "освой IT-профессию за пару месяцев и получи гарантированное трудоустройство с оффером от 200к".unsignedchar
20.07.2021 07:45Про параметры ip нужно не абзац, а монографию писать :)
nukler
20.07.2021 17:32+1ip это вообще как калаш, и стукнуть можно и рыбу удить.
Вообще не понятно как человек который типа «системный администратор» не знает ip или тот же dig?? Не знает ping???? ЧО?
Ну ладно iftop или там iptraf… но это то азновные азы азов!..
trak
20.07.2021 16:40не ради холивара, а что там с ifconfig ? он когда появился в unix в 1993 году вместе с IP стеком я к нему привык, и иногда вот встречаю что он злое зло, отчего такое мнение?
trak
20.07.2021 06:59+7хабр на 95% превратился в место для корпоративного булшита :(
SnikeMK
20.07.2021 11:23Хабр вырос, теперь публикации на хабре у программистов сродни публикации в nature для ученых. Естественный процесс крупных сообществ, не думаю, что можно что-то с этим поделать, имхо
nullc0de
20.07.2021 11:51@SnikeMK причина совсем в другом, причина в накрученных статьях, и программе поощрения авторов. С одной стороны это хорошо платить за хорошие статьи, но к сожалению получается так, что это наоборот поощряет не честную игру и поток шлаковых статей. Выгоднее писать плохие статьи и накручить, с этого живут команды авторов и разные конторы предлагающие услуги написания статей. На этом на днях поймали очередную компанию на хабре и она сильно просела в рейтинге. Увы, но качественные статьи просто тонут в общей массе и не набирают нужного количества голосов, про это уже указывал редактору RU_VDS, что нужно вводить лучшую фильтрацию статей, они платят за статьи деньги, и очень много статей просто не стоят тех денег, что за них платят. Плюс на накрученные статьи даже невозможно возразить, и иметь критическое мышление, надо быть "бараном" и засунуть свой опыт себе в одно место, иначе тебя сеткой ботов заминусуют моментально, так как критиковать безграмотных авторов не положено, и хабр уже не лучшая ИТ площадка, а форум домохозяек. Не реально конкурировать, когда многие играют не честно. Поэтому уже много лет назад произошел отток грамотных авторов и более грамотной аудитории. Про деградацию хабра уже писали везде где можно, такие компании как майл.ру которые раньше были в топе хабра и много писали, уже практически не пишут. Честно говоря когда хабр был в управлении маил.ру такого беспорядка не было, все началось после возврата проекта автору хабра и слияния всех площадок типа Geektimes в одну.
nad_oby
20.07.2021 16:16Тут уже в комментариях писали про устаревшие команды и нехватку других важных.
Такие вещи проще группирровать на условно физический (arp, ip, tcpdump), протокольный (ping, nc, ss), и аппликативный (telnet, whether, curl)
А идеально показывать использование в каком-либо более менее правдоподобном сценарии.
ky0
21.07.2021 18:02Я бы назвал статью "если вы не знаете всего, тут описанного - значит вы ещё скорее эникей, rtfm".
zuek
А разве
ss
не функциональнееnetstat
?Kirpitch
Поддержу, да и работает побыстрее.
kratorr
ss как раз и пришел на замену netstat.