Сетевые интерфейсы, протоколы и сетевые сокеты Linux

Сетевая подсистема Linux организует сетевой обмен пользовательских приложений и, как следствие, сетевое взаимодействие самих пользователей.

Часть сетевой подсистемы, выполняющаяся в режиме ядра, естественным образом ответственна за управление сетевыми устройствами ввода-вывода, но кроме этого на нее также возложены задачи маршрутизации и транспортировки пересылаемых данных, которые решаются при помощи соответствующих Сетевых протоколов. Таким образом, именно ядерная часть сетевой подсистемы обеспечивает процессы средствами сетевого межпроцессного взаимодействия (network IPC).

Внеядерная часть сетевой подсистемы отвечает за реализацию сетевых служб, предоставляющих пользователям прикладные сетевые услуги, такие как передача файлов, обмен почтовыми сообщениями, удаленный доступ и т. д.

Непосредственное, физическое взаимодействие сетевых узлов через каналы связи между ними реализуется аппаратурой сетевых адаптеров. Сетевые адаптеры, как и любые другие устройства ввода-вывода, управляются соответствующими драйверами, реализующимися в большинстве случаев в виде динамических модулей ядра.

Драйверы сетевых устройств

lunpy@ubuntu:~$ lspci

01:00.0 Network controller: Intel Corporation Centrlno Wireless-N 130 (rev 34)
02:60.0 Ethernet controller: …, Ltd. RTL8111/8168B PCI Express … Ethernet controller …

Iunpy@ubuntu:~$ lspci -ks 01:00.0

01:00.0 Network controller: Intel Corporation Centrlno Wireless-N 130 (rev 34)

Subsystem Intel Corporation Centrino Wireless-N 130 BGN

Kernel driver in use: iwlwifi

Kernel modules: iwlwifi

lunpy@ubuntu:~$ lspci -ks 62:00.0

02:00.0 Ethernet controller: …, Ltd. RTL8111/8168B PCI Express … Ethernet controller …

Subsystem: Samsung Electronics Co Ltd Device c0b6

Kernel driver in use: r8169

Kernel modules: r8169
lunpy@ubuntu:~$ modinfo iwlwifi r8169 | grep ^description

description: Intel(R) Wireless WiFi driver for Linux
description: RealTek RTL-8169 Gigabit Ethernet driver

В отличие от несетевых устройств, большинство которых имеют специальный файл в каталоге /dev, сетевые устройства представляются в системе своими интерфейсами. Список доступных интерфейсов, их параметры и статистику можно получить при помощи «классической» UNIX-команды ifconfig или специфичной для Linux команды ip.

Сетевые интерфейсы (UNIX ifconfig)

lumpy@ubuntu:~$ ifconfig -a

eth0                 Link encap:Ethernet    HWaddr e8:03:9a:0a:73:40
UP   BROADCAST   MULTICAST   MTU: 1500  Metric: 1

lo                      Link encap:Локальная петля (Loopback)
inet addr:127.0.0.1 Mask:255.0.0.0

inet6 addr: ::1/128 Scope:Host

UP   LOOPBACK   RUNNING   MTU:65536   Metric:1

wlan0              Link encap:Ethernet   HWaddr b8:03:05:a2:28:4e
inet addr:192.168.100.5    Bcast: 192.168.100.255  Mask-.255.255.255.0

inet6 addr: fe80::ba03:5ff:fea2:284e/64 Scope:Link

UP   BROADCAST  RUNNING  MULTICAST MTU:1500  Metric:1

lumpy@ubuntu:~$ ifconfig wlanO

wlanO              Link encap:Ethernet    HWaddr b8:03:05:a2:28:4e

inet addr-.192.168.100.5  Beast: 192.168.100.255 Mask:255.255.255.0
inet6 addr: fe80: :ba03:5ff:fea2:284e/64 Scope:Link

UP   BROADCAST   RUNNING  MULTICAST  MTU: 1500 Metric: 1

RX packets:23103842 errors:0 dropped:0 overruns:0 frame:0

TX packets-.15591575 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000
RX bytes:2010967763 (2.0 GB) TX bytes:2828583098 (2.8 GB)

Сетевые интерфейсы (Linux ip)

