Глубже, чем ifconfig: Маршруты, Сокеты и NAT.
🚀 Цель лекции
Понять, как ядро Linux принимает решения о пересылке пакетов. Мы проигнорируем 7 уровней OSI и сосредоточимся на практической модели TCP/IP. Мы разберемся, почему `ip` лучше `ifconfig`, `ss` лучше `netstat`, и что такое `iptables` на самом деле.
Забудьте про 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), и отдает "железке".
`ifconfig` устарел. Он не умеет показывать все IP-адреса на одном интерфейсе и не управляет маршрутизацией.
`ip` — это "швейцарский нож". Это не одна команда, а набор (ip link, ip addr, ip route).
-
Посмотреть "железки" (L1): Показывает интерфейсы, их MAC-адреса и состояние (UP/DOWN).
-
Посмотреть IP-адреса (L2): Показывает, какие IP "навешаны" на какие "железки".
💡 Pro-фишка: Почему на `ip a` несколько IP?
В Linux на один физический интерфейс (напр. `eth0`) можно "повесить" несколько IP-адресов. Например, `192.168.1.10` и `10.0.0.10`. `ifconfig` показывал это криво (через `eth0:1`), а `ip a` показывает честно. Это называется IP Aliasing.
Когда ядро получает 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):
- "Адрес 8.8.8.8 совпадает с `192.168.1.0/24`?" — Нет.
- "У меня есть более конкретные маршруты?" — Нет.
- "Остается только маршрут `default`. Отправляю пакет на шлюз `192.168.1.1` через интерфейс `eth0`."
Как ядро думает (когда вы шлете пакет на 192.168.1.50):
- "Адрес 192.168.1.50 совпадает с `192.168.1.0/24`?" — Да!
- "Отправляю пакет напрямую через `eth0`, шлюз не нужен."
Сокет — это конечная точка связи, "файл" в Linux, через который программа читает и пишет в сеть. Он определяется парой: `[IP:Порт]`.
Нам нужно знать, какие программы какие порты "слушают" (LISTEN).
-
`netstat` (старый способ): Медленный. Он читает `/proc` и парсит текстовые файлы. На сервере с тысячами соединений это занимает вечность.
-
`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").
`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
Самые важные утилиты для диагностики ("пинг не идет").
-
`ping` (L2/L3): Проверяет доступность хоста. Он шлет ICMP-пакет (IP-пакет, но без порта) и ждет ответа.
"Ты вообще жив?"
-
`traceroute` (L2): Показывает весь путь (все роутеры) до цели.
"Как до тебя добраться?"
# -I использует ICMP (как ping)
traceroute -I 8.8.8.8
-
`dig` (L4): Проверяет DNS.
"Какой IP у google.com?"
-
`curl` (L4): Проверяет прикладной уровень (HTTP).
"Ты не просто жив, ты отвечаешь как веб-сервер?"
# -I (head) - получить только заголовки
curl -I https://google.com
Вы видели свой 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`.