<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Networking on DevOps Way - Практические гайды</title>
    <link>https://devopsway.ru/tags/networking/</link>
    <description>Recent content in Networking on DevOps Way - Практические гайды</description>
    <image>
      <title>DevOps Way - Практические гайды</title>
      <url>https://devopsway.ru/images/devopsway-og.png</url>
      <link>https://devopsway.ru/images/devopsway-og.png</link>
    </image>
    <generator>Hugo -- 0.163.3</generator>
    <language>ru</language>
    <lastBuildDate>Thu, 25 Jun 2026 18:20:09 +0300</lastBuildDate>
    <atom:link href="https://devopsway.ru/tags/networking/feed.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Networking 20/80, уровень 0: модель сети – что происходит, когда ты вводишь URL в браузер</title>
      <link>https://devopsway.ru/posts/networking-00-model/</link>
      <pubDate>Thu, 25 Jun 2026 12:00:00 +0300</pubDate>
      <guid>https://devopsway.ru/posts/networking-00-model/</guid>
      <description>Старт мини-курса по сетям для DevOps: 20% знаний, которые закрывают 80% работы. OSI против TCP/IP, инкапсуляция, путь запроса от curl до ответа сервера и какой инструмент диагностики живёт на каждом уровне.</description>
      <content:encoded><![CDATA[<p>Первый из семи уровней мини-курса «Networking 20/80»: 20% сетевых знаний, которые закрывают 80% ежедневной работы DevOps. Без зубрёжки семи слоёв OSI ради собеса – по делу. Сегодня карта местности: какие модели сети существуют и что на самом деле летает между твоим <code>curl</code> и ответом сервера.</p>
<blockquote>
<p>&ldquo;OSI – это не то, что нужно зубрить для собеса. Это карта, по которой ты ищешь, на каком уровне сломалось.&rdquo;</p>
</blockquote>
<hr>
<h2 id="откуда-это-пошло">Откуда это пошло</h2>
<p><strong>1969 – ARPANET.</strong> Агентство DARPA (Министерство обороны США) финансирует сеть между четырьмя университетами: UCLA, Stanford, UCSB, University of Utah. 29 октября 1969 года Charley Kline пытается отправить слово &ldquo;LOGIN&rdquo; из UCLA в Stanford. Система падает после &ldquo;LO&rdquo;. Первое сообщение в истории интернета – &ldquo;LO&rdquo;. (Позже шутили: &ldquo;Lo and behold&rdquo; – &ldquo;Вот и чудо&rdquo;.)</p>
<p><strong>1974 – Vint Cerf и Bob Kahn публикуют TCP.</strong> Проблема ARPANET: каждая сеть говорит на своём протоколе. TCP (позже разделённый на TCP + IP) решает задачу: один протокол для соединения РАЗНЫХ сетей. &ldquo;Inter-net&rdquo; – буквально &ldquo;между сетей&rdquo;.</p>
<p><strong>1984 – OSI модель.</strong> ISO (Международная организация по стандартизации) публикует &ldquo;идеальную&rdquo; семиуровневую модель. К этому моменту TCP/IP уже работает в реальном мире 10 лет. OSI – теоретическая модель, TCP/IP – практическая. Победил практик, но модель OSI осталась как <strong>язык для описания</strong> сетевых проблем.</p>
<hr>
<h2 id="две-модели-osi-и-tcpip">Две модели: OSI и TCP/IP</h2>
<h3 id="osi--7-уровней-для-собеса">OSI – 7 уровней (для собеса)</h3>
<table>
	<thead>
			<tr>
					<th>#</th>
					<th>Уровень</th>
					<th>Что на нём живёт</th>
					<th>Простыми словами</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>7</td>
					<td>Application</td>
					<td>HTTP, DNS, SSH, SMTP</td>
					<td>&ldquo;что говорим&rdquo;</td>
			</tr>
			<tr>
					<td>6</td>
					<td>Presentation</td>
					<td>SSL/TLS, сжатие, кодировки</td>
					<td>–</td>
			</tr>
			<tr>
					<td>5</td>
					<td>Session</td>
					<td>управление сессиями</td>
					<td>–</td>
			</tr>
			<tr>
					<td>4</td>
					<td>Transport</td>
					<td>TCP, UDP</td>
					<td>&ldquo;кому и как надёжно&rdquo;</td>
			</tr>
			<tr>
					<td>3</td>
					<td>Network</td>
					<td>IP, ICMP, маршрутизация</td>
					<td>&ldquo;по какому адресу&rdquo;</td>
			</tr>
			<tr>
					<td>2</td>
					<td>Data Link</td>
					<td>Ethernet, Wi-Fi, MAC-адреса</td>
					<td>&ldquo;по какому проводу&rdquo;</td>
			</tr>
			<tr>
					<td>1</td>
					<td>Physical</td>
					<td>кабели, сигналы, разъёмы</td>
					<td>&ldquo;физика&rdquo;</td>
			</tr>
	</tbody>
</table>
<h3 id="tcpip--4-уровня-реальность">TCP/IP – 4 уровня (реальность)</h3>
<table>
	<thead>
			<tr>
					<th>Уровень TCP/IP</th>
					<th>Что на нём живёт</th>
					<th>Соответствие OSI</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Application</td>
					<td>HTTP, DNS, SSH, SMTP</td>
					<td>5–7</td>
			</tr>
			<tr>
					<td>Transport</td>
					<td>TCP, UDP</td>
					<td>4</td>
			</tr>
			<tr>
					<td>Internet</td>
					<td>IP, ICMP</td>
					<td>3</td>
			</tr>
			<tr>
					<td>Link</td>
					<td>Ethernet, Wi-Fi</td>
					<td>1–2</td>
			</tr>
	</tbody>
</table>
<blockquote>
<p><strong>Системное мышление:</strong> OSI и TCP/IP – не конкуренты. OSI – язык для обсуждения (&ldquo;проблема на уровне 3&rdquo;). TCP/IP – реальный стек протоколов. На собесе знай оба, но понимай, что TCP/IP – то, с чем работаешь каждый день.</p>
</blockquote>
<h3 id="зачем-devops-у-знать-уровни">Зачем DevOps-у знать уровни</h3>
<p>Потому что <strong>уровень определяет инструмент диагностики</strong>:</p>
<table>
	<thead>
			<tr>
					<th>Уровень</th>
					<th>Симптом</th>
					<th>Инструмент</th>
					<th>Пример</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>1-2 (Link)</td>
					<td>&ldquo;Кабель выдернут&rdquo;, no carrier</td>
					<td><code>ip link</code>, <code>ethtool</code></td>
					<td>Interface DOWN</td>
			</tr>
			<tr>
					<td>3 (Network)</td>
					<td>&ldquo;Нет маршрута&rdquo;, destination unreachable</td>
					<td><code>ip route</code>, <code>ping</code>, <code>traceroute</code></td>
					<td>Pod не видит сервис</td>
			</tr>
			<tr>
					<td>4 (Transport)</td>
					<td>&ldquo;Connection refused&rdquo;, &ldquo;Connection timeout&rdquo;</td>
					<td><code>ss</code>, <code>netstat</code>, <code>tcpdump</code></td>
					<td>Порт не слушает</td>
			</tr>
			<tr>
					<td>7 (Application)</td>
					<td>&ldquo;502 Bad Gateway&rdquo;, &ldquo;TLS handshake failed&rdquo;</td>
					<td><code>curl -v</code>, <code>openssl s_client</code></td>
					<td>Nginx не может до бэкенда</td>
			</tr>
	</tbody>
</table>
<hr>
<h2 id="инкапсуляция--как-данные-упаковываются">Инкапсуляция – как данные упаковываются</h2>
<p>Когда ты делаешь <code>curl http://api:8080/health</code>, вот что происходит:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Ты:     &#34;GET /health HTTP/1.1&#34;
</span></span><span class="line"><span class="cl">            │
</span></span><span class="line"><span class="cl">            ▼
</span></span><span class="line"><span class="cl">┌──────────────────────────────────────────────┐
</span></span><span class="line"><span class="cl">│ HTTP Header: GET /health HTTP/1.1            │  ← Уровень 7: Application
</span></span><span class="line"><span class="cl">│              Host: api:8080                  │
</span></span><span class="line"><span class="cl">│ HTTP Body:   (пусто)                         │
</span></span><span class="line"><span class="cl">├──────────────────────────────────────────────┤
</span></span><span class="line"><span class="cl">│ TCP Header: src_port=54321, dst_port=8080    │  ← Уровень 4: Transport
</span></span><span class="line"><span class="cl">│             SEQ=1, ACK=0, SYN                │
</span></span><span class="line"><span class="cl">├──────────────────────────────────────────────┤
</span></span><span class="line"><span class="cl">│ IP Header:  src=10.0.0.5, dst=10.0.0.10      │  ← Уровень 3: Network
</span></span><span class="line"><span class="cl">│             TTL=64, Protocol=TCP             │
</span></span><span class="line"><span class="cl">├──────────────────────────────────────────────┤
</span></span><span class="line"><span class="cl">│ Ethernet:   src_mac=aa:bb:cc, dst_mac=dd:ee  │  ← Уровень 2: Link
</span></span><span class="line"><span class="cl">│             Type=IPv4                        │
</span></span><span class="line"><span class="cl">└──────────────────────────────────────────────┘
</span></span><span class="line"><span class="cl">            │
</span></span><span class="line"><span class="cl">            ▼
</span></span><span class="line"><span class="cl">        [биты по проводу]                         ← Уровень 1: Physical
</span></span></code></pre></div><p><strong>Аналогия с почтой:</strong></p>
<ul>
<li>Ты пишешь письмо (HTTP = текст письма)</li>
<li>Кладёшь в конверт, пишешь &ldquo;Кому: Иванову&rdquo; (TCP = надёжная доставка)</li>
<li>На конверте – индекс и адрес (IP = маршрутизация)</li>
<li>Конверт кладёшь в почтовый ящик (Ethernet = локальная доставка)</li>
<li>Почтальон несёт (Physical = провода)</li>
</ul>
<p>Получатель <strong>распаковывает в обратном порядке</strong>: Ethernet → IP → TCP → HTTP.</p>
<hr>
<h2 id="что-происходит-когда-ты-вводишь-url-в-браузер">&ldquo;Что происходит, когда ты вводишь URL в браузер&rdquo;</h2>
<p>Это классический вопрос на собесе. Ответ должен пройти по всем уровням:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">1. DNS (Уровень 7): браузер резолвит example.com → 93.184.216.34
</span></span><span class="line"><span class="cl">   └─ Проверяет: кеш браузера → кеш ОС → /etc/hosts → DNS-сервер
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">2. TCP (Уровень 4): трёхстороннее рукопожатие
</span></span><span class="line"><span class="cl">   └─ SYN → SYN-ACK → ACK (три пакета, ~30ms)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">3. TLS (Уровень 5-6): если HTTPS – ещё одно рукопожатие
</span></span><span class="line"><span class="cl">   └─ ClientHello → ServerHello → Certificate → Key Exchange (~50ms)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">4. HTTP (Уровень 7): отправляет GET / HTTP/1.1
</span></span><span class="line"><span class="cl">   └─ Заголовки: Host, User-Agent, Accept, Cookie
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">5. Сервер обрабатывает запрос
</span></span><span class="line"><span class="cl">   └─ nginx → reverse proxy → backend → DB → ответ
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">6. HTTP Response: 200 OK + HTML
</span></span><span class="line"><span class="cl">   └─ Заголовки: Content-Type, Content-Length, Set-Cookie
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">7. Браузер рендерит HTML
</span></span><span class="line"><span class="cl">   └─ Парсит HTML → запрашивает CSS, JS, изображения (каждый – отдельный запрос)
</span></span><span class="line"><span class="cl">   └─ Строит DOM → CSSOM → Layout → Paint
</span></span></code></pre></div><blockquote>
<p><strong>20/80:</strong> на собесе достаточно уверенно пройти шаги 1–6. Шаг 7 (рендеринг) – бонус для фронтендера, DevOps может пропустить.</p>
</blockquote>
<hr>
<h2 id="практика-инструменты-уровень-0">Практика: инструменты Уровень 0</h2>
<h3 id="ip--вместо-устаревшего-ifconfig">ip – вместо устаревшего ifconfig</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Показать сетевые интерфейсы:</span>
</span></span><span class="line"><span class="cl">ip addr show
</span></span><span class="line"><span class="cl"><span class="c1"># или короче:</span>
</span></span><span class="line"><span class="cl">ip a
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Результат:</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 1: lo: &lt;LOOPBACK,UP&gt; ...</span>
</span></span><span class="line"><span class="cl"><span class="c1">#     inet 127.0.0.1/8</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 2: eth0: &lt;BROADCAST,MULTICAST,UP&gt; ...</span>
</span></span><span class="line"><span class="cl"><span class="c1">#     inet 10.0.0.5/24</span>
</span></span><span class="line"><span class="cl"><span class="c1">#     inet6 fe80::1/64</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Показать только IPv4:</span>
</span></span><span class="line"><span class="cl">ip -4 addr show
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Показать маршруты:</span>
</span></span><span class="line"><span class="cl">ip route show
</span></span><span class="line"><span class="cl"><span class="c1"># или:</span>
</span></span><span class="line"><span class="cl">ip r
</span></span><span class="line"><span class="cl"><span class="c1"># default via 10.0.0.1 dev eth0       ← шлюз по умолчанию</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 10.0.0.0/24 dev eth0 proto kernel   ← локальная сеть</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 172.17.0.0/16 dev docker0           ← Docker bridge network</span>
</span></span></code></pre></div><blockquote>
<p><strong>Важно:</strong> <code>ifconfig</code> – deprecated с 2009 года (пакет <code>net-tools</code>). <code>ip</code> – современная замена (пакет <code>iproute2</code>). На собесе используй <code>ip</code>, не <code>ifconfig</code>.</p>
</blockquote>
<h3 id="ping--проверка-связности-уровень-3">ping – проверка связности (Уровень 3)</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Есть ли связь с хостом?</span>
</span></span><span class="line"><span class="cl">ping -c <span class="m">4</span> 8.8.8.8
</span></span><span class="line"><span class="cl"><span class="c1"># PING 8.8.8.8: 64 bytes from 8.8.8.8: icmp_seq=1 ttl=118 time=1.23 ms</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Что значит вывод:</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 64 bytes    – размер ответа</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ttl=118     – Time To Live (сколько маршрутизаторов осталось; начинал с 128, прошёл 10)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># time=1.23ms – Round Trip Time (туда и обратно)</span>
</span></span></code></pre></div><h3 id="traceroute--путь-пакета">traceroute – путь пакета</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Маршрут до хоста (каждый хоп = маршрутизатор):</span>
</span></span><span class="line"><span class="cl">traceroute 8.8.8.8
</span></span><span class="line"><span class="cl"><span class="c1">#  1  10.0.0.1      0.5 ms    ← шлюз (твой роутер)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#  2  172.16.0.1    2.1 ms    ← провайдер</span>
</span></span><span class="line"><span class="cl"><span class="c1">#  3  * * *                    ← маршрутизатор не отвечает (firewall)</span>
</span></span><span class="line"><span class="cl"><span class="c1">#  4  209.85.249.1  5.3 ms    ← Google</span>
</span></span><span class="line"><span class="cl"><span class="c1">#  5  8.8.8.8       6.1 ms    ← цель</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Более быстрый вариант (использует ICMP вместо UDP):</span>
</span></span><span class="line"><span class="cl">traceroute -I 8.8.8.8
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Ещё быстрее (параллельные пробы):</span>
</span></span><span class="line"><span class="cl">mtr 8.8.8.8    <span class="c1"># интерактивный traceroute + ping</span>
</span></span></code></pre></div><h3 id="где-это-видно-в-реальной-работе">Где это видно в реальной работе</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Проверка связности с твоим шлюзом:</span>
</span></span><span class="line"><span class="cl">ping 10.0.0.1
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Docker networking:</span>
</span></span><span class="line"><span class="cl">docker network ls
</span></span><span class="line"><span class="cl"><span class="c1"># NETWORK ID     NAME      DRIVER    SCOPE</span>
</span></span><span class="line"><span class="cl"><span class="c1"># abc123         bridge    bridge    local     ← дефолтная сеть</span>
</span></span><span class="line"><span class="cl"><span class="c1"># def456         host      host      local</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ghi789         none      null      local</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># K8s Services:</span>
</span></span><span class="line"><span class="cl">kubectl get svc
</span></span><span class="line"><span class="cl"><span class="c1"># NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># kubernetes   ClusterIP   10.96.0.1     &lt;none&gt;        443/TCP</span>
</span></span><span class="line"><span class="cl"><span class="c1"># api          ClusterIP   10.96.45.12   &lt;none&gt;        8080/TCP</span>
</span></span></code></pre></div><hr>
<h2 id="подвохи-для-собеса">Подвохи для собеса</h2>
<h3 id="подвох-1-назовите-7-уровней-osi-снизу-вверх">Подвох 1: &ldquo;Назовите 7 уровней OSI снизу вверх&rdquo;</h3>
<p><strong>Ответ:</strong> Physical, Data Link, Network, Transport, Session, Presentation, Application.</p>
<p>Мнемоника: <strong>P</strong>lease <strong>D</strong>o <strong>N</strong>ot <strong>T</strong>hrow <strong>S</strong>ausage <strong>P</strong>izza <strong>A</strong>way.</p>
<p><strong>Но!</strong> Не останавливайся на перечислении. Добавь:</p>
<p>&ldquo;В реальной работе я использую модель TCP/IP (4 уровня), потому что Session и Presentation слоёв отдельно не существует – они встроены в Application layer. OSI полезна как <em>язык коммуникации</em>: когда я говорю коллеге &ldquo;проблема на L3&rdquo;, он понимает, что я про маршрутизацию, а не про HTTP.&rdquo;</p>
<p><strong>Системное мышление:</strong> OSI – это <em>модель</em> (абстракция для понимания), а не <em>реализация</em> (код, который работает). TCP/IP – реализация. Знай модель, работай с реализацией.</p>
<hr>
<h3 id="подвох-2-чем-отличается-switch-от-router">Подвох 2: &ldquo;Чем отличается switch от router?&rdquo;</h3>
<p><strong>Ответ через уровни:</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Switch (коммутатор) – Уровень 2 (Data Link):
</span></span><span class="line"><span class="cl">  - Работает с MAC-адресами
</span></span><span class="line"><span class="cl">  - Соединяет устройства в ОДНОЙ сети (LAN)
</span></span><span class="line"><span class="cl">  - Знает: &#34;на порт 3 подключен MAC aa:bb:cc:dd:ee:ff&#34;
</span></span><span class="line"><span class="cl">  - Аналогия: почтальон внутри офисного здания
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Router (маршрутизатор) – Уровень 3 (Network):
</span></span><span class="line"><span class="cl">  - Работает с IP-адресами
</span></span><span class="line"><span class="cl">  - Соединяет РАЗНЫЕ сети
</span></span><span class="line"><span class="cl">  - Знает: &#34;сеть 10.0.0.0/24 через интерфейс eth0, сеть 192.168.0.0/24 через eth1&#34;
</span></span><span class="line"><span class="cl">  - Аналогия: почтовое отделение, которое решает, в какой город отправить
</span></span></code></pre></div><p><strong>На собесе:</strong> &ldquo;Switch коммутирует фреймы по MAC-адресам внутри одной сети. Router маршрутизирует пакеты по IP-адресам между разными сетями. Ваш домашний &ldquo;роутер&rdquo; – на самом деле и router, и switch, и Wi-Fi access point в одном корпусе. В data center они разделены.&rdquo;</p>
<hr>
<h3 id="подвох-3-что-такое-loopback-127001-и-зачем-он-нужен">Подвох 3: &ldquo;Что такое loopback (127.0.0.1) и зачем он нужен?&rdquo;</h3>
<p><strong>Ответ:</strong></p>
<p><code>127.0.0.1</code> (и вся сеть <code>127.0.0.0/8</code>) – виртуальный интерфейс <code>lo</code>, который никогда не покидает хост. Пакет, отправленный на 127.0.0.1, мгновенно &ldquo;возвращается&rdquo; обратно – не уходит в сеть, не проходит через сетевую карту.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Loopback интерфейс:</span>
</span></span><span class="line"><span class="cl">ip addr show lo
</span></span><span class="line"><span class="cl"><span class="c1"># 1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c1">#     inet 127.0.0.1/8 scope host lo</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Зачем нужен:</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 1. Тестирование: curl http://127.0.0.1:8080 – проверить, что сервис слушает</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 2. IPC: процессы общаются через TCP/UDP на localhost (PostgreSQL, Redis)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 3. Безопасность: bind на 127.0.0.1 = доступ только с этой машины</span>
</span></span></code></pre></div><p><strong>Ловушка для DevOps:</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Сервис слушает на 127.0.0.1:</span>
</span></span><span class="line"><span class="cl">ss -tlnp <span class="p">|</span> grep <span class="m">5432</span>
</span></span><span class="line"><span class="cl"><span class="c1"># LISTEN  127.0.0.1:5432    ← PostgreSQL слушает ТОЛЬКО localhost</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Другая машина не сможет подключиться:</span>
</span></span><span class="line"><span class="cl">psql -h 10.0.0.5 -p <span class="m">5432</span>    <span class="c1"># → Connection refused!</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Решение: bind на 0.0.0.0 (все интерфейсы):</span>
</span></span><span class="line"><span class="cl"><span class="c1"># postgresql.conf: listen_addresses = &#39;*&#39;</span>
</span></span></code></pre></div><p><strong>На собесе:</strong> &ldquo;127.0.0.1 – loopback. 0.0.0.0 – все интерфейсы. Сервис на 127.0.0.1 виден только локально. Сервис на 0.0.0.0 доступен с любого IP хоста. Частая ошибка – приложение слушает на 127.0.0.1 в Docker-контейнере, и к нему невозможно подключиться снаружи, потому что контейнер – это отдельный network namespace.&rdquo;</p>
<hr>
<h2 id="код-челлендж">Код-челлендж</h2>
<p><strong>Задача:</strong> на любой Linux-машине выполни диагностику сети и ответь на вопросы:</p>
<ol>
<li>Какой IP-адрес у eth0?</li>
<li>Какой шлюз по умолчанию (default gateway)?</li>
<li>Сколько хопов до 8.8.8.8?</li>
<li>Какие Docker-сети существуют и какие у них подсети?</li>
</ol>
<details>
<summary>Решение</summary>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 1. IP eth0:</span>
</span></span><span class="line"><span class="cl">ip -4 addr show eth0 <span class="p">|</span> grep inet
</span></span><span class="line"><span class="cl"><span class="c1"># inet 10.0.0.5/24</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2. Default gateway:</span>
</span></span><span class="line"><span class="cl">ip route <span class="p">|</span> grep default
</span></span><span class="line"><span class="cl"><span class="c1"># default via 10.0.0.1 dev eth0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 3. Хопы до 8.8.8.8:</span>
</span></span><span class="line"><span class="cl">traceroute -I -m <span class="m">15</span> 8.8.8.8 <span class="p">|</span> tail -1
</span></span><span class="line"><span class="cl"><span class="c1"># Номер последней строки = количество хопов</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 4. Docker-сети:</span>
</span></span><span class="line"><span class="cl">docker network ls
</span></span><span class="line"><span class="cl">docker network inspect bridge <span class="p">|</span> grep -A5 IPAM
</span></span><span class="line"><span class="cl"><span class="c1"># &#34;Subnet&#34;: &#34;172.17.0.0/16&#34;, &#34;Gateway&#34;: &#34;172.17.0.1&#34;</span>
</span></span></code></pre></div></details>
<hr>
<h2 id="дальше--уровень-1">Дальше → Уровень 1</h2>
<p>Ты понимаешь модель: данные путешествуют по уровням, каждый уровень добавляет свой заголовок. Ты знаешь, что <code>ip addr</code> показывает адреса, <code>ip route</code> – маршруты, <code>ping</code> – связность.</p>
<p>Но откуда берутся эти адреса? Почему <code>10.0.0.5/24</code> – приватный, а <code>93.184.216.34</code> – публичный? Что значит <code>/24</code>? Сколько хостов поместится в сеть <code>/16</code>? Как разбить одну сеть на подсети для разных окружений (dev, staging, prod)?</p>
<p>IP-адресация – это математика DevOps. Её не нужно &ldquo;понимать глубоко&rdquo; – нужно уметь считать.</p>
<p><strong>→ Уровень 1: IP-адреса и подсети – математика DevOps</strong></p>
]]></content:encoded>
    </item>
  </channel>
</rss>