lumpy@ubuntu:~$ ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000           link/ether e8:03:9a:0a:73:40 brd ff:ff:ff:ff:ff:ff
3: wlan0: «BROADCAST,MULTICAST,UP,L0WER_UP> mtu 1500 qdisc mq state UP qlen 1000

link/ether b8:03:05:а2:28:4е brd ff:ff:ff:ff:ff:ff

lumpy@ubuntu:~$ ip -s link show dev wlanO
3: wlan0: «BROADCAST,MULTICAST,UP, LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000

link/ether b8:03:05:a2:28:4e brd ff:ff:ff:ff:ff:ff

RX: bytes      packets     errors  dropped   overrun  mcast

2026956879 23261031  0          0                 0              0

TX:  bytes      packets     errors  dropped   carrier  collsns

3118714118    15863377  0           0                0             0
lumpy@ubuntu:~$ ip addr show dev wlanO
3: wlan0: «BROADCAST,MULTICAST,UP,L0WER_UP> mtu 1500 qdisc nq state UP qlen 1000

link/ether b8:03:05:a2:28:4e brd ff:ff:ff:ff:ff:ff

inet 192.168.100.5/24 brd 192.168.100.255 scope global wlan0
valid_lft forever preferred_lft forever

inet6 fe80::ba03:5ff: fea2:284e/64 scope link

valid_lft forever preferred_lft forever

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

Нужно отметить, что в примере из листинга ниже показан список динамически загруженных модулей, среди которых присутствует «нестандартный» TCP vegas, но нет IP, TCP, UDP и прочих «стандартных» протоколов стека TCP/IP.

На текущий момент времени сложно вообразить применение Linux без подключения к IP-сети, поэтому модули стандартных протоколов TCP/IP стека скомпонованы в ядро статически и являются частью «стартового» модуля.

Драйверы сетевых протоколов

lunpy@ubuntu: ~$ lsmod

Module                       Size     Used by
tcp_vegas                  13603  0
esp4                            12868  0

ah4                              12866  0
xfm_algo                   14869   2 esp4,ah4
bnep                            19167   2
bluetooth                   356727 24 bnep,rf com,btusb
mac80211                  564463 1 iwldvm

lumpy@ubuntu:~$ nodinfo tcp_vegas bnep mac86211 | grep ‘^description

description: TCP Vegas
description: Bluetooth BNEP ver 1.3
description: IEEE 862.11 subsystem

Доступ процессов к услугам ядерной части сетевой подсистемы реализует интерфейс сетевых сокетов socket, являющихся основным (и единственным) средством сетевого взаимодействия процессов в Linux.

Разные семейства (address family) сокетов соответствуют различным стекам сетевых протоколов. Например, стек TCP/IP v4 представлен семейством AFJNET, см. ip, стек TCP/IP v6 — семейством AF_INET6, см. ipv6, и даже локальные (файловые) сокеты имеют собственное семейство — AF_L0CAL, см. unix.

Для просмотра статистики по использованию сетевых сокетов применяют «классическую» UNIX-команду netstat или специфичную для Linux команду ss. В листингах ниже иллюстрируется использование этих команд для вывода информации обо всех (-a, all) сокетах протоколов (-u, udp) UDP и (-t, tcp) TCP стека TCP/IP v4 (-4), порты и адреса которых выведены в числовом (-n, numeric) виде, а также изображены процессы (-p, process), их открывшие.

Сетевые сокеты (UNIX netstat)

lumpy@ubuntu:~$ sudo netstat -4autpn
Активные соединения с интернетом (servers and established)
Proto Recv-Q Send-Q Local Address   Foreign Address  State  PID/Program name

tcp               0              0    0:0.0.0:5900               0.0.0:0:*                  LISTEN         28880/vino-server
tcp               0              0      127.0.0.1:53               0.0.0.0:*                  LISTEN         5999/dnsmasq
tcp               0              0      0.0.0.0:22                  0.0.0.0:*                  LISTEN         655/sshd
tcp               0              0     127.0.0.1:631              0.0.0.0:*                   LISTEN         1064/cupsd
tcp               0              0      192.168.100.5:22 192.168.100.3:57929  ESTABLISHED 15841/sshd: …
udp             0               0      0.0.0.0:5353             0.0.0.0:*                                          15094/avahi-daemon:
udp             0               0      0.0.0.0546347          0.0.0.0:*                                          15094/avahi-daemon:
udp             0               0      127.0.0.1:53               0.0.0.0:*                                          5999/dnsmasq
udp             0               0         0.0.0.0:68               0.0.0.0:*                                          5995/dhclient

