Лекция (PRO): Сеть в Linux

Глубже, чем ifconfig: Маршруты, Сокеты и NAT.

🚀 Цель лекции

Понять, как ядро Linux принимает решения о пересылке пакетов. Мы проигнорируем 7 уровней OSI и сосредоточимся на практической модели TCP/IP. Мы разберемся, почему `ip` лучше `ifconfig`, `ss` лучше `netstat`, и что такое `iptables` на самом деле.

1. Модель TCP/IP (На практике)

Забудьте про 7 уровней. В Linux все проще. Когда вы открываете сайт, происходит 4 вещи:

Уровень Что это (Аналогия) Протокол "Адрес"
L4: Прикладной Язык (что говорим) HTTP, SSH, DNS (данные)
L3: Транспортный Тип доставки (звонок / письмо) TCP (гарантированно), UDP (быстро) Порт (22, 80, 443)
L2: Сетевой Адрес дома (город, улица) IP (Internet Protocol) IP-адрес (1.2.3.4)
L1: Канальный "Последняя миля" (почтальон) Ethernet, Wi-Fi MAC-адрес (физический)

Ваш браузер (HTTP) просит у Linux "отправь это". Linux "упаковывает" HTTP в TCP-сегмент (указав порт 80), затем упаковывает TCP в IP-пакет (указав IP-адрес google.com), и отдает "железке".

2. Интерфейсы и Адреса (ip vs ifconfig)

`ifconfig` устарел. Он не умеет показывать все IP-адреса на одном интерфейсе и не управляет маршрутизацией.

`ip` — это "швейцарский нож". Это не одна команда, а набор (ip link, ip addr, ip route).

  • Посмотреть "железки" (L1): Показывает интерфейсы, их MAC-адреса и состояние (UP/DOWN).

    ip link show
  • Посмотреть IP-адреса (L2): Показывает, какие IP "навешаны" на какие "железки".

    ip addr show
    # или
    ip a
💡 Pro-фишка: Почему на `ip a` несколько IP?

В Linux на один физический интерфейс (напр. `eth0`) можно "повесить" несколько IP-адресов. Например, `192.168.1.10` и `10.0.0.10`. `ifconfig` показывал это криво (через `eth0:1`), а `ip a` показывает честно. Это называется IP Aliasing.

3. Маршрутизация (Как Ядро думает)

Когда ядро получает IP-пакет, оно смотрит на IP-адрес назначения и сверяется со своей таблицей маршрутизации. Это главный "мозг" сети.

Команда: `ip route show` (или `ip r`)

# 1. Маршрут по умолчанию (для всего, что мы не знаем)
default via 192.168.1.1 dev eth0

# 2. Маршрут в "свою" сеть (для соседей)
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100

Как ядро думает (когда вы шлете пакет на 8.8.8.8):

  1. "Адрес 8.8.8.8 совпадает с `192.168.1.0/24`?" — Нет.
  2. "У меня есть более конкретные маршруты?" — Нет.
  3. "Остается только маршрут `default`. Отправляю пакет на шлюз `192.168.1.1` через интерфейс `eth0`."

Как ядро думает (когда вы шлете пакет на 192.168.1.50):

  1. "Адрес 192.168.1.50 совпадает с `192.168.1.0/24`?" — Да!
  2. "Отправляю пакет напрямую через `eth0`, шлюз не нужен."

4. Сокеты (ss vs netstat)

Сокет — это конечная точка связи, "файл" в Linux, через который программа читает и пишет в сеть. Он определяется парой: `[IP:Порт]`.

Нам нужно знать, какие программы какие порты "слушают" (LISTEN).

  • `netstat` (старый способ): Медленный. Он читает `/proc` и парсит текстовые файлы. На сервере с тысячами соединений это занимает вечность.

    sudo netstat -tulnp
  • `ss` (Socket Statistics) (Pro-способ): Новый, быстрый. Он общается с ядром напрямую через специальный механизм. Работает мгновенно.

    # t - tcp, u - udp, l - listen, n - numeric, p - process
    sudo ss -tulnp

Вывод `ss` показывает кто (`pidof 'nginx'`) "сидит" на каком сокете (`0.0.0.0:80` - "слушаю порт 80 на всех IP").

5. Firewall (Netfilter / iptables)

`ufw` и `firewalld` — это "обертки". Настоящий firewall в ядре Linux называется Netfilter.

`iptables` (или `nftables`) — это утилита, которая "разговаривает" с Netfilter и загружает в него правила.

Netfilter — это "крючки" (hooks) в ядре. Когда IP-пакет приходит, ядро "ловит" его и прогоняет по цепочкам (chains) правил:

  • Цепочка `INPUT`: Пакет предназначен мне (моему серверу). Проверить правила.
  • Цепочка `FORWARD`: Пакет идет сквозь меня (я работаю как роутер). Проверить правила.
  • Цепочка `OUTPUT`: Пакет сгенерирован мной. Проверить правила.

Команда `sudo iptables -L -n -v` показывает эти цепочки. Правило `ufw allow ssh` на самом деле превращается в:

# "Добавить (-A) в цепочку INPUT правило:
#  если протокол (-p) tcp
#  и порт назначения (--dport) 22,
#  то прыгнуть (-j) на ACCEPT (пропустить)"
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

6. Практика (Pro-команды)

Самые важные утилиты для диагностики ("пинг не идет").

  • `ping` (L2/L3): Проверяет доступность хоста. Он шлет ICMP-пакет (IP-пакет, но без порта) и ждет ответа.
    "Ты вообще жив?"

    ping 8.8.8.8
  • `traceroute` (L2): Показывает весь путь (все роутеры) до цели.
    "Как до тебя добраться?"

    # -I использует ICMP (как ping)
    traceroute -I 8.8.8.8
  • `dig` (L4): Проверяет DNS.
    "Какой IP у google.com?"

    dig google.com
  • `curl` (L4): Проверяет прикладной уровень (HTTP).
    "Ты не просто жив, ты отвечаешь как веб-сервер?"

    # -I (head) - получить только заголовки
    curl -I https://google.com

7. В чем подвох? (NAT)

Вы видели свой IP на `ip a`? Он `192.168.1.100`. Если вы зайдете на `myip.ru`, он покажет `80.90.100.10`. Почему они разные?

Потому что вы сидите за NAT (Network Address Translation).

Адреса `192.168.x.x` (а также `10.x.x.x`) — "серые", немаршрутизируемые в Интернете. Ваш роутер (`192.168.1.1`) — это пограничник.

Аналогия: "Маскарад"

  • Вы (192.168.1.100) хотите отправить пакет в Google.
  • Вы шлете его на шлюз (роутер).
  • Роутер стирает ваш "серый" адрес `192.168.1.100` и вписывает свой "белый" `80.90.100.10` (это называется Source NAT или Masquerading).
  • Он записывает в журнал: "Пакет 123 от 192.168.1.100 ушел в Google".
  • Google отвечает на "белый" IP `80.90.100.10`.
  • Роутер получает ответ, смотрит в журнал: "Ага, это ответ на пакет 123. Он предназначался `192.168.1.100`". Роутер снова подменяет адрес назначения и шлет пакет вам.

Так 1000 компьютеров в офисе могут сидеть в Интернете под одним "белым" IP. В Linux за это отвечает специальная таблица `nat` в `iptables`.