Сетевые сокеты идентифицируются парой адресов (собственным, local, и чужим (адрес удаленного приложения, с которым установлено соединение), foreign), принятыми в их семействе. Например, для семейства TCP/IP адрес сокета состоит из (сетевого) IP-адреса и (транспортного) номера порта, причем нули имеют специальное — «неопределенное» значение.

Так для прослушивающего (LISTEN) сокета 0.0.00 в собственном IP-адресе означает, что он принимает соединения, направленные на любой адрес любого сетевого интерфейса, а 0.0.0.0 в чужом адресе указывает на то, что взаимодействие еще не установлено. Прослушивающие сокеты используются «серверными» приложениями, пассивно ожидающими входящие соединения с ними.

Для сокетов с установленным (ESTABLISHED) взаимодействием оба адреса имеют конкретные значения, определяющие участников взаимодействия, например 192.168.100.5:22 и 192.168.100.3:57929.

Сетевые сокеты (Linux ss)

lumpy@buntu;~$ sudo ss -4atupn
Netid    State       Recv-Q  Send-Q  Local Address:Port  Peer  Address:Port
udp    UNCONN       0            0                      *:5353                        *:*   users: ((«avahi-daemon»,15094,13))

udp    UNCONN       0            0                      *:46347                       *:*  users: ((«avahi-daemon»,15094,15))

udp    UNCONN       0            0              127.0.0.1:53                       *:*  users: ((«dnsmasq»,5999,4))

udp    UNCONN       0            0                         *:68                          *:*  users: ((«dhcltent”,5995,6))

udp    UNCONN       0            0                      *:5900                          *:*    users: ((«vino-server»,28880,14))

udp    UNCONN       0            0               127.0.0.1:53                       *:*   users: ((«dnsmasq»,5999,5))

udp    UNCONN       0            0                      *:22                              *:*    users: ((«sshd»,655,4))

udp    UNCONN       0            0               127.0.0.1:631                      *:*   users: ((«cupsd»,1064,10))

udp    UNCONN       0            0               127.0.0.1:25                     *:*    users: ((«master»,2021,12))

Из примеров листингов выше видны 5 «слушающих» (LISTEN) сокетов TCP и 4«несоелииеиных» (UNCONN) сокета UDP, открытых разными службами операционной системы. Например, 22 порт TCP открыл сервер sshd, PID = 655 службы удаленного доступа W:[SSH], а 5900 порт TCP — сервер vino-server, PID = 28880 службы удаленного доступа к рабочему столу пользователя W:[VNC].

Сетевая подсистема ОС Linux чрезвычайно развита на всех ее уровнях — от сетевых интерфейсов и протоколов до прикладных сетевых служб. На сегодняшний день колоссальное количество сетевых устройств работают под управлением Linux — маршрутизаторы, сетевые хранилища, медиаплееры, TV-боксы, планшеты, смартфоны и прочие «встраиваемые» и мобильные устройства.

К сожалению, рассмотреть весь пласт сетевых возможностей в рамках этой статьи, не представляется возможным, т. к. потребует от читателя серьезного понимания устройства и функционирования самих сетевых протоколов стека TCP/IP, что не является предметом настоящего рассмотрения.

Основополагающим результатом должно стать понимание принципов организации сетевого взаимодействия в Linux, необходимое и достаточное в  качестве базы для последующего самостоятельного расширенного и углубленного изучения. Не менее полезными в практике администратора и программиста будут навыки использования инструментов трассировки и мониторинга сетевых сокетов, а в особенно «непонятных» ситуациях навыки применения анализаторов пакетов.

Исключительное место (эдакий «швейцарский нож») среди прочих сетевых инструментов Linux займет служба SSH, при распределенном использовании оконной системы X Window System, являющейся основой современного графического интерфейса пользователя.

Добавить комментарий