<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>@usr_bin_linux</title><author><name>@usr_bin_linux</name></author><id>https://teletype.in/atom/usr_bin_linux</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/usr_bin_linux?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@usr_bin_linux?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=usr_bin_linux"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/usr_bin_linux?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-04-16T13:22:34.591Z</updated><entry><id>usr_bin_linux:linux-security</id><link rel="alternate" type="text/html" href="https://teletype.in/@usr_bin_linux/linux-security?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=usr_bin_linux"></link><title>Безопасность системы Linux: как предотвратить «плохие действия» других пользователей на общем сервере</title><published>2026-03-01T21:21:02.549Z</published><updated>2026-03-01T21:21:02.549Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/10/e1/10e1f33e-707d-48fd-a4d3-c5ee071302b5.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*QsY1U8eG-_NXNBhh5FUkfg.png&quot;&gt;Это перевод оригинальной статьи Linux System Security: How To Prevent Others From Doing “Bad Things” on a Shared Server.</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;MNis&quot;&gt;Это перевод оригинальной статьи &lt;a href=&quot;https://osintteam.blog/linux-system-security-how-to-prevent-others-from-doing-bad-things-on-a-shared-server-7757e08149bc&quot; target=&quot;_blank&quot;&gt;Linux System Security: How To Prevent Others From Doing “Bad Things” on a Shared Server&lt;/a&gt;.&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;n1NI&quot;&gt;Подписывайтесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;ce97&quot;&gt;В процессе разработки приложения необходимо учитывать ряд аспектов, включая код, операционную систему, сеть и базу данных. Поэтому простого понимания безопасности кода недостаточно; необходимо также понимать общие механизмы безопасности в базовых средах и инструментах. Правильно настроив эти механизмы безопасности, можно повысить общую безопасность.&lt;/p&gt;
  &lt;p id=&quot;0380&quot;&gt;Когда речь заходит о Linux, многие из вас, вероятно, ежедневно используют его для различных задач разработки и эксплуатации. Однако в большинстве случаев компании не выделяют каждому сотруднику отдельный сервер Linux. Вместо этого несколько разработчиков и сотрудников службы эксплуатации используют один сервер Linux. Возникает вопрос: повлияют ли действия других сотрудников, использующих сервер Linux, на наши собственные данные и процессы? Кроме того, учитывая, что хакеры могут использовать различные уязвимости для управления сервером Linux, как можно предотвратить и минимизировать ущерб, наносимый такими вторжениями?&lt;/p&gt;
  &lt;h2 id=&quot;b764&quot;&gt;Понимание модели безопасности в Linux&lt;/h2&gt;
  &lt;p id=&quot;d70f&quot;&gt;Для эффективного решения проблем безопасности необходимо сначала понять модель безопасности Linux. Давайте разделим компоненты Linux на два уровня: уровень ядра и уровень пользователя. Уровень пользователя выполняет различные задачи, используя интерфейсы, предоставляемые уровнем ядра.&lt;/p&gt;
  &lt;p id=&quot;9488&quot;&gt;Уровень ядра обеспечивает важнейшие функции безопасности, такие как сегментация прав доступа, изоляция процессов и защита памяти, формируя основу безопасности пользовательского уровня. Если безопасность ядра нарушена (например, хакер может изменить логику ядра), он может произвольно изменять права доступа, манипулировать процессами и получать доступ к памяти. В таких случаях любые меры безопасности, реализованные на пользовательском уровне, теряют смысл.&lt;/p&gt;
  &lt;p id=&quot;7cca&quot;&gt;Учитывая критическую важность безопасности ядра в Linux, стоит ли нам вкладывать значительные усилия в её защиту? На самом деле, подобно тому, как мы не слишком беспокоимся о деталях операционной системы при разработке приложений (особенно при использовании языков высокого уровня, таких как Java), нам не нужно уделять слишком много внимания безопасности ядра при рассмотрении безопасности Linux. Вместо этого следует сосредоточиться в первую очередь на безопасности пользовательского уровня. Для безопасности уровня ядра достаточно следовать рекомендациям по защите от известных уязвимостей, например, использовать официальные образы и регулярно их обновлять.&lt;/p&gt;
  &lt;p id=&quot;c1ce&quot;&gt;Поскольку большинство взаимодействий происходит на пользовательском уровне, давайте рассмотрим операции на этом уровне. В Linux все операции пользовательского уровня можно абстрагировать в следующий процесс: «Субъект -&amp;gt; Запрос -&amp;gt; Объект». Например, в операции «open &lt;code&gt;/etc/passwd&lt;/code&gt;» субъект — это сам пользователь, запрос — операция чтения, а объект — файл &lt;code&gt;/etc/passwd&lt;/code&gt;.&lt;/p&gt;
  &lt;figure id=&quot;K86d&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*QsY1U8eG-_NXNBhh5FUkfg.png&quot; width=&quot;700&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;104f&quot;&gt;В этом процессе система безопасности ядра Linux обеспечивает контроль доступа на основе разрешений, предотвращая несанкционированный доступ к данным. Уровень пользователя Linux должен обеспечивать правильную настройку разрешений. Это ключ к безопасному совместному использованию сервера несколькими пользователями, что также является основной темой данной статьи.&lt;/p&gt;
  &lt;h2 id=&quot;2e1c&quot;&gt;Как золотое правило применяется в системах Linux?&lt;/h2&gt;
  &lt;p id=&quot;ad98&quot;&gt;Теперь, когда мы знаем, что основой безопасности систем Linux является правильная настройка прав доступа на уровне пользователя, давайте рассмотрим, как принципы Золотого правила аутентификации, авторизации и аудита применяются в системах Linux. Мы также выделим ключевые параметры безопасности, на которые следует обратить внимание в этих областях.&lt;/p&gt;
  &lt;h3 id=&quot;09c3&quot;&gt;1. Механизмы аутентификации в Linux&lt;/h3&gt;
  &lt;p id=&quot;9fe7&quot;&gt;Linux — многопользовательская операционная система, которая управляет и хранит пользовательскую информацию с помощью простых текстовых файлов. В этом контексте два важнейших файла: &lt;code&gt;/etc/passwd&lt;/code&gt; и &lt;code&gt;/etc/shadow&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;408b&quot;&gt;В Linux файл &lt;code&gt;/etc/passwd&lt;/code&gt; доступен для чтения всем пользователям и не хранит пароли напрямую из соображений безопасности. Вместо этого в поле пароля используется символ &lt;code&gt;&amp;#x27;x&amp;#x27;&lt;/code&gt; как заглушка. Информация о пароле пользователя хранится в файле &lt;code&gt;/etc/shadow&lt;/code&gt;, доступном для чтения только пользователю ROOT.&lt;/p&gt;
  &lt;p id=&quot;3aa9&quot;&gt;Файл &lt;code&gt;/etc/shadow&lt;/code&gt; содержит не только зашифрованные пароли, но и другие политики управления паролями, такие как количество дней, в течение которых пароль действителен, или количество дней до истечения срока действия пароля, по истечении которых должно быть выдано предупреждение. Мы можем изменить эти политики управления паролями с помощью команды &lt;code&gt;chage&lt;/code&gt;. Например, следующая команда &lt;code&gt;chage&lt;/code&gt; заставляет тестового пользователя менять пароль каждые 60 дней, тем самым снижая вероятность утечки пароля:&lt;/p&gt;
  &lt;pre id=&quot;su8D&quot; data-lang=&quot;bash&quot;&gt;chage -M 60 test&lt;/pre&gt;
  &lt;p id=&quot;0b3b&quot;&gt;Поскольку аутентификация — это функция, предоставляемая ядром Linux, проблема безопасности, на которой необходимо сосредоточиться на уровне пользователя, — это утечка идентификационной информации из-за слабых паролей. Для решения этой проблемы можно настроить соответствующие политики паролей в файле &lt;code&gt;/etc/shadow&lt;/code&gt;. Кроме того, можно использовать такие инструменты, как John the Ripper, для обнаружения слабых паролей в Linux, используя известные базы данных слабых паролей. Следующая команда демонстрирует, как использовать John the Ripper для обнаружения слабых паролей:&lt;/p&gt;
  &lt;pre id=&quot;CDLM&quot; data-lang=&quot;bash&quot;&gt;unshadow /etc/passwd /etc/shadow &amp;gt; mypasswd
john mypasswd
john --show mypassw&lt;/pre&gt;
  &lt;h3 id=&quot;452d&quot;&gt;2. Механизм авторизации в Linux&lt;/h3&gt;
  &lt;p id=&quot;77a9&quot;&gt;Согласно «золотому правилу», аутентификация — это лишь первый шаг, предоставляющий доверенную идентификацию. После получения этой идентификации необходимо обеспечить авторизацию, чтобы ограничить действия, которые может выполнять пользователь.&lt;/p&gt;
  &lt;p id=&quot;a708&quot;&gt;В Linux объектами (также известными как субъекты) являются только файлы и каталоги. Для этих двух типов объектов Linux определяет три типа прав доступа: чтение, запись и выполнение. Различия между этими правами доступа для файлов и каталогов можно увидеть в представленной сравнительной таблице:&lt;/p&gt;
  &lt;figure id=&quot;iZQP&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*uZDR8S60xzbYmmDdJ3cTCA.png&quot; width=&quot;700&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;cf78&quot;&gt;Помимо этих стандартных разрешений, Linux предоставляет дополнительные теги разрешений для более детального управления. Например, Linux предлагает атрибуты файлов для дополнительной защиты. Установив бит неизменяемости с помощью &lt;code&gt;chattr +i /etc/passwd&lt;/code&gt;, вы можете запретить любому пользователю изменять файл. Подробнее об атрибутах файлов можно найти в Википедии.&lt;/p&gt;
  &lt;p id=&quot;79d5&quot;&gt;Ещё одна функция Linux — это «sticky bit», который в первую очередь используется для предотвращения манипуляций пользователей с файлами других пользователей. Например, команда &lt;code&gt;chmod +t /tmp&lt;/code&gt; может запретить пользователям удалять файлы в директории &lt;code&gt;/tmp&lt;/code&gt;, принадлежащем другим пользователям.&lt;/p&gt;
  &lt;p id=&quot;4ca5&quot;&gt;Это механизмы самозащиты при авторизации Linux, но как мы можем активно обеспечить безопасность этого процесса?&lt;/p&gt;
  &lt;p id=&quot;1b23&quot;&gt;Ранее мы подчеркивали, что основная угроза безопасности в системах Linux связана с правами доступа. Это означает, что либо конфиденциальные файлы имеют неправильно настроенные права доступа, что позволяет другим пользователям получать к ним доступ или выполнять их, либо приложения содержат уязвимости или утечку паролей, что позволяет пользователям с низким уровнем привилегий получать более высокие привилегии.&lt;/p&gt;
  &lt;p id=&quot;100c&quot;&gt;&lt;strong&gt;Чтобы решить проблемы с разрешениями, нам следует придерживаться принципа наименьших привилегий.&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;ed1b&quot;&gt;Давайте рассмотрим одну из самых распространённых проблем безопасности в системах Linux: неправильное использование прав ROOT. Многие пользователи, входя в систему Linux, первым делом запускают команду &lt;code&gt;su&lt;/code&gt; чтобы получить полноценную оболочку ROOT-пользователя. Таким образом, им не придётся каждый раз временно повышать привилегии до уровня ROOT с помощью команды &lt;code&gt;sudo&lt;/code&gt; для выполнения каждой операции.&lt;/p&gt;
  &lt;p id=&quot;22ee&quot;&gt;Однако следует отметить важный момент: в среде ROOT-оболочки все запущенные процессы также имеют привилегии ROOT. Если вы запустите быстровозвращающийся процесс, например, &lt;code&gt;cat&lt;/code&gt;, это не создаст особых проблем. Но если это длительный процесс, это может легко привести к злоупотреблению привилегиями.&lt;/p&gt;
  &lt;p id=&quot;5523&quot;&gt;Например, если вы запустите Redis или MySQL от имени пользователя ROOT, любой другой пользователь, подключающийся к этим службам, может косвенно получить привилегии ROOT. В большинстве случаев взлома сервера хакеры используют уязвимости в этих процессах с привилегиями ROOT для повышения своих привилегий.&lt;/p&gt;
  &lt;p id=&quot;1ffc&quot;&gt;Поэтому при запуске любых долговременных процессов необходимо придерживаться принципа наименьших привилегий. Это означает настройку минимально необходимых прав для запуска резидентных процессов в зависимости от требуемого уровня операций. Например, операции чтения/записи файлов в таких базах данных, как Redis и MySQL, не требуют наивысших привилегий ROOT.&lt;/p&gt;
  &lt;p id=&quot;93bd&quot;&gt;Принцип наименьших привилегий критически важен в системах Linux. Вы можете спросить: при таком количестве операций в Linux, для каждой из них нужна индивидуальная настройка прав доступа? К счастью, это не так. Мы часто используем известные инструменты для реализации принципа наименьших привилегий при запуске резидентных процессов, и ваша задача — правильно запустить или настроить эти инструменты.&lt;/p&gt;
  &lt;p id=&quot;7f67&quot;&gt;Например, вы можете запустить службу MySQL, используя &lt;code&gt;mysqld&lt;/code&gt;, которая выделяет процессы MySQL пользователю &amp;quot;mysql&amp;quot; и запускает демон под ROOT-аккаунтом. Вот как это выглядит на практике:&lt;/p&gt;
  &lt;pre id=&quot;kDAU&quot; data-lang=&quot;bash&quot;&gt;root     297353  0.0  0.0 115432  1360 ?        S    Aug12   0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/var/lib/mysql --pid-file=/var/lib/mysql/mysql.pid
mysql    297553 31.3  4.3 11282756 5729572 ?    Sl   Aug12 22593:40 /usr/local/mysql/bin/m&lt;/pre&gt;
  &lt;p id=&quot;972d&quot;&gt;Аналогично, при запуске Nginx, Nginx будет запускать рабочие процессы от имени пользователя «nobody». Конкретный эффект будет следующим:&lt;/p&gt;
  &lt;pre id=&quot;Z9zN&quot; data-lang=&quot;bash&quot;&gt;root       7083  0.0  0.0  61032  5324 ?        Ss   Aug12   0:01 nginx: master process nginx
nobody   331122  0.0  0.0  90768 31776 ?        S    11:44   0:00 nginx: worker process
nobody   331123  0.0  0.0  90768 32720 ?        S    11:44   0:00 nginx: worker process
nobody   331124  0.0  0.0  90768 31776 ?        S    11:44   0:00 nginx: worker process&lt;/pre&gt;
  &lt;p id=&quot;9adc&quot;&gt;Конечно, некоторые инструменты не предоставляют возможности переключения на пользователя с минимальными привилегиями. Например, при запуске Redis напрямую с помощью &lt;code&gt;redis-server&lt;/code&gt;, нам необходимо самостоятельно управлять переключением удостоверений пользователей. Итак, как же переключить удостоверения пользователей?&lt;/p&gt;
  &lt;p id=&quot;feb1&quot;&gt;Давайте сначала рассмотрим пример Nginx. При запуске Nginx Linux предоставляет идентификатор «nobody». Фактически, когда кто-либо входит в систему Linux, первым полученным идентификатором пользователя является «nobody», а затем он переключается на другие обычные идентификаторы пользователя с «nobody».&lt;/p&gt;
  &lt;p id=&quot;5c29&quot;&gt;Таким образом, у пользователя «nobody» обычно есть минимальные права в операционной системе. Поэтому для инструментов, не предоставляющих минимальной функциональности переключения привилегий, мы можем использовать идентификатор пользователя «nobody» для ручного переключения.&lt;/p&gt;
  &lt;p id=&quot;7607&quot;&gt;При запуске Redis с помощью &lt;code&gt;redis-server&lt;/code&gt; мы можем использовать следующую команду для запуска &lt;code&gt;redis-server&lt;/code&gt;от имени пользователя «nobody» (при условии, что мы соответствующим образом настроили каталоги для журналов и PID, чтобы гарантировать возможность записи от имени пользователя «nobody»):&lt;/p&gt;
  &lt;pre id=&quot;3sNg&quot; data-lang=&quot;bash&quot;&gt;su -s /bin/redis-server nobody&lt;/pre&gt;
  &lt;p id=&quot;c3f0&quot;&gt;Применяя принцип «наименьших привилегий», мы можем повысить безопасность авторизации системы Linux.&lt;/p&gt;
  &lt;h3 id=&quot;f58e&quot;&gt;3. Механизм аудита в Linux&lt;/h3&gt;
  &lt;p id=&quot;df12&quot;&gt;Как мы уже обсуждали ранее, аудит в контексте «золотых правил» в основном включает в себя ведение журнала и анализ. Итак, какие типы журналов существуют в системе Linux? В Linux информация системного журнала обычно хранится в каталоге &lt;code&gt;/var/log&lt;/code&gt;, и некоторые приложения также регистрируют соответствующую информацию в этом каталоге. Системные журналы в основном делятся на три категории: журналы входа пользователей, журналы специальных событий и журналы процессов.&lt;/p&gt;
  &lt;p id=&quot;4d9a&quot;&gt;Журналы входа пользователей — это,в основном, файлы &lt;code&gt;/var/log/wtmp&lt;/code&gt; и &lt;code&gt;/var/run/utmp&lt;/code&gt;, в которых хранится информация, связанная с входами пользователей. Журналы входа пользователей представляют собой двоичные файлы и не могут быть просмотрены напрямую в текстовом формате, но к ним можно получить доступ с помощью таких команд, как &lt;code&gt;who&lt;/code&gt;, &lt;code&gt;users&lt;/code&gt;, &lt;code&gt;ac&lt;/code&gt;, &lt;code&gt;last&lt;/code&gt; и &lt;code&gt;lastlog&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;047c&quot;&gt;Журналы специальных событий включают в себя &lt;code&gt;/var/log/secure&lt;/code&gt; и &lt;code&gt;/var/log/message&lt;/code&gt;. В &lt;code&gt;/var/log/secure&lt;/code&gt; в основном регистрируются записи, связанные с аутентификацией и авторизацией. Например, если кто-то попытается взломать SSH методом подбора пароля, этот журнал предоставит информацию о таких попытках. Файл &lt;code&gt;/var/log/message&lt;/code&gt; поддерживается демоном &lt;code&gt;syslogd&lt;/code&gt;, который предоставляет стандартный механизм записи специальных событий и сообщений. Другие приложения могут использовать этот демон для сообщения о специальных событиях.&lt;/p&gt;
  &lt;p id=&quot;37d7&quot;&gt;Журналы процессов: Когда управление системными процессами выполняется с помощью &lt;code&gt;accton&lt;/code&gt;, создается файл, называемый &lt;code&gt;pacct&lt;/code&gt;, в котором записываются команды пользователя.&lt;/p&gt;
  &lt;p id=&quot;f682&quot;&gt;По умолчанию Linux использует &lt;code&gt;logrotate&lt;/code&gt; для управления стратегиями хранения журналов (такими как ротация журналов и удаление старых журналов). Политики хранения для различных журналов можно изменить, настроив &lt;code&gt;/etc/logrotate.conf&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;e35c&quot;&gt;Итак, как же нам отслеживать журналы? Я рекомендую два распространённых инструмента для анализа журналов: ELK и Zabbix. Эти инструменты можно использовать для мониторинга журналов безопасности Linux. Настроив соответствующие правила на этих аналитических платформах (например, обнаружение более трёх неудачных попыток входа по SSH), мы можем оперативно выявлять попытки вторжения со стороны хакеров и оперативно генерировать оповещения. Затем мы можем вручную проверять журналы для решения конкретных проблем.&lt;/p&gt;
  &lt;h2 id=&quot;084a&quot;&gt;Заключение&lt;/h2&gt;
  &lt;p id=&quot;cd68&quot;&gt;Безопасность систем Linux можно считать платформой с наилучшими практиками для принципа «минимальных привилегий», особенно когда несколько пользователей совместно используют и обслуживают один сервер. Правильная настройка прав доступа в таких ситуациях может быть довольно сложной. Для решения этой проблемы необходимо строго ограничить использование привилегий ROOT. Кроме того, реализация контроля доступа с помощью &lt;code&gt;iptables&lt;/code&gt; также может обеспечить существенную защиту от уязвимостей процессов.&lt;/p&gt;
  &lt;p id=&quot;a8b3&quot;&gt;Помимо механизмов самозащиты системы Linux, существуют различные инструменты безопасности, обеспечивающие дополнительные уровни защиты (например, антивирусное ПО и системы обнаружения вторжений на уровне хоста).&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;TPZY&quot;&gt;На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где будет еще больше полезной информации.&lt;/p&gt;
  &lt;/section&gt;

</content></entry><entry><id>usr_bin_linux:7-levels-of-app-debug</id><link rel="alternate" type="text/html" href="https://teletype.in/@usr_bin_linux/7-levels-of-app-debug?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=usr_bin_linux"></link><title>Каждый баг, который я когда-либо исправлял, начинал иметь смысл только после того, как я понял эти 7 уровней</title><published>2026-03-01T21:12:56.156Z</published><updated>2026-03-01T21:12:56.156Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/02/e5/02e59ae1-b931-4a30-a376-c4e262864c2b.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/0*VaxXc0pALaZGORw1&quot;&gt;Это перевод оригинальной статьи Every Bug I Ever Fixed Made Sense Only After I Understood These 7 Layers.</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;32Ey&quot;&gt;Это перевод оригинальной статьи &lt;a href=&quot;https://medium.com/@kanishks772/every-bug-i-ever-fixed-made-sense-only-after-i-understood-these-7-layers-ebcae423399b&quot; target=&quot;_blank&quot;&gt;Every Bug I Ever Fixed Made Sense Only After I Understood These 7 Layers&lt;/a&gt;.&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;lAtb&quot;&gt;Подписывайтесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;f718&quot;&gt;Спустя три года работы я потратил две недели на отладку причин, по которым наш API случайным образом возвращал ошибки 502. Логи были чистыми. Приложение работало исправно. Все указывало на то, что проблем нет. &lt;/p&gt;
  &lt;p id=&quot;ac62&quot;&gt;Затем мимо проходил сетевой инженер и спросил: «А ты проверял, совпадает ли таймаут keepalive у балансировщика нагрузки с таймаутом сервера приложения?»&lt;/p&gt;
  &lt;figure id=&quot;U4mu&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/0*VaxXc0pALaZGORw1&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;Изображение, сгенерированное искусственным интеллектом&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;blockquote id=&quot;NHrf&quot;&gt;Тогда меня осенило. Я занимался отладкой не на том уровне.&lt;/blockquote&gt;
  &lt;h2 id=&quot;956a&quot;&gt;Семь уровней, которые действительно имеют значение&lt;/h2&gt;
  &lt;p id=&quot;b780&quot;&gt;Модель OSI — это не какое-то академическое упражнение, которое нужно заучивать наизусть для собеседований. Это ментальная модель, которая позволяет не тратить дни, копаясь не там, где нужно.&lt;/p&gt;
  &lt;pre id=&quot;SB6u&quot; data-lang=&quot;bash&quot;&gt;Layer 7: Application    [HTTP, DNS, SSH]
Layer 6: Presentation   [TLS, Compression]
Layer 5: Session        [Auth, Connections]
Layer 4: Transport      [TCP, UDP]
Layer 3: Network        [IP, Routing]
Layer 2: Data Link      [Ethernet, MAC]
Layer 1: Physical       [Cables, Signals]&lt;/pre&gt;
  &lt;p id=&quot;3a0d&quot;&gt;Вот что на самом деле происходит при обращении к API:&lt;/p&gt;
  &lt;pre id=&quot;3qJ2&quot; data-lang=&quot;bash&quot;&gt;User Request
    |
    v
[Application Layer] - Parse HTTP request
    |
    v
[Transport Layer]   - Establish TCP connection
    |
    v
[Network Layer]     - Route packets via IP
    |
    v
[Data Link Layer]   - Frame data for physical transmission
    |
    v
[Physical Layer]    - Transmit bits over wire&lt;/pre&gt;
  &lt;h3 id=&quot;6aa5&quot;&gt;Уровень 7: Прикладной уровень&lt;/h3&gt;
  &lt;p id=&quot;a462&quot;&gt;Здесь работает большинство разработчиков. Коды состояния HTTP, ответы API, запросы к базе данных. Но вот чего они не говорят: большинство «ошибок в приложениях» на самом деле не являются ошибками приложения.&lt;/p&gt;
  &lt;blockquote id=&quot;wNIH&quot;&gt;&lt;strong&gt;Реальная ошибка:&lt;/strong&gt; Пользователи жаловались, что эндпоинт загрузки файлов «не работает». API возвращал &lt;code&gt;200 OK&lt;/code&gt;, но файлы не отображались.&lt;/blockquote&gt;
  &lt;pre id=&quot;Bj0J&quot; data-lang=&quot;bash&quot;&gt;// The problematic code
func uploadHandler(w http.ResponseWriter, r *http.Request) {
    file, _, err := r.FormFile(&amp;quot;file&amp;quot;)
    if err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }
    defer file.Close()
    
    // Processing happens here
    w.WriteHeader(http.StatusOK)
    json.NewEncoder(w).Encode(map[string]string{&amp;quot;status&amp;quot;: &amp;quot;success&amp;quot;})
}&lt;/pre&gt;
  &lt;p id=&quot;ca8b&quot;&gt;В чём проблема? Большие файлы (свыше 50 МБ) &lt;strong&gt;тихо отклонялись nginx&lt;/strong&gt; ещё до того, как запрос доходил до приложения. Код &lt;code&gt;200&lt;/code&gt; приходил от другого запроса, который успешно обработался.&lt;/p&gt;
  &lt;p id=&quot;9f2e&quot;&gt;&lt;strong&gt;Исправление находилось на три уровня ниже:&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;zb60&quot; data-lang=&quot;bash&quot;&gt;# /etc/nginx/nginx.conf
client_max_body_size 100M;&lt;/pre&gt;
  &lt;h3 id=&quot;cd64&quot;&gt;Уровень 4: Транспортный уровень&lt;/h3&gt;
  &lt;p id=&quot;fa6b&quot;&gt;TCP против UDP. Таймауты соединения. Исчерпание портов. Этот уровень разрушил бесчисленное количество карьер.&lt;/p&gt;
  &lt;blockquote id=&quot;qgAy&quot;&gt;&lt;strong&gt;Классический сценарий:&lt;/strong&gt; приложение перестаёт отвечать под нагрузкой, но показатели процессора и памяти в норме.&lt;/blockquote&gt;
  &lt;pre id=&quot;BtUM&quot; data-lang=&quot;bash&quot;&gt;# Check current connections
ss -s

# Output showing the problem
TCP: 28547 (estab 1034, closed 27500, orphaned 12, timewait 27488)&lt;/pre&gt;
  &lt;p id=&quot;9ab2&quot;&gt;27 488 соединений находятся в состоянии TIME_WAIT. Ядру не хватило доступных портов.&lt;/p&gt;
  &lt;pre id=&quot;dnBA&quot; data-lang=&quot;bash&quot;&gt;// Before (bad) - Creates new connection every time
func fetchUsers(userIDs []string) error {
    for _, id := range userIDs {
        resp, err := http.Get(fmt.Sprintf(&amp;quot;https://api.example.com/user/%s&amp;quot;, id))
        if err != nil {
            return err
        }
        defer resp.Body.Close()
        // Process response
    }
    return nil
}

// After (good) - Reuses connections
var client = &amp;amp;http.Client{
    Timeout: 10 * time.Second,
    Transport: &amp;amp;http.Transport{
        MaxIdleConns:        100,
        MaxIdleConnsPerHost: 10,
        IdleConnTimeout:     90 * time.Second,
    },
}

func fetchUsers(userIDs []string) error {
    for _, id := range userIDs {
        resp, err := client.Get(fmt.Sprintf(&amp;quot;https://api.example.com/user/%s&amp;quot;, id))
        if err != nil {
            return err
        }
        defer resp.Body.Close()
        // Process response
    }
    return nil
}&lt;/pre&gt;
  &lt;blockquote id=&quot;RcwH&quot;&gt;&lt;strong&gt;Результаты теста производительности:&lt;/strong&gt; использование пула соединений снизило время запроса с 340 мс до 12 мс под нагрузкой (1000 запросов).&lt;/blockquote&gt;
  &lt;h3 id=&quot;d42b&quot;&gt;Уровень 3: Сетевой уровень&lt;/h3&gt;
  &lt;p id=&quot;8514&quot;&gt;Маршрутизация IP-адресов, маски подсети, разрешение DNS. Если ваш сервис не может связаться с другим сервисом, именно здесь следует искать причину.&lt;/p&gt;
  &lt;pre id=&quot;eJpO&quot; data-lang=&quot;bash&quot;&gt;# Trace the actual route packets take
traceroute api.internal.company.com

# Check if DNS is lying to you
nslookup api.internal.company.com&lt;/pre&gt;
  &lt;blockquote id=&quot;tsuP&quot;&gt;&lt;strong&gt;История из практики:&lt;/strong&gt; соединения с базой данных периодически прерывались из-за таймаута. База данных работала исправно. Приложение работало исправно. Сетевая команда настаивала, что всё в порядке.&lt;/blockquote&gt;
  &lt;pre id=&quot;Q5CN&quot; data-lang=&quot;bash&quot;&gt;# This revealed the truth
mtr --report --report-cycles 100 db.internal.company.com

# Packet loss at hop 4: 23%&lt;/pre&gt;
  &lt;p id=&quot;45f7&quot;&gt;Неправильно настроенный маршрутизатор между двумя дата-центрами терял пакеты. Приложение считало, что проблема в базе данных, и продолжало попытки подключения, что только усугубляло ситуацию.&lt;/p&gt;
  &lt;h3 id=&quot;8fde&quot;&gt;Уровень 2: Канальный уровень&lt;/h3&gt;
  &lt;p id=&quot;37b3&quot;&gt;MAC-адреса, коммутаторы, VLAN. Отладка здесь, вероятно, будет нечастой, но когда она всё-таки потребуется, всё остальное перестанет иметь значение.&lt;/p&gt;
  &lt;p id=&quot;2ce8&quot;&gt;В облачных средах это проявляется как «перегрузка сетевого интерфейса». Для экземпляра EC2 существует жесткое ограничение на количество пакетов в секунду, зависящее от типа экземпляра.&lt;/p&gt;
  &lt;pre id=&quot;nsCK&quot; data-lang=&quot;bash&quot;&gt;# Check interface stats
ip -s link show eth0

# Look for TX/RX errors or drops&lt;/pre&gt;
  &lt;h2 id=&quot;f9a1&quot;&gt;Процесс отладки, который действительно работает&lt;/h2&gt;
  &lt;p id=&quot;1a51&quot;&gt;Перестаньте гадать. Начните мыслить уровнями.&lt;/p&gt;
  &lt;pre id=&quot;8LkU&quot; data-lang=&quot;bash&quot;&gt;1. Application logs clean?        -&amp;gt; Go down one layer
2. TCP connections normal?         -&amp;gt; Go down one layer  
3. Can you ping the destination?   -&amp;gt; Go down one layer
4. Is the cable plugged in?        -&amp;gt; Go outside and touch grass&lt;/pre&gt;
  &lt;p id=&quot;0ba7&quot;&gt;&lt;strong&gt;Реальная сессия отладки:&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;r6RZ&quot; data-lang=&quot;bash&quot;&gt;# Layer 7: Application
curl https://api.example.com/health
# Returns 503

# Layer 4: Transport
telnet api.example.com 443
# Connection refused

# Layer 3: Network
ping api.example.com
# Host unreachable

# Layer 2: (Skipped in cloud)
# Resolution: DNS was returning wrong IP
nslookup api.example.com

# Pointed to decommissioned server&lt;/pre&gt;
  &lt;h2 id=&quot;265c&quot;&gt;Паттерн, который вы увидите повсюду.&lt;/h2&gt;
  &lt;p id=&quot;c3a1&quot;&gt;После того, как вы поймете, что такое уровни, вы начнете замечать их повсюду:&lt;/p&gt;
  &lt;p id=&quot;5f46&quot;&gt;&lt;strong&gt;Сетевое взаимодействие в Kubernetes:&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;akoL&quot;&gt;
    &lt;li id=&quot;2e5c&quot;&gt;Взаимодействие между модулями: уровень 3 (IP)&lt;/li&gt;
    &lt;li id=&quot;ec1a&quot;&gt;Сервис для пода: Уровень 4 (TCP/UDP + порты)&lt;/li&gt;
    &lt;li id=&quot;4afe&quot;&gt;Входящий трафик: Уровень 7 (маршрутизация HTTP)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;784d&quot;&gt;&lt;strong&gt;Проблемы с балансировщиком нагрузки:&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;TeDU&quot;&gt;
    &lt;li id=&quot;f4a5&quot;&gt;&lt;code&gt;Connection refused&lt;/code&gt;: Уровень 4 (неверный порт/протокол)&lt;/li&gt;
    &lt;li id=&quot;42bc&quot;&gt;&lt;code&gt;502 Bad Gateway&lt;/code&gt;: Layer 7 (upstream timeout)&lt;/li&gt;
    &lt;li id=&quot;98b2&quot;&gt;&lt;code&gt;Connection timeout&lt;/code&gt;: Уровень 3 (маршрутизация/брандмауэр)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;2593&quot;&gt;Что изменилось для меня&lt;/h2&gt;
  &lt;p id=&quot;6e24&quot;&gt;Я перестал говорить «сеть не работает» и начал спрашивать «на каком уровне произошла поломка?». Я перестал отлаживать систему интуитивно и начал отлаживать методом исключения.&lt;/p&gt;
  &lt;p id=&quot;592a&quot;&gt;Та ошибка 502, что была с самого начала? У балансировщика нагрузки (уровень 7) был keepalive 60 секунд. У сервера приложений (уровень 4) — 65 секунд. Когда балансировщик нагрузки закрывал соединение, приложение всё ещё считало, что оно открыто. Следующий запрос попадал в неактивный сокет.&lt;/p&gt;
  &lt;pre id=&quot;PdPq&quot; data-lang=&quot;bash&quot;&gt;// The fix
server := &amp;amp;http.Server{
    Addr:              &amp;quot;:8080&amp;quot;,
    Handler:           router,
    ReadTimeout:       15 * time.Second,
    WriteTimeout:      15 * time.Second,
    IdleTimeout:       50 * time.Second, // Less than LB&amp;#x27;s 60s
    ReadHeaderTimeout: 5 * time.Second,
}&lt;/pre&gt;
  &lt;p id=&quot;b8be&quot;&gt;Семь уровней предназначены не для запоминания расположения SMTP. Они о том, чтобы знать, куда смотреть, когда всё ломается. А всё всегда ломается.&lt;/p&gt;
  &lt;blockquote id=&quot;ktIc&quot;&gt;Как только вы научитесь видеть сквозь слои, отладка перестанет быть археологией и превратится в инженерное дело.&lt;/blockquote&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;uGp2&quot;&gt;На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где будет еще больше полезной информации.&lt;/p&gt;
  &lt;/section&gt;

</content></entry><entry><id>usr_bin_linux:devops-tools</id><link rel="alternate" type="text/html" href="https://teletype.in/@usr_bin_linux/devops-tools?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=usr_bin_linux"></link><title>Инструменты DevOps с открытым исходным кодом, о которых я хотел бы узнать раньше.</title><published>2026-03-01T21:06:21.392Z</published><updated>2026-03-01T21:06:21.392Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/92/71/9271decb-c246-4345-b9f6-056c60ca4bc8.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*xudgOzai3622me-FEItwOA.png&quot;&gt;Это перевод оригинальной статьи Open-Source DevOps Tools I Wish I Knew About Sooner.</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;Nqb5&quot;&gt;Это перевод оригинальной статьи &lt;a href=&quot;https://medium.com/codetodeploy/open-source-devops-tools-i-wish-i-knew-about-sooner-ad6a022da671&quot; target=&quot;_blank&quot;&gt;Open-Source DevOps Tools I Wish I Knew About Sooner&lt;/a&gt;.&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;07tf&quot;&gt;Подписывайтесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;ed03&quot;&gt;Когда я только начинал работать в DevOps, я думал, что всё должно быть дорогим.&lt;br /&gt;Мониторинг? Платный. CI/CD? Платный. Логирование? Платное.&lt;br /&gt;Даже такие простые вещи, как проверка доступности, стоили денег.&lt;/p&gt;
  &lt;p id=&quot;4130&quot;&gt;Мне потребовалось несколько болезненных счетов, чтобы осознать одну вещь:&lt;/p&gt;
  &lt;blockquote id=&quot;op43&quot;&gt;&lt;em&gt;Практически у каждого крупного DevOps-инструмента есть open-source альтернатива, и многие из них на самом деле&lt;/em&gt; лучше&lt;em&gt;.&lt;/em&gt;&lt;/blockquote&gt;
  &lt;p id=&quot;b862&quot;&gt;Это те инструменты, которые я хотел бы, чтобы меня заставили изучить раньше.&lt;br /&gt;Они бы сэкономили мне деньги, время и кучу нервов.&lt;/p&gt;
  &lt;p id=&quot;5f7e&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;ccf4&quot;&gt;1. Portainer → Графический интерфейс Docker, о необходимости которого я даже не подозревал.&lt;/h2&gt;
  &lt;figure id=&quot;sYzZ&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*xudgOzai3622me-FEItwOA.png&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;&lt;a href=&quot;https://www.portainer.io/&quot; target=&quot;_blank&quot;&gt;https://www.portinaer.io/&lt;/a&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;b48d&quot;&gt;&lt;strong&gt;Ссылка: &lt;a href=&quot;https://www.portinaer.io/&quot; target=&quot;_blank&quot;&gt;https://www.portinaer.io/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;9ddd&quot;&gt;Раньше я управлял Docker исключительно с помощью командной строки.&lt;br /&gt;Всё было хорошо… пока у меня не появились десятки контейнеров, стеков, сетей и томов.&lt;/p&gt;
  &lt;p id=&quot;22fc&quot;&gt;Portainer предоставляет вам:&lt;/p&gt;
  &lt;ul id=&quot;ubO3&quot;&gt;
    &lt;li id=&quot;7a40&quot;&gt;Визуальная панель мониторинга&lt;/li&gt;
    &lt;li id=&quot;e628&quot;&gt;Логи и статистика контейнеров&lt;/li&gt;
    &lt;li id=&quot;5788&quot;&gt;Развертывание в один клик&lt;/li&gt;
    &lt;li id=&quot;4449&quot;&gt;Шаблоны стека&lt;/li&gt;
    &lt;li id=&quot;8e7b&quot;&gt;Контроль доступа пользователей&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;e104&quot;&gt;&lt;strong&gt;Реальный пример:&lt;/strong&gt;&lt;br /&gt;я управляю несколькими небольшими клиентскими приложениями на VPS-серверах.&lt;br /&gt;Portainer превратил управление контейнерами из запутанных терминальных джунглей в удобный дашборд, где я могу перезапускать, обновлять или проверять контейнеры за считанные секунды.&lt;/p&gt;
  &lt;h2 id=&quot;8ad8&quot;&gt;2. Jenkins→ Моя первая настоящая свобода в области CI/CD&lt;/h2&gt;
  &lt;figure id=&quot;99lj&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*WBCdmpqUyiu3IjIzxrnlBQ.png&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;&lt;a href=&quot;https://www.jenkins.io/&quot; target=&quot;_blank&quot;&gt;https://www.jenkins.io/&lt;/a&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;d36e&quot;&gt;&lt;strong&gt;Ссылка: &lt;/strong&gt;&lt;a href=&quot;https://www.jenkins.io/&quot; target=&quot;_blank&quot;&gt;https://www.jenkins.io/&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;3fb2&quot;&gt;До появления Jenkins я в значительной степени полагался на SaaS-инструменты для непрерывной интеграции.&lt;br /&gt;Они удобны, но бесплатные ограничения просто ужасны.&lt;/p&gt;
  &lt;p id=&quot;55cc&quot;&gt;Jenkins предоставляет:&lt;/p&gt;
  &lt;ul id=&quot;r9fw&quot;&gt;
    &lt;li id=&quot;4b8a&quot;&gt;Неограниченное количество пайплайнов&lt;/li&gt;
    &lt;li id=&quot;1912&quot;&gt;Кастомные агенты&lt;/li&gt;
    &lt;li id=&quot;37c8&quot;&gt;Огромная экосистема плагинов&lt;/li&gt;
    &lt;li id=&quot;a4eb&quot;&gt;Полный контроль над сборкой.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;e9c2&quot;&gt;Однажды я собрал пайплайн, который:&lt;/p&gt;
  &lt;ol id=&quot;8ygW&quot;&gt;
    &lt;li id=&quot;0260&quot;&gt;Запускал тесты&lt;/li&gt;
    &lt;li id=&quot;9ec7&quot;&gt;Генерировал Docker-образы&lt;/li&gt;
    &lt;li id=&quot;5cf6&quot;&gt;Деплоил в Kubernetes&lt;/li&gt;
    &lt;li id=&quot;6428&quot;&gt;Отправлял уведомления в Slack&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;d395&quot;&gt;Всё работает на сервере за 10 долларов. Никаких ограничений. Никаких неожиданностей.&lt;/p&gt;
  &lt;h2 id=&quot;1a4f&quot;&gt;3. Prometheus + Grafana → Замена облачного мониторинга&lt;/h2&gt;
  &lt;p id=&quot;ed6a&quot;&gt;&lt;strong&gt;Ссылки:&lt;/strong&gt;&lt;br /&gt;Prometheus: &lt;a href=&quot;https://prometheus.io/&quot; target=&quot;_blank&quot;&gt;https://prometheus.io/&lt;/a&gt;&lt;br /&gt;Grafana: &lt;a href=&quot;https://grafana.com/&quot; target=&quot;_blank&quot;&gt;https://grafana.com/&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;6cd4&quot;&gt;Все облачные провайдеры взимают дополнительную плату за панели мониторинга.&lt;br /&gt;По мере масштабирования эти суммы быстро растут.&lt;/p&gt;
  &lt;p id=&quot;fb36&quot;&gt;Prometheus обрабатывает метрики.&lt;br /&gt;Grafana великолепно их визуализирует.&lt;/p&gt;
  &lt;p id=&quot;e97e&quot;&gt;&lt;strong&gt;Где это меня выручило:&lt;/strong&gt;&lt;br /&gt;я развернул их в кластере Kubernetes — и внезапно у меня появилось:&lt;/p&gt;
  &lt;ul id=&quot;hrVr&quot;&gt;
    &lt;li id=&quot;7eb1&quot;&gt;Панели мониторинга ЦП/памяти&lt;/li&gt;
    &lt;li id=&quot;15ab&quot;&gt;Графики состояния Pod’ов&lt;/li&gt;
    &lt;li id=&quot;49b0&quot;&gt;Пользовательские оповещения&lt;/li&gt;
    &lt;li id=&quot;283c&quot;&gt;Метрики производительности узлов&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;2f52&quot;&gt;И всё это бесплатно.&lt;/p&gt;
  &lt;h2 id=&quot;6903&quot;&gt;4. Alertmanager → Оповещения без оплаты&lt;/h2&gt;
  &lt;figure id=&quot;sZWC&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*VyuytCPOf1Xof8S5LXyS5w.png&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;&lt;a href=&quot;https://prometheus.io/&quot; target=&quot;_blank&quot;&gt;https://prometheus.io/&lt;/a&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;2e46&quot;&gt;&lt;strong&gt;Ссылка: &lt;/strong&gt;&lt;a href=&quot;https://prometheus.io/docs/alerting/latest/alertmanager/&quot; target=&quot;_blank&quot;&gt;https://prometheus.io/docs/alerting/latest/alertmanager/&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;e7c9&quot;&gt;Уведомления по электронной почте… бесплатно.&lt;br /&gt;Уведомления в Slack… бесплатно.&lt;br /&gt;Уведомления Webhook… бесплатно.&lt;/p&gt;
  &lt;p id=&quot;84a8&quot;&gt;До того, как я открыл для себя Alertmanager, я полагался на платные инструменты только для получения уведомлений.&lt;/p&gt;
  &lt;p id=&quot;e5fe&quot;&gt;После настройки с помощью Prometheus я смог:&lt;/p&gt;
  &lt;ul id=&quot;CLja&quot;&gt;
    &lt;li id=&quot;5018&quot;&gt;Получать оповещения о перезапуске подов.&lt;/li&gt;
    &lt;li id=&quot;f062&quot;&gt;Отслеживать высокую загрузку ЦП.&lt;/li&gt;
    &lt;li id=&quot;20f5&quot;&gt;Выявлять сбои при развертывании&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;1d46&quot;&gt;Никакого спама в SMS-сообщениях/уведомлениях, никаких скрытых платежей.&lt;/p&gt;
  &lt;h2 id=&quot;54b8&quot;&gt;5. Loki → Инструмент логирования, который следовало использовать с самого первого дня.&lt;/h2&gt;
  &lt;figure id=&quot;FfHU&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*ZBsAYl6K-v3FQaJt5IYKiA.png&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;&lt;a href=&quot;https://grafana.com/oss/loki/&quot; target=&quot;_blank&quot;&gt;https://grafana.com/oss/loki/&lt;/a&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;7172&quot;&gt;&lt;strong&gt;Ссылка: &lt;/strong&gt;&lt;a href=&quot;https://grafana.com/oss/loki/&quot; target=&quot;_blank&quot;&gt;https://grafana.com/oss/loki/&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;e3e3&quot;&gt;Раньше я перенаправлял логи в случайные папки и “cat”-ил их как пещерный человек.&lt;br /&gt;Потом появился Loki — инструмент агрегации логов с открытым исходным кодом от Grafana.&lt;/p&gt;
  &lt;p id=&quot;f48b&quot;&gt;Это как Elasticsearch, но легче и проще в использовании.&lt;/p&gt;
  &lt;p id=&quot;4f41&quot;&gt;&lt;strong&gt;Где это помогло:&lt;/strong&gt;&lt;br /&gt;Логи срабатывали на:&lt;/p&gt;
  &lt;ul id=&quot;SbDG&quot;&gt;
    &lt;li id=&quot;1078&quot;&gt;Циклических сбоях Node.js&lt;/li&gt;
    &lt;li id=&quot;7bb9&quot;&gt;Ошибки подключения к базе данных&lt;/li&gt;
    &lt;li id=&quot;5caa&quot;&gt;Неожиданные ошибки 500&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;0279&quot;&gt;И всё это можно было искать в одном дашборде.&lt;/p&gt;
  &lt;h2 id=&quot;95c4&quot;&gt;6. Argo CD → GitOps: правильный подход&lt;/h2&gt;
  &lt;figure id=&quot;ACyx&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*11IwlPEU4IxM9B-C6j6s7g.png&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;&lt;a href=&quot;https://argo-cd.readthedocs.io/&quot; target=&quot;_blank&quot;&gt;https://argo-cd.readthedocs.io/&lt;/a&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;3aec&quot;&gt;&lt;strong&gt;Ссылка: &lt;/strong&gt;&lt;a href=&quot;https://argo-cd.readthedocs.io/&quot; target=&quot;_blank&quot;&gt;https://argo-cd.readthedocs.io/&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;e3b4&quot;&gt;Если вы работаете с Kubernetes, Argo CD кажется почти волшебным инструментом.&lt;/p&gt;
  &lt;p id=&quot;5283&quot;&gt;Он за вашим Git-репозиторием и автоматически синхронизирует ваш кластер с манифестами.&lt;/p&gt;
  &lt;p id=&quot;c4f1&quot;&gt;Значение:&lt;/p&gt;
  &lt;ul id=&quot;jpl6&quot;&gt;
    &lt;li id=&quot;a30c&quot;&gt;Нет необходимости вручную выполнять &lt;code&gt;kubectl apply&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;ae1c&quot;&gt;Автоматический откат&lt;/li&gt;
    &lt;li id=&quot;d3f1&quot;&gt;мониторинг состояния приложения&lt;/li&gt;
    &lt;li id=&quot;f643&quot;&gt;развертывание с контролем версий&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;0cb8&quot;&gt;После того, как я настроил его в среде микросервисов, развертывание стало выглядеть следующим образом:&lt;/p&gt;
  &lt;pre id=&quot;tJdN&quot; data-lang=&quot;bash&quot;&gt;git push&lt;/pre&gt;
  &lt;p id=&quot;65d1&quot;&gt;Вот и всё. Argo позаботился обо всём остальном.&lt;/p&gt;
  &lt;h2 id=&quot;d76c&quot;&gt;7. Traefik → Обратный прокси, который наконец-то стал понятным.&lt;/h2&gt;
  &lt;figure id=&quot;HjJz&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*ZJCFXkVAchcXqYYEVvpYKA.png&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;&lt;a href=&quot;https://traefik.io/&quot; target=&quot;_blank&quot;&gt;https://traefik.io/&lt;/a&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;cbd4&quot;&gt;&lt;strong&gt;Ссылка: &lt;/strong&gt;&lt;a href=&quot;https://traefik.io/&quot; target=&quot;_blank&quot;&gt;https://traefik.io/&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;fcc8&quot;&gt;Конфигурации NGINX заставили меня возненавидеть жизнь.&lt;br /&gt;А потом я открыл для себя Traefik.&lt;/p&gt;
  &lt;p id=&quot;1202&quot;&gt;Traefik автоматически:&lt;/p&gt;
  &lt;ul id=&quot;A8IO&quot;&gt;
    &lt;li id=&quot;6b11&quot;&gt;Обнаруживает контейнеры&lt;/li&gt;
    &lt;li id=&quot;b94e&quot;&gt;Генерирует правила маршрутизации&lt;/li&gt;
    &lt;li id=&quot;d931&quot;&gt;Выдает SSL-сертификаты&lt;/li&gt;
    &lt;li id=&quot;3bf7&quot;&gt;Управляет балансировкой нагрузки&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;d69f&quot;&gt;&lt;strong&gt;Пример:&lt;/strong&gt;&lt;br /&gt;я развернул несколько микросервисов с метками Docker, и Traefik мгновенно их обнаружил с действительным HTTPS-соединением — без необходимости вручную настраивать файлы конфигурации.&lt;/p&gt;
  &lt;h2 id=&quot;7848&quot;&gt;8. MinIO → Open-Source хранилище S3&lt;/h2&gt;
  &lt;p id=&quot;041c&quot;&gt;(Бесплатное использование прекращено, но исходный код доступен по ссылке &lt;a href=&quot;https://github.com/minio/minio&quot; target=&quot;_blank&quot;&gt;: https://github.com/minio/minio&lt;/a&gt; )&lt;/p&gt;
  &lt;p id=&quot;3035&quot;&gt;&lt;strong&gt;Ссылка: &lt;/strong&gt;&lt;a href=&quot;https://min.io/&quot; target=&quot;_blank&quot;&gt;https://min.io/&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;1d7e&quot;&gt;AWS S3 — отличный сервис, но не всегда дешевый.&lt;/p&gt;
  &lt;p id=&quot;96fd&quot;&gt;MinIO предоставляет вам:&lt;/p&gt;
  &lt;ul id=&quot;Ch2U&quot;&gt;
    &lt;li id=&quot;0726&quot;&gt;Объектное хранилище&lt;/li&gt;
    &lt;li id=&quot;fab5&quot;&gt;S3-совместимые API&lt;/li&gt;
    &lt;li id=&quot;969e&quot;&gt;Высокую производительность&lt;/li&gt;
    &lt;li id=&quot;4cba&quot;&gt;Свободу самостоятельного хостинга&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;1dee&quot;&gt;Я использовал его для хранения:&lt;/p&gt;
  &lt;ul id=&quot;bLlM&quot;&gt;
    &lt;li id=&quot;2b31&quot;&gt;Логов&lt;/li&gt;
    &lt;li id=&quot;3e49&quot;&gt;Резервных копий&lt;/li&gt;
    &lt;li id=&quot;6b31&quot;&gt;Медиафайлов&lt;/li&gt;
    &lt;li id=&quot;1a8a&quot;&gt;Ресурсов приложений&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;73ea&quot;&gt;С тех пор я использую MinIO для локальной разработки, тестовых окружений и даже некоторых производственных задач.&lt;/p&gt;
  &lt;h2 id=&quot;7bd5&quot;&gt;9. K9s → Терминальный интерфейс для Kubernetes&lt;/h2&gt;
  &lt;figure id=&quot;EZsx&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*qalPYgOQu3QHz1AeDHfoOg.png&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;&lt;a href=&quot;https://k9scli.io/&quot; target=&quot;_blank&quot;&gt;https://k9scli.io/&lt;/a&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;0592&quot;&gt;&lt;strong&gt;Ссылка: &lt;/strong&gt;&lt;a href=&quot;https://k9scli.io/&quot; target=&quot;_blank&quot;&gt;https://k9scli.io/&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;2af7&quot;&gt;kubectl — мощный… но иногда мучительный.&lt;/p&gt;
  &lt;p id=&quot;9142&quot;&gt;K9s предоставляет вам интерактивную панель управления терминала:&lt;/p&gt;
  &lt;ul id=&quot;OpCj&quot;&gt;
    &lt;li id=&quot;3355&quot;&gt;Pods&lt;/li&gt;
    &lt;li id=&quot;c85b&quot;&gt;Логи&lt;/li&gt;
    &lt;li id=&quot;565a&quot;&gt;Доступ к оболочке&lt;/li&gt;
    &lt;li id=&quot;5e06&quot;&gt;События&lt;/li&gt;
    &lt;li id=&quot;3c9e&quot;&gt;Развертывания&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;57e2&quot;&gt;Это как «htop», но для вашего кластера.&lt;/p&gt;
  &lt;p id=&quot;1e36&quot;&gt;Я использую его ежедневно — он значительно ускоряет отладку.&lt;/p&gt;
  &lt;h2 id=&quot;8f59&quot;&gt;10. Gitea → Самостоятельно размещаемая альтернатива GitHub&lt;/h2&gt;
  &lt;p id=&quot;95d7&quot;&gt;&lt;strong&gt;Ссылка: &lt;/strong&gt;&lt;a href=&quot;https://about.gitea.com/&quot; target=&quot;_blank&quot;&gt;https://about.gitea.com/&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;f609&quot;&gt;Для небольших команд и внутренних репозиториев GitHub может быть излишним.&lt;/p&gt;
  &lt;p id=&quot;c368&quot;&gt;Gitea предоставляет вам:&lt;/p&gt;
  &lt;ul id=&quot;M8B5&quot;&gt;
    &lt;li id=&quot;8f99&quot;&gt;Git-хостинг&lt;/li&gt;
    &lt;li id=&quot;dade&quot;&gt;Issues (задачи)&lt;/li&gt;
    &lt;li id=&quot;c0ef&quot;&gt;Запросы на слияние&lt;/li&gt;
    &lt;li id=&quot;b827&quot;&gt;интеграции CI&lt;/li&gt;
    &lt;li id=&quot;22a5&quot;&gt;Использование серверов с минимальными затратами ресурсов&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;d6f9&quot;&gt;Я настроил её для внутреннего корпоративного проекта, и разработчики оценили, насколько быстро и удобно всё работает.&lt;/p&gt;
  &lt;h2 id=&quot;cb49&quot;&gt;Заключительные мысли&lt;/h2&gt;
  &lt;p id=&quot;1999&quot;&gt;DevOps не обязательно должен быть дорогим.&lt;br /&gt;Для большинства инструментов, которые профессионалы используют ежедневно, уже существуют мощные версии с открытым исходным кодом.&lt;/p&gt;
  &lt;p id=&quot;504b&quot;&gt;А самое главное?&lt;/p&gt;
  &lt;blockquote id=&quot;yVtQ&quot;&gt;&lt;em&gt;Использование инструментов с открытым исходным кодом заставляет вас действительно понимать, как работает ваша инфраструктура.&lt;/em&gt;&lt;/blockquote&gt;
  &lt;p id=&quot;bd42&quot;&gt;Если вы прокачиваете навыки DevOps или модернизируете стек, начните с этих инструментов.&lt;br /&gt;Они сэкономят вам деньги — и сделают вас лучшим инженером.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;Za99&quot;&gt;На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где будет еще больше полезной информации.&lt;/p&gt;
  &lt;/section&gt;

</content></entry><entry><id>usr_bin_linux:bash-mastering</id><link rel="alternate" type="text/html" href="https://teletype.in/@usr_bin_linux/bash-mastering?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=usr_bin_linux"></link><title>Лайфхаки по написанию скриптов на Bash, которые должен знать каждый разработчик</title><published>2026-03-01T21:04:23.373Z</published><updated>2026-03-01T21:04:23.373Z</updated><summary type="html">Это перевод оригинальной статьи Bash Scripting Hacks Every Developer Should Know.</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;l4Zv&quot;&gt;Это перевод оригинальной статьи &lt;a href=&quot;https://medium.com/the-software-journal/bash-scripting-hacks-every-developer-should-know-05e6720a6825&quot; target=&quot;_blank&quot;&gt;Bash Scripting Hacks Every Developer Should Know&lt;/a&gt;.&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;zaNJ&quot;&gt;Подписывайтесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.&lt;/p&gt;
  &lt;/section&gt;
  &lt;h3 id=&quot;0a4b&quot;&gt;Небольшие хитрости Bash, которые сэкономят часы, предотвратят катастрофы и незаметно улучшат рабочий процесс разработчика.&lt;br /&gt;&lt;/h3&gt;
  &lt;h2 id=&quot;f86a&quot;&gt;Введение: Bash — это навык, который вы, сами того не зная, игнорировали.&lt;/h2&gt;
  &lt;p id=&quot;1827&quot;&gt;Большинство разработчиков «знают» Bash так же, как и Git: ровно столько, чтобы справляться. Несколько команд в памяти. Скрипт скопирован со Stack Overflow. Молитва перед нажатием Enter.&lt;/p&gt;
  &lt;p id=&quot;2147&quot;&gt;Но Bash — это не просто язык программирования для энтузиастов Linux или специалистов по DevOps. Это невидимая сила, стоящая за автоматизацией, отладкой, деплоями, обработкой данных и бесчисленным количеством повседневных задач. Разница между медленным разработчиком и пугающе эффективным часто сводится к тому, насколько хорошо он владеет shell’ом.&lt;/p&gt;
  &lt;p id=&quot;9a24&quot;&gt;Эта статья не о запоминании малоизвестных флагов. Она о практических приемах написания скриптов на Bash — небольших идеях, оказывающих огромное влияние. Идеях, которые делают ваши скрипты безопаснее, чище и проще в обслуживании. Идеях, которые вы хотели бы увидеть много лет назад.&lt;/p&gt;
  &lt;p id=&quot;5c84&quot;&gt;Давайте прокачаем вашу интуицию.&lt;/p&gt;
  &lt;h2 id=&quot;313b&quot;&gt;1. Всегда запускайте скрипты в «строгом режиме».&lt;/h2&gt;
  &lt;p id=&quot;3829&quot;&gt;Большинство скриптов Bash завершаются с ошибкой без предупреждения. Это опасно.&lt;/p&gt;
  &lt;p id=&quot;56d7&quot;&gt;Первый полезный совет, который должен знать каждый разработчик, — это включение строгого режима в начале скриптов:&lt;/p&gt;
  &lt;pre id=&quot;376i&quot; data-lang=&quot;bash&quot;&gt;set -euo pipefail&lt;/pre&gt;
  &lt;p id=&quot;2a6f&quot;&gt;Вот что делает эта единственная строка:&lt;/p&gt;
  &lt;ul id=&quot;uKZj&quot;&gt;
    &lt;li id=&quot;86c4&quot;&gt;&lt;code&gt;-e&lt;/code&gt;: В случае сбоя команды немедленно завершить работу.&lt;/li&gt;
    &lt;li id=&quot;c9db&quot;&gt;&lt;code&gt;-u&lt;/code&gt;: Cчитает необъявленные переменные ошибкой&lt;/li&gt;
    &lt;li id=&quot;5d96&quot;&gt;&lt;code&gt;-o pipefail&lt;/code&gt;: пайплайн считается упавшим, если любая команда завершилась с ошибкой.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;ebbb&quot;&gt;Без этого ваш скрипт может прерваться на полпути и продолжить работу, как ни в чем не бывало. В строгом режиме сбои происходят громко и мгновенно — именно то, что нужно для автоматизации.&lt;/p&gt;
  &lt;p id=&quot;e1aa&quot;&gt;Считайте это превращением runtime-ошибок в compile-time-ошибки для Bash.&lt;/p&gt;
  &lt;h2 id=&quot;7366&quot;&gt;2. Используйте &lt;code&gt;&amp;quot;$@&amp;quot;&lt;/code&gt; вместо &lt;code&gt;$*&lt;/code&gt; (Да, это важно)&lt;/h2&gt;
  &lt;p id=&quot;6283&quot;&gt;Если ваш скрипт принимает аргументы, эта деталь может сэкономить вам часы отладки.&lt;/p&gt;
  &lt;p id=&quot;59ed&quot;&gt;Всегда используйте:&lt;/p&gt;
  &lt;pre id=&quot;1RiJ&quot; data-lang=&quot;bash&quot;&gt;&amp;quot;$@&amp;quot;&lt;/pre&gt;
  &lt;p id=&quot;51e3&quot;&gt;Вместо:&lt;/p&gt;
  &lt;pre id=&quot;XaSj&quot; data-lang=&quot;bash&quot;&gt;$*&lt;/pre&gt;
  &lt;p id=&quot;6da3&quot;&gt;Почему? Потому что &lt;code&gt;&amp;quot;$@&amp;quot;&lt;/code&gt; сохраняет границы аргументов. Пробелы остаются неизменными. Имена файлов не распадаются на части. Ваш скрипт работает корректно, когда пользователи передают строки в кавычках.&lt;/p&gt;
  &lt;p id=&quot;3433&quot;&gt;Это одно из тех правил Bash, которое кажется излишне педантичным — пока из-за них не ломается что-то важное в продакшене.&lt;/p&gt;
  &lt;h2 id=&quot;c717&quot;&gt;3. Давайте своим переменным точные имена&lt;/h2&gt;
  &lt;p id=&quot;dc94&quot;&gt;В Bash нет типов, но имена — это ваша система безопасности.&lt;/p&gt;
  &lt;p id=&quot;f705&quot;&gt;Плохо:&lt;/p&gt;
  &lt;pre id=&quot;99nA&quot; data-lang=&quot;bash&quot;&gt;x=10
y=&amp;quot;file.txt&amp;quot;&lt;/pre&gt;
  &lt;p id=&quot;aaa5&quot;&gt;Лучше:&lt;/p&gt;
  &lt;pre id=&quot;ERE1&quot; data-lang=&quot;bash&quot;&gt;MAX_RETRIES=10
INPUT_FILE=&amp;quot;file.txt&amp;quot;&lt;/pre&gt;
  &lt;p id=&quot;3d06&quot;&gt;Почему заглавные буквы? Потому что в соглашениях Bash переменные, написанные заглавными буквами, рассматриваются как константы или параметры конфигурации. Это также помогает избежать конфликтов с переменными окружения или именами команд.&lt;/p&gt;
  &lt;p id=&quot;2912&quot;&gt;Правильно подобранные имена переменных превращают уязвимые скрипты в читаемые программы.&lt;/p&gt;
  &lt;h2 id=&quot;794b&quot;&gt;4. Используйте &lt;code&gt;$(...)&lt;/code&gt; вместо обратных кавычек.&lt;/h2&gt;
  &lt;p id=&quot;6736&quot;&gt;Если вы всё ещё используете обратные кавычки, пора от них отказаться.&lt;/p&gt;
  &lt;p id=&quot;9e3f&quot;&gt;Старый вариант:&lt;/p&gt;
  &lt;pre id=&quot;29lp&quot; data-lang=&quot;bash&quot;&gt;files=&amp;#x60;ls&amp;#x60;&lt;/pre&gt;
  &lt;p id=&quot;06e2&quot;&gt;Современный вариант:&lt;/p&gt;
  &lt;pre id=&quot;7yxl&quot; data-lang=&quot;bash&quot;&gt;files=$(ls)&lt;/pre&gt;
  &lt;p id=&quot;c6d0&quot;&gt;Замена команд с помощью &lt;code&gt;$(...)&lt;/code&gt; выглядит следующим образом:&lt;/p&gt;
  &lt;ul id=&quot;xXOL&quot;&gt;
    &lt;li id=&quot;ddf1&quot;&gt;Легче читать&lt;/li&gt;
    &lt;li id=&quot;fe4c&quot;&gt;Легче вкладывается&lt;/li&gt;
    &lt;li id=&quot;56be&quot;&gt;Менее подвержен ошибкам&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;743a&quot;&gt;Речь идёт не просто о предпочтениях в синтаксисе. Речь идёт о написании кода на Bash, который не будет создавать проблем по мере своего развития.&lt;/p&gt;
  &lt;h2 id=&quot;8f7b&quot;&gt;5. Быстро выявляйте ошибки с помощью явных сообщений об ошибках.&lt;/h2&gt;
  &lt;p id=&quot;563c&quot;&gt;Если что-то пошло не так, в вашем скрипте должно быть указано, &lt;em&gt;почему&lt;/em&gt;.&lt;/p&gt;
  &lt;p id=&quot;a829&quot;&gt;Вместо того чтобы позволять Bash загадочным образом завершать работу с ошибкой, сделайте следующее:&lt;/p&gt;
  &lt;pre id=&quot;7vxF&quot; data-lang=&quot;bash&quot;&gt;command || {
  echo &amp;quot;❌ Failed to run command&amp;quot;
  exit 1
}&lt;/pre&gt;
  &lt;p id=&quot;590d&quot;&gt;А ещё лучше — оберните это в функцию:&lt;/p&gt;
  &lt;pre id=&quot;UfvE&quot; data-lang=&quot;bash&quot;&gt;die() {
  echo &amp;quot;Error: $1&amp;quot; &amp;gt;&amp;amp;2
  exit 1
}&lt;/pre&gt;
  &lt;p id=&quot;f220&quot;&gt;Теперь ваши скрипты не просто терпят неудачу — они умеют доносить информацию. И вы в будущем поблагодарите себя в настоящем за эту ясность.&lt;/p&gt;
  &lt;h2 id=&quot;20eb&quot;&gt;6. Используйте функции (даже в небольших скриптах).&lt;/h2&gt;
  &lt;p id=&quot;1990&quot;&gt;Многие разработчики избегают использования функций в Bash, считая их излишними.&lt;/p&gt;
  &lt;p id=&quot;998b&quot;&gt;Нет.&lt;/p&gt;
  &lt;p id=&quot;c1dc&quot;&gt;Функции позволяют вам:&lt;/p&gt;
  &lt;ul id=&quot;yrlA&quot;&gt;
    &lt;li id=&quot;27e6&quot;&gt;Избегать дублирования&lt;/li&gt;
    &lt;li id=&quot;61b5&quot;&gt;Инкапсулировать логику&lt;/li&gt;
    &lt;li id=&quot;abce&quot;&gt;Сделать скрипты читаемыми от начала до конца.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;855d&quot;&gt;Пример:&lt;/p&gt;
  &lt;pre id=&quot;Endw&quot; data-lang=&quot;bash&quot;&gt;cleanup() {
  rm -rf /tmp/my_app
}&lt;/pre&gt;
  &lt;p id=&quot;b6b9&quot;&gt;Вам не нужен объектно-ориентированный Bash. Вам нужна лишь структура. Функции — это самый простой способ добиться успеха.&lt;/p&gt;
  &lt;h2 id=&quot;d4e7&quot;&gt;7. Перехватывайте сигналы как профессионал&lt;/h2&gt;
  &lt;p id=&quot;d602&quot;&gt;Случалось ли вам когда-нибудь сталкиваться с тем, что скрипт оставляет незавершенные файлы после нажатия Ctrl+C?&lt;/p&gt;
  &lt;p id=&quot;9d0d&quot;&gt;Это потому, что вы не перехватили сигналы.&lt;/p&gt;
  &lt;pre id=&quot;0kCe&quot; data-lang=&quot;bash&quot;&gt;trap cleanup EXIT INT TERM&lt;/pre&gt;
  &lt;p id=&quot;8636&quot;&gt;Это гарантирует, что ваша логика очистки будет выполнена даже в случае неожиданного завершения работы скрипта.&lt;/p&gt;
  &lt;p id=&quot;87f4&quot;&gt;Ловушки необходимы для:&lt;/p&gt;
  &lt;ul id=&quot;rq9e&quot;&gt;
    &lt;li id=&quot;8547&quot;&gt;Временных файлов&lt;/li&gt;
    &lt;li id=&quot;f9b2&quot;&gt;Файлов блокировки&lt;/li&gt;
    &lt;li id=&quot;17b4&quot;&gt;Фоновых процессов&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;ade3&quot;&gt;Они превращают сценарии, в которых &amp;quot;надеемся, ничего не пойдет не так&amp;quot;, в сценарии, в которых &amp;quot;готовы к хаосу&amp;quot;.&lt;/p&gt;
  &lt;h2 id=&quot;3352&quot;&gt;8. Кавычьте переменные так, будто от этого зависит ваша работа&lt;/h2&gt;
  &lt;p id=&quot;fdbb&quot;&gt;В Bash не заключенные в кавычки переменные — это мины замедленного действия.&lt;/p&gt;
  &lt;p id=&quot;3cd2&quot;&gt;Плохой:&lt;/p&gt;
  &lt;pre id=&quot;G3xa&quot; data-lang=&quot;bash&quot;&gt;rm $file&lt;/pre&gt;
  &lt;p id=&quot;8125&quot;&gt;Хороший:&lt;/p&gt;
  &lt;pre id=&quot;Pyfd&quot; data-lang=&quot;bash&quot;&gt;rm &amp;quot;$file&amp;quot;&lt;/pre&gt;
  &lt;p id=&quot;91b3&quot;&gt;Если переменная &lt;code&gt;$file&lt;/code&gt; содержит пробелы, символы шаблона или пуста, отсутствие кавычек может привести к потере данных.&lt;/p&gt;
  &lt;p id=&quot;eaef&quot;&gt;Хорошее эмпирическое правило: &lt;strong&gt;если это переменная, заключите её в кавычки.&lt;/strong&gt; Исключения бывают, но новичкам не следует на них полагаться.&lt;/p&gt;
  &lt;p id=&quot;1392&quot;&gt;Одна эта привычка предотвращает одни из самых страшных shell-багов, каких только можно себе представить.&lt;/p&gt;
  &lt;h2 id=&quot;ad1b&quot;&gt;9. Используйте массивы вместо строк, разделённых пробелами.&lt;/h2&gt;
  &lt;p id=&quot;164b&quot;&gt;Bash поддерживает массивы. Используйте их.&lt;/p&gt;
  &lt;p id=&quot;ccab&quot;&gt;Вместо:&lt;/p&gt;
  &lt;pre id=&quot;c22M&quot; data-lang=&quot;bash&quot;&gt;files=&amp;quot;a.txt b.txt c.txt&amp;quot;&lt;/pre&gt;
  &lt;p id=&quot;3e61&quot;&gt;Сделайте следующее:&lt;/p&gt;
  &lt;pre id=&quot;pmY3&quot; data-lang=&quot;bash&quot;&gt;files=(&amp;quot;a.txt&amp;quot; &amp;quot;b.txt&amp;quot; &amp;quot;c.txt&amp;quot;)&lt;/pre&gt;
  &lt;p id=&quot;e4da&quot;&gt;Массивы сохраняют структуру, безопасно работают с пробелами и ведут себя предсказуемо.&lt;/p&gt;
  &lt;p id=&quot;25f4&quot;&gt;Циклы становятся безопаснее:&lt;/p&gt;
  &lt;pre id=&quot;6weW&quot; data-lang=&quot;bash&quot;&gt;for file in &amp;quot;${files[@]}&amp;quot;; do
  echo &amp;quot;$file&amp;quot;
done&lt;/pre&gt;
  &lt;p id=&quot;f98b&quot;&gt;Как только вы научитесь правильно использовать массивы, вы уже никогда не захотите возвращаться к прежнему способу работы.&lt;/p&gt;
  &lt;h2 id=&quot;2179&quot;&gt;10. Читайте файлы построчно правильно.&lt;/h2&gt;
  &lt;p id=&quot;da42&quot;&gt;Это классическая ловушка.&lt;/p&gt;
  &lt;p id=&quot;4328&quot;&gt;Неправильно:&lt;/p&gt;
  &lt;pre id=&quot;Kymi&quot; data-lang=&quot;bash&quot;&gt;for line in $(cat file.txt); do&lt;/pre&gt;
  &lt;p id=&quot;6ee9&quot;&gt;Верно:&lt;/p&gt;
  &lt;pre id=&quot;zNI8&quot; data-lang=&quot;bash&quot;&gt;while IFS= read -r line; do
  echo &amp;quot;$line&amp;quot;
done &amp;lt; file.txt&lt;/pre&gt;
  &lt;p id=&quot;2934&quot;&gt;Правильный подход:&lt;/p&gt;
  &lt;ul id=&quot;DeAG&quot;&gt;
    &lt;li id=&quot;593f&quot;&gt;Сохраняет пробелы&lt;/li&gt;
    &lt;li id=&quot;ed06&quot;&gt;Не зависает при работе со специальными символами.&lt;/li&gt;
    &lt;li id=&quot;2f27&quot;&gt;Эффективно работает с большими файлами&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;7d0e&quot;&gt;Это может показаться многословным, но это единственный безопасный способ.&lt;/p&gt;
  &lt;h2 id=&quot;4a49&quot;&gt;11. Используйте &lt;code&gt;set -x&lt;/code&gt; для тонкой отладки&lt;/h2&gt;
  &lt;p id=&quot;bde5&quot;&gt;Когда скрипт работает некорректно, догадки не помогут.&lt;/p&gt;
  &lt;p id=&quot;9763&quot;&gt;Включить трассировку выполнения:&lt;/p&gt;
  &lt;pre id=&quot;VDuG&quot; data-lang=&quot;bash&quot;&gt;set -x&lt;/pre&gt;
  &lt;p id=&quot;aa83&quot;&gt;Bash выводит каждую команду перед её выполнением. Это бесценно для:&lt;/p&gt;
  &lt;ul id=&quot;3gZv&quot;&gt;
    &lt;li id=&quot;8e77&quot;&gt;Падений в CI&lt;/li&gt;
    &lt;li id=&quot;d266&quot;&gt;Неожиданных значений переменных&lt;/li&gt;
    &lt;li id=&quot;c506&quot;&gt;Логических ошибок&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;491f&quot;&gt;Вы даже можете включить его временно:&lt;/p&gt;
  &lt;pre id=&quot;GjVL&quot; data-lang=&quot;bash&quot;&gt;set -x
# debug section
set +x&lt;/pre&gt;
  &lt;p id=&quot;1914&quot;&gt;Это встроенный отладчик Bash. Используйте его.&lt;/p&gt;
  &lt;h2 id=&quot;aa37&quot;&gt;12. Предпочитайте [[ ... ]] вместо [ ... ]&lt;/h2&gt;
  &lt;p id=&quot;ec34&quot;&gt;Тестовые выражения старого образца ненадежны.&lt;/p&gt;
  &lt;p id=&quot;e250&quot;&gt;Используйте:&lt;/p&gt;
  &lt;pre id=&quot;okHB&quot; data-lang=&quot;bash&quot;&gt;if [[ &amp;quot;$a&amp;quot; == &amp;quot;$b&amp;quot; ]]; then&lt;/pre&gt;
  &lt;p id=&quot;ee86&quot;&gt;Вместо:&lt;/p&gt;
  &lt;pre id=&quot;MNaZ&quot; data-lang=&quot;bash&quot;&gt;if [ &amp;quot;$a&amp;quot; = &amp;quot;$b&amp;quot; ]; then&lt;/pre&gt;
  &lt;p id=&quot;7f16&quot;&gt;Почему?&lt;/p&gt;
  &lt;ul id=&quot;9nIE&quot;&gt;
    &lt;li id=&quot;e933&quot;&gt;Без разделения слов&lt;/li&gt;
    &lt;li id=&quot;86d6&quot;&gt;Более безопасное сравнение строк&lt;/li&gt;
    &lt;li id=&quot;7ef1&quot;&gt;Поддержка регулярных выражений&lt;/li&gt;
    &lt;li id=&quot;a2c2&quot;&gt;Меньше проблем с кавычками&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;1836&quot;&gt;&lt;code&gt;[[ ... ]]&lt;/code&gt; — это одно из лучших улучшений Bash. Воспользуйтесь им.&lt;/p&gt;
  &lt;h2 id=&quot;ac53&quot;&gt;13. Используйте Here-Docs для корректного многострочного ввода.&lt;/h2&gt;
  &lt;p id=&quot;e6ec&quot;&gt;Когда в скрипты начинают встраиваться SQL-запросы, файлы конфигурации или большие текстовые блоки, читаемость ухудшается.&lt;/p&gt;
  &lt;p id=&quot;7664&quot;&gt;Here-docs это исправляет:&lt;/p&gt;
  &lt;pre id=&quot;zcAF&quot; data-lang=&quot;bash&quot;&gt;cat &amp;lt;&amp;lt;EOF &amp;gt; config.yaml
port: 8080
env: production
EOF&lt;/pre&gt;
  &lt;p id=&quot;a596&quot;&gt;Они идеально подходят для:&lt;/p&gt;
  &lt;ul id=&quot;rfr7&quot;&gt;
    &lt;li id=&quot;af38&quot;&gt;Шаблонов&lt;/li&gt;
    &lt;li id=&quot;cf07&quot;&gt;Docker-конфигураций&lt;/li&gt;
    &lt;li id=&quot;4fdf&quot;&gt;Встроенной документации&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;dd2c&quot;&gt;Читаемый Bash — это поддерживаемый Bash.&lt;/p&gt;
  &lt;h2 id=&quot;ac8f&quot;&gt;14. Делайте скрипты самодокументируемыми&lt;/h2&gt;
  &lt;p id=&quot;7807&quot;&gt;Добавьте &lt;code&gt;--help&lt;/code&gt; флаг.&lt;/p&gt;
  &lt;p id=&quot;d2cb&quot;&gt;Серьезно.&lt;/p&gt;
  &lt;pre id=&quot;elCu&quot; data-lang=&quot;bash&quot;&gt;if [[ &amp;quot;$1&amp;quot; == &amp;quot;--help&amp;quot; ]]; then
  echo &amp;quot;Usage: script.sh [options]&amp;quot;
  exit 0
fi&lt;/pre&gt;
  &lt;p id=&quot;a24a&quot;&gt;Даже короткое описание использования резко повышает удобство — для коллег и для вас из будущего.&lt;/p&gt;
  &lt;p id=&quot;84f1&quot;&gt;Профессиональные скрипты объясняют себя сами.&lt;/p&gt;
  &lt;h2 id=&quot;1b30&quot;&gt;15. Относитесь к скриптам Bash как к настоящему программному обеспечению.&lt;/h2&gt;
  &lt;p id=&quot;b204&quot;&gt;Это самый главный хак.&lt;/p&gt;
  &lt;p id=&quot;72fd&quot;&gt;Большинство скриптов Bash не работают не потому, что Bash плох, а потому, что мы относимся к скриптам как к одноразовому коду.&lt;/p&gt;
  &lt;p id=&quot;0284&quot;&gt;Сделайте следующее:&lt;/p&gt;
  &lt;ul id=&quot;CBU7&quot;&gt;
    &lt;li id=&quot;1007&quot;&gt;Используйте систему контроля версий.&lt;/li&gt;
    &lt;li id=&quot;86aa&quot;&gt;Добавляйте комментарии там, где их смысл не очевиден.&lt;/li&gt;
    &lt;li id=&quot;5e23&quot;&gt;Проводите рефакторинг по мере роста скриптов.&lt;/li&gt;
    &lt;li id=&quot;4aba&quot;&gt;Тестируйте в чистых окружениях&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;385a&quot;&gt;Bash поощряет дисциплину. Игнорируйте её, и он даст отпор.&lt;/p&gt;
  &lt;h2 id=&quot;8b12&quot;&gt;Вывод: Bash — это инструмент, многократно увеличивающий эффективность.&lt;/h2&gt;
  &lt;p id=&quot;095e&quot;&gt;Bash-скриптинг — это не про то, чтобы стать рок-звездой терминала. Bash-скриптинг — это про то, чтобы сделать вашу рабочую жизнь проще. Отправка сообщения в Slack. Загрузка случайной шутки в ваши сообщения. Поиск случайной картинки для добавления в ваши сообщения.&lt;/p&gt;
  &lt;p id=&quot;c885&quot;&gt;Вам не обязательно быть экспертом во всех аспектах Bash. Всё, что вам нужно, — это несколько полезных навыков и уверенность в их применении.&lt;/p&gt;
  &lt;p id=&quot;7a46&quot;&gt;Терминал — это место, где выполняются команды, но именно там сосредоточено влияние.&lt;/p&gt;
  &lt;p id=&quot;41a0&quot;&gt;&lt;em&gt;Если вы достаточно хорошо освоите программирование на Bash, ваш компьютер начнет работать на вас, а не наоборот.&lt;/em&gt;&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;7D3C&quot;&gt;На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где будет еще больше полезной информации.&lt;/p&gt;
  &lt;/section&gt;

</content></entry><entry><id>usr_bin_linux:ssh-guide</id><link rel="alternate" type="text/html" href="https://teletype.in/@usr_bin_linux/ssh-guide?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=usr_bin_linux"></link><title>Шпаргалка по SSH</title><published>2026-03-01T20:57:17.546Z</published><updated>2026-03-01T20:57:17.546Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/fb/e2/fbe2b5f3-0826-474f-a7d8-e5dfe4475288.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*JZlNk6p0FR8dDE4uPf9Izg.png&quot;&gt;Это перевод оригинальной статьи SSH Cheat Sheet.</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;Lsjz&quot;&gt;Это перевод оригинальной статьи &lt;a href=&quot;https://ozwizard.medium.com/ssh-cheat-sheet-4286e41fb92c&quot; target=&quot;_blank&quot;&gt;SSH Cheat Sheet&lt;/a&gt;.&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;a3Wm&quot;&gt;Подписывайтесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.&lt;/p&gt;
  &lt;/section&gt;
  &lt;blockquote id=&quot;Vhz3&quot;&gt;&lt;em&gt;Практическое, удобное для копирования и вставки руководство по SSH для инженеров Linux, системных администраторов, администраторов баз данных и SRE-специалистов.&lt;/em&gt;&lt;/blockquote&gt;
  &lt;figure id=&quot;IUq2&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*JZlNk6p0FR8dDE4uPf9Izg.png&quot; width=&quot;700&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;1a98&quot;&gt;Часть 1 — Основы SSH (для всех)&lt;/h2&gt;
  &lt;h2 id=&quot;19b5&quot;&gt;Основные принципы использования SSH&lt;/h2&gt;
  &lt;pre id=&quot;FzCd&quot; data-lang=&quot;bash&quot;&gt;ssh user@server_ip&lt;/pre&gt;
  &lt;p id=&quot;5fe3&quot;&gt;Подключитесь к удалённому серверу, используя стандартный порт &lt;strong&gt;22&lt;/strong&gt;.&lt;/p&gt;
  &lt;pre id=&quot;G8VM&quot; data-lang=&quot;bash&quot;&gt;ssh hostname&lt;/pre&gt;
  &lt;p id=&quot;9dd3&quot;&gt;Используются параметры из &lt;code&gt;~/.ssh/config&lt;/code&gt;, если они определены.&lt;/p&gt;
  &lt;h2 id=&quot;42de&quot;&gt;SSH с пользовательским портом и пользователем&lt;/h2&gt;
  &lt;pre id=&quot;Yw6a&quot; data-lang=&quot;bash&quot;&gt;ssh -p 2222 user@server_ip&lt;/pre&gt;
  &lt;p id=&quot;3e90&quot;&gt;Укажите нестандартный порт SSH.&lt;/p&gt;
  &lt;pre id=&quot;7XZ9&quot; data-lang=&quot;bash&quot;&gt;ssh user@hostname&lt;/pre&gt;
  &lt;p id=&quot;f0ff&quot;&gt;Войдите в систему под конкретным пользователем.&lt;/p&gt;
  &lt;h2 id=&quot;e818&quot;&gt;Аутентификация по SSH-ключу&lt;/h2&gt;
  &lt;h2 id=&quot;fca5&quot;&gt;Сгенерируйте SSH-ключ&lt;/h2&gt;
  &lt;pre id=&quot;g2EU&quot; data-lang=&quot;bash&quot;&gt;ssh-keygen -t ed25519&lt;/pre&gt;
  &lt;h2 id=&quot;7e13&quot;&gt;Скопируйте открытый ключ на сервер.&lt;/h2&gt;
  &lt;pre id=&quot;smQK&quot; data-lang=&quot;bash&quot;&gt;ssh-copy-id user@server_ip-copy-id user@server_ip&lt;/pre&gt;
  &lt;p id=&quot;85a7&quot;&gt;После этого ввод пароля при подключении больше не требуется.&lt;/p&gt;
  &lt;h2 id=&quot;b859&quot;&gt;Советы по работе с конфигурационными файлами SSH (настоятельно рекомендуется)&lt;/h2&gt;
  &lt;p id=&quot;9449&quot;&gt;Редактировать конфигурацию:&lt;/p&gt;
  &lt;pre id=&quot;IvOZ&quot; data-lang=&quot;bash&quot;&gt;nano ~/.ssh/config&lt;/pre&gt;
  &lt;p id=&quot;7585&quot;&gt;Пример:&lt;/p&gt;
  &lt;pre id=&quot;XRRh&quot; data-lang=&quot;bash&quot;&gt;Host prod-db
  HostName 10.10.10.20
  User postgres
  Port 22
  IdentityFile ~/.ssh/id_ed25519&lt;/pre&gt;
  &lt;p id=&quot;ac7b&quot;&gt;Подключение:&lt;/p&gt;
  &lt;pre id=&quot;ZBrq&quot; data-lang=&quot;bash&quot;&gt;ssh prod-db

# Cleaner
# Faster
# Less mistakes&lt;/pre&gt;
  &lt;h2 id=&quot;ddc7&quot;&gt;SSH-туннелирование и переадресация портов&lt;/h2&gt;
  &lt;h2 id=&quot;efaa&quot;&gt;Локальная переадресация портов&lt;/h2&gt;
  &lt;pre id=&quot;GUzP&quot; data-lang=&quot;bash&quot;&gt;ssh -L 5432:localhost:5432 user@server_ip&lt;/pre&gt;
  &lt;p id=&quot;ec79&quot;&gt;Получите доступ к &lt;strong&gt;удаленной базе данных PostgreSQL&lt;/strong&gt; так, будто он запущен локально.&lt;/p&gt;
  &lt;h2 id=&quot;e3c8&quot;&gt;Удалённая переадресация портов&lt;/h2&gt;
  &lt;pre id=&quot;fzgC&quot; data-lang=&quot;bash&quot;&gt;ssh -R 9000:localhost:3000 user@server_ip&lt;/pre&gt;
  &lt;p id=&quot;56fd&quot;&gt;Предоставьте удаленному компьютеру доступ к локальному сервису.&lt;/p&gt;
  &lt;h2 id=&quot;44c4&quot;&gt;Динамическая переадресация портов (SOCKS-прокси)&lt;/h2&gt;
  &lt;pre id=&quot;HeNi&quot; data-lang=&quot;bash&quot;&gt;ssh -D 8080 user@server_ip&lt;/pre&gt;
  &lt;p id=&quot;4f96&quot;&gt;Полезно для безопасного просмотра веб-страниц и настройки прокси-серверов.&lt;/p&gt;
  &lt;h2 id=&quot;4fb4&quot;&gt;Копирование файлов с помощью SCP и RSYNC&lt;/h2&gt;
  &lt;h2 id=&quot;fd57&quot;&gt;Копирование файла на удаленный сервер&lt;/h2&gt;
  &lt;pre id=&quot;rDCp&quot; data-lang=&quot;bash&quot;&gt;scp file.txt user@server_ip:/path/&lt;/pre&gt;
  &lt;h2 id=&quot;d70a&quot;&gt;Копирование директории&lt;/h2&gt;
  &lt;pre id=&quot;KqRh&quot; data-lang=&quot;bash&quot;&gt;scp -r mydir user@server_ip:/path/&lt;/pre&gt;
  &lt;h2 id=&quot;ab69&quot;&gt;Более быстрый и надёжный способ (рекомендуется)&lt;/h2&gt;
  &lt;pre id=&quot;h22M&quot; data-lang=&quot;bash&quot;&gt;rsync -avz file.txt user@server_ip:/path/&lt;/pre&gt;
  &lt;h2 id=&quot;b122&quot;&gt;Отладка SSH-подключений&lt;/h2&gt;
  &lt;pre id=&quot;vsUl&quot; data-lang=&quot;bash&quot;&gt;ssh -v user@server_ip&lt;/pre&gt;
  &lt;p id=&quot;477c&quot;&gt;Ещё больше деталей:&lt;/p&gt;
  &lt;pre id=&quot;j523&quot; data-lang=&quot;bash&quot;&gt;ssh -vvv user@server_ip&lt;/pre&gt;
  &lt;p id=&quot;3fbe&quot;&gt;Проверьте, какой ключ используется:&lt;/p&gt;
  &lt;pre id=&quot;8lj7&quot; data-lang=&quot;bash&quot;&gt;ssh -i ~/.ssh/mykey user@server_ip&lt;/pre&gt;
  &lt;h2 id=&quot;c2d4&quot;&gt;Лучшие практики безопасности&lt;/h2&gt;
  &lt;p id=&quot;e3c2&quot;&gt;Отключить аутентификацию по паролю&lt;br /&gt;Использовать SSH-ключи&lt;br /&gt;Сменить стандартный порт&lt;br /&gt;Использовать &lt;code&gt;Fail2Ban&lt;/code&gt;&lt;br /&gt;Ограничить доступ пользователей через&lt;code&gt;AllowUsers&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;3f2e&quot;&gt;Пример (&lt;code&gt;sshd_config&lt;/code&gt;):&lt;/p&gt;
  &lt;pre id=&quot;NawW&quot; data-lang=&quot;bash&quot;&gt;PasswordAuthentication no
PermitRootLogin no&lt;/pre&gt;
  &lt;p id=&quot;3a68&quot;&gt;Перезапустите SSH:&lt;/p&gt;
  &lt;pre id=&quot;vw4Y&quot; data-lang=&quot;bash&quot;&gt;sudo systemctl restart sshd&lt;/pre&gt;
  &lt;h2 id=&quot;9872&quot;&gt;Часть 2 — Объяснение параметров SSH (от новичка до продвинутого)&lt;/h2&gt;
  &lt;blockquote id=&quot;UYBH&quot;&gt;&lt;em&gt;В этом разделе простыми словами объясняются &lt;strong&gt;параметры командной строки SSH&lt;/strong&gt;. Для понимания этой части вам не потребуются предварительные знания SSH.&lt;/em&gt;&lt;/blockquote&gt;
  &lt;h2 id=&quot;5633&quot;&gt;Напоминание о базовом синтаксисе&lt;/h2&gt;
  &lt;pre id=&quot;wpNh&quot; data-lang=&quot;bash&quot;&gt;ssh [options] user@host&lt;/pre&gt;
  &lt;ul id=&quot;kj7g&quot;&gt;
    &lt;li id=&quot;efe3&quot;&gt;&lt;strong&gt;user&lt;/strong&gt; → имя пользователя удаленного Linux&lt;/li&gt;
    &lt;li id=&quot;9dea&quot;&gt;&lt;strong&gt;host&lt;/strong&gt; → IP-адрес или имя хоста сервера&lt;/li&gt;
    &lt;li id=&quot;bbbc&quot;&gt;&lt;strong&gt;options&lt;/strong&gt; → параметры поведения SSH (что мы объясним ниже)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;5d93&quot;&gt;Основные и наиболее часто используемые опции (необходимо знать)&lt;/h2&gt;
  &lt;h2 id=&quot;544a&quot;&gt;&lt;code&gt;-p&lt;/code&gt; → Порт&lt;/h2&gt;
  &lt;pre id=&quot;6Fz3&quot; data-lang=&quot;bash&quot;&gt;ssh -p 2222 user@server&lt;/pre&gt;
  &lt;p id=&quot;3556&quot;&gt;Подключение к &lt;strong&gt;пользовательскому SSH-порту.&lt;/strong&gt;&lt;br /&gt;Порт SSH по умолчанию = &lt;strong&gt;22.&lt;/strong&gt;&lt;br /&gt;Часто меняется из соображений безопасности&lt;/p&gt;
  &lt;blockquote id=&quot;6VlO&quot;&gt;&lt;em&gt;Представьте, что порт — это&lt;/em&gt; номер двери &lt;em&gt;на сервере.&lt;/em&gt;&lt;/blockquote&gt;
  &lt;h2 id=&quot;b8dc&quot;&gt;&lt;code&gt;-l&lt;/code&gt; → Имя пользователя&lt;/h2&gt;
  &lt;pre id=&quot;UNnt&quot; data-lang=&quot;bash&quot;&gt;ssh -l postgres server_ip&lt;/pre&gt;
  &lt;p id=&quot;51fe&quot;&gt;Указывает, от имени &lt;strong&gt;какого пользователя&lt;/strong&gt; следует войти в систему. То&lt;br /&gt;же самое, что и:&lt;/p&gt;
  &lt;pre id=&quot;DbSg&quot; data-lang=&quot;bash&quot;&gt;ssh postgres@server_ip&lt;/pre&gt;
  &lt;h2 id=&quot;abd7&quot;&gt;&lt;code&gt;-i&lt;/code&gt; → Файл идентификации (SSH-ключ)&lt;/h2&gt;
  &lt;pre id=&quot;15XK&quot; data-lang=&quot;bash&quot;&gt;ssh -i ~/.ssh/id_ed25519 user@server&lt;/pre&gt;
  &lt;p id=&quot;f83e&quot;&gt;Указывает SSH, &lt;strong&gt;какой закрытый ключ использовать.&lt;/strong&gt;&lt;br /&gt;Полезно, когда у вас &lt;strong&gt;несколько ключей SSH.&lt;/strong&gt;&lt;/p&gt;
  &lt;h2 id=&quot;76fe&quot;&gt;&lt;code&gt;-v&lt;/code&gt;, &lt;code&gt;-vv&lt;/code&gt;, &lt;code&gt;-vvv&lt;/code&gt; → Подробный режим / Режим отладки&lt;/h2&gt;
  &lt;pre id=&quot;gKe1&quot; data-lang=&quot;bash&quot;&gt;ssh -v user@server&lt;/pre&gt;
  &lt;p id=&quot;2d86&quot;&gt;Отображает этапы подключения.&lt;br /&gt;Помогает отлаживать:&lt;/p&gt;
  &lt;ul id=&quot;wB35&quot;&gt;
    &lt;li id=&quot;35d2&quot;&gt;проблемы аутентификации&lt;/li&gt;
    &lt;li id=&quot;b404&quot;&gt;неправильные ключи&lt;/li&gt;
    &lt;li id=&quot;33a5&quot;&gt;сетевые ошибки&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;f88d&quot;&gt;Чем больше &lt;code&gt;v&lt;/code&gt;, тем больше деталей.&lt;/p&gt;
  &lt;h2 id=&quot;7e86&quot;&gt;&lt;code&gt;-F&lt;/code&gt; → Пользовательский файл конфигурации&lt;/h2&gt;
  &lt;pre id=&quot;QylU&quot; data-lang=&quot;bash&quot;&gt;ssh -F myconfig user@server&lt;/pre&gt;
  &lt;p id=&quot;5288&quot;&gt;Используйте &lt;strong&gt;нестандартный файл конфигурации SSH.&lt;/strong&gt;&lt;br /&gt;По умолчанию используется:&lt;/p&gt;
  &lt;pre id=&quot;4Ct1&quot; data-lang=&quot;bash&quot;&gt;~/.ssh/config&lt;/pre&gt;
  &lt;h2 id=&quot;4244&quot;&gt;Параметры аутентификации и безопасности&lt;/h2&gt;
  &lt;h2 id=&quot;d709&quot;&gt;&lt;code&gt;-o&lt;/code&gt; → Пользовательская опция SSH&lt;/h2&gt;
  &lt;pre id=&quot;6ikb&quot; data-lang=&quot;bash&quot;&gt;ssh -o StrictHostKeyChecking=no user@server&lt;/pre&gt;
  &lt;p id=&quot;340a&quot;&gt;Передайте &lt;strong&gt;любые расширенные настройки SSH&lt;/strong&gt; вручную.&lt;br /&gt;Эквивалентно параметрам из &lt;code&gt;ssh_config&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;b9d6&quot;&gt;Частые примеры:&lt;/p&gt;
  &lt;pre id=&quot;rh6P&quot; data-lang=&quot;bash&quot;&gt;-o PasswordAuthentication=no
-o ConnectTimeout=5&lt;/pre&gt;
  &lt;h2 id=&quot;1ca0&quot;&gt;&lt;code&gt;-A&lt;/code&gt; → Переадресация агента SSH&lt;/h2&gt;
  &lt;pre id=&quot;AFln&quot; data-lang=&quot;bash&quot;&gt;ssh -A user@server&lt;/pre&gt;
  &lt;p id=&quot;f6d8&quot;&gt;Переадресация локальных SSH-ключей на удаленный сервер.&lt;br /&gt;Используется для &lt;strong&gt;промежуточных серверов.&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;e100&quot;&gt;Использовать с осторожностью (риск безопасности на ненадежных серверах).&lt;/p&gt;
  &lt;h2 id=&quot;57fc&quot;&gt;&lt;code&gt;-a&lt;/code&gt; → Отключить переадресацию агента&lt;/h2&gt;
  &lt;pre id=&quot;qLCs&quot; data-lang=&quot;bash&quot;&gt;ssh -a user@server&lt;/pre&gt;
  &lt;p id=&quot;af32&quot;&gt;Более безопасный вариант по умолчанию:&lt;br /&gt;Явно отключает переадресацию ключей.&lt;/p&gt;
  &lt;h2 id=&quot;1ac9&quot;&gt;&lt;code&gt;-K&lt;/code&gt; → Аутентификация GSSAPI&lt;/h2&gt;
  &lt;pre id=&quot;ZTHH&quot; data-lang=&quot;bash&quot;&gt;ssh -K user@server&lt;/pre&gt;
  &lt;p id=&quot;dd7a&quot;&gt;Используется в &lt;strong&gt;средах Kerberos / корпоративных средах.&lt;/strong&gt;&lt;/p&gt;
  &lt;h2 id=&quot;a0ba&quot;&gt;Переадресация и туннелирование&lt;/h2&gt;
  &lt;h2 id=&quot;78bb&quot;&gt;&lt;code&gt;-L&lt;/code&gt; → Переадресация локальных портов&lt;/h2&gt;
  &lt;pre id=&quot;yRSV&quot; data-lang=&quot;bash&quot;&gt;ssh -L 5432:localhost:5432 user@server&lt;/pre&gt;
  &lt;p id=&quot;fa63&quot;&gt;Доступ к &lt;strong&gt;удалённому сервису локально.&lt;/strong&gt;&lt;br /&gt;Очень распространён в:&lt;/p&gt;
  &lt;ul id=&quot;Oq7O&quot;&gt;
    &lt;li id=&quot;e76b&quot;&gt;PostgreSQL&lt;/li&gt;
    &lt;li id=&quot;a7e4&quot;&gt;MySQL&lt;/li&gt;
    &lt;li id=&quot;f46f&quot;&gt;Веб-приложения&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;7c86&quot;&gt;&lt;code&gt;-R&lt;/code&gt; → Удалённая переадресация портов&lt;/h2&gt;
  &lt;pre id=&quot;2k4Q&quot; data-lang=&quot;bash&quot;&gt;ssh -R 8080:localhost:3000 user@server&lt;/pre&gt;
  &lt;p id=&quot;a81a&quot;&gt;Предоставить &lt;strong&gt;удалённому серверу&lt;/strong&gt; доступ к &lt;strong&gt;локальному сервису&lt;/strong&gt;&lt;/p&gt;
  &lt;h2 id=&quot;a231&quot;&gt;&lt;code&gt;-D&lt;/code&gt; → Динамическая переадресация портов (SOCKS-прокси)&lt;/h2&gt;
  &lt;pre id=&quot;kdPG&quot; data-lang=&quot;bash&quot;&gt;ssh -D 1080 user@server&lt;/pre&gt;
  &lt;p id=&quot;861d&quot;&gt;Создает &lt;strong&gt;SOCKS-прокси.&lt;/strong&gt;&lt;br /&gt;Используется для:&lt;/p&gt;
  &lt;ul id=&quot;AiLp&quot;&gt;
    &lt;li id=&quot;5283&quot;&gt;безопасного просмотр&lt;/li&gt;
    &lt;li id=&quot;1a00&quot;&gt;туннелирования трафика&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;9492&quot;&gt;&lt;code&gt;-W&lt;/code&gt; → Переадресация стандартного ввода/вывода&lt;/h2&gt;
  &lt;pre id=&quot;zHeA&quot; data-lang=&quot;bash&quot;&gt;ssh -W host:port user@server&lt;/pre&gt;
  &lt;p id=&quot;e279&quot;&gt;В основном используется с&lt;strong&gt; ProxyJump.&lt;/strong&gt;&lt;/p&gt;
  &lt;h2 id=&quot;71d3&quot;&gt;Jump-хосты и несколько серверов&lt;/h2&gt;
  &lt;h2 id=&quot;8ec2&quot;&gt;&lt;code&gt;-J&lt;/code&gt; → Jump Host (Bastion Server)&lt;/h2&gt;
  &lt;pre id=&quot;sZBc&quot; data-lang=&quot;bash&quot;&gt;ssh -J user@jumpserver user@target&lt;/pre&gt;
  &lt;p id=&quot;8ed8&quot;&gt;Подключение через другой сервер.&lt;br /&gt;Современная альтернатива сложным туннелям.&lt;/p&gt;
  &lt;h2 id=&quot;b3ff&quot;&gt;Управление сессией&lt;/h2&gt;
  &lt;h2 id=&quot;ce94&quot;&gt;&lt;code&gt;-N&lt;/code&gt; → без выполнения команд&lt;/h2&gt;
  &lt;pre id=&quot;UdME&quot; data-lang=&quot;bash&quot;&gt;ssh -N -L 5432:localhost:5432 user@server&lt;/pre&gt;
  &lt;p id=&quot;7a3f&quot;&gt;&lt;strong&gt;Только&lt;/strong&gt; открытый туннель.&lt;br /&gt;Доступ к оболочке запрещен.&lt;/p&gt;
  &lt;h2 id=&quot;5ec5&quot;&gt;&lt;code&gt;-T&lt;/code&gt; → Отключить псевдо-TTY&lt;/h2&gt;
  &lt;pre id=&quot;UPuA&quot; data-lang=&quot;bash&quot;&gt;ssh -T user@server&lt;/pre&gt;
  &lt;p id=&quot;d42b&quot;&gt;Используется в скриптах.&lt;br /&gt;Нет интерактивного терминала.&lt;/p&gt;
  &lt;h2 id=&quot;86cb&quot;&gt;&lt;code&gt;-t&lt;/code&gt; → Принудительно включить TTY&lt;/h2&gt;
  &lt;pre id=&quot;2dC3&quot; data-lang=&quot;bash&quot;&gt;ssh -t user@server &amp;quot;sudo systemctl restart postgresql&amp;quot;&lt;/pre&gt;
  &lt;p id=&quot;70af&quot;&gt;Необходимо для &lt;code&gt;sudo&lt;/code&gt;.&lt;/p&gt;
  &lt;h2 id=&quot;55b7&quot;&gt;Фон и управление&lt;/h2&gt;
  &lt;h2 id=&quot;ff33&quot;&gt;&lt;code&gt;-f&lt;/code&gt; → Фоновый режим&lt;/h2&gt;
  &lt;pre id=&quot;e80o&quot; data-lang=&quot;bash&quot;&gt;ssh -f -N -L 5432:localhost:5432 user@server&lt;/pre&gt;
  &lt;p id=&quot;367c&quot;&gt;Запуск SSH в фоновом режиме.&lt;br /&gt;Идеально подходит для туннелей.&lt;/p&gt;
  &lt;h2 id=&quot;e03d&quot;&gt;&lt;code&gt;-S&lt;/code&gt; → control socket&lt;/h2&gt;
  &lt;pre id=&quot;V3Gk&quot; data-lang=&quot;bash&quot;&gt;ssh -S /tmp/ssh.sock user@server&lt;/pre&gt;
  &lt;p id=&quot;7c98&quot;&gt;Используется при &lt;strong&gt;совместным использованием соединений.&lt;/strong&gt;&lt;/p&gt;
  &lt;h2 id=&quot;9d83&quot;&gt;&lt;code&gt;-O&lt;/code&gt; → Команды управления&lt;/h2&gt;
  &lt;pre id=&quot;SMXu&quot; data-lang=&quot;bash&quot;&gt;ssh -O exit user@server&lt;/pre&gt;
  &lt;p id=&quot;70b8&quot;&gt;Управление существующим SSH-соединением&lt;/p&gt;
  &lt;h2 id=&quot;a843&quot;&gt;Шифрование и алгоритмы&lt;/h2&gt;
  &lt;h2 id=&quot;0cb3&quot;&gt;&lt;code&gt;-c&lt;/code&gt; → Шифр&lt;/h2&gt;
  &lt;pre id=&quot;MPrV&quot; data-lang=&quot;bash&quot;&gt;ssh -c aes256-gcm@openssh.com user@server&lt;/pre&gt;
  &lt;p id=&quot;db22&quot;&gt;Выберите алгоритм шифрования&lt;/p&gt;
  &lt;h2 id=&quot;b674&quot;&gt;&lt;code&gt;-m&lt;/code&gt; → MAC-алгоритм&lt;/h2&gt;
  &lt;pre id=&quot;stHN&quot; data-lang=&quot;bash&quot;&gt;ssh -m hmac-sha2-256 user@server&lt;/pre&gt;
  &lt;p id=&quot;5f01&quot;&gt;алгоритм аутентификации сообщений&lt;/p&gt;
  &lt;h2 id=&quot;b7da&quot;&gt;&lt;code&gt;-Q&lt;/code&gt; → Запрос поддерживаемых алгоритмов&lt;/h2&gt;
  &lt;pre id=&quot;UZ0E&quot; data-lang=&quot;bash&quot;&gt;ssh -Q cipher
ssh -Q mac&lt;/pre&gt;
  &lt;p id=&quot;45ea&quot;&gt;Выводит список поддерживаемых алгоритмов.&lt;/p&gt;
  &lt;h2 id=&quot;5364&quot;&gt;Параметры сетевого уровня&lt;/h2&gt;
  &lt;h2 id=&quot;0cfd&quot;&gt;&lt;code&gt;-B&lt;/code&gt; → Привязка к сетевому интерфейсу&lt;/h2&gt;
  &lt;pre id=&quot;4w2y&quot; data-lang=&quot;bash&quot;&gt;ssh -B eth0 user@server&lt;/pre&gt;
  &lt;p id=&quot;be78&quot;&gt;Принудительно направляет SSH-трафик через указанный сетевой интерфейс.&lt;/p&gt;
  &lt;h2 id=&quot;6f34&quot;&gt;&lt;code&gt;-b&lt;/code&gt; → Исходный адрес&lt;/h2&gt;
  &lt;pre id=&quot;FIxQ&quot; data-lang=&quot;bash&quot;&gt;ssh -b 192.168.1.10 user@server&lt;/pre&gt;
  &lt;p id=&quot;ddf3&quot;&gt;Использует конкретный локальный IP-адрес в качестве источника соединения.&lt;/p&gt;
  &lt;h2 id=&quot;191c&quot;&gt;Золотое правило (совет для новичков)&lt;/h2&gt;
  &lt;blockquote id=&quot;m3w5&quot;&gt;&lt;em&gt;Если команда SSH кажется &lt;strong&gt;длинной или пугающей&lt;/strong&gt;, перенесите её в &lt;code&gt;~/.ssh/config&lt;/code&gt; и упростите себе жизнь.&lt;/em&gt;&lt;/blockquote&gt;
  &lt;p id=&quot;63a0&quot;&gt;SSH — это больше, чем просто способ подключения к серверу; это &lt;strong&gt;мощный инструмент&lt;/strong&gt; для безопасного доступа, автоматизации и устранения неполадок. Если вы понимаете основы&lt;strong&gt;,&lt;/strong&gt; вы можете безопасно управлять любой системой Linux. Если вы освоите параметры&lt;strong&gt;,&lt;/strong&gt; вы сможете уверенно работать со сложными конфигурациями, такими как туннели, бастионные хосты и производственные среды.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;vfHT&quot;&gt;На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где будет еще больше полезной информации.&lt;/p&gt;
  &lt;/section&gt;

</content></entry><entry><id>usr_bin_linux:linux-network-settings-basic</id><link rel="alternate" type="text/html" href="https://teletype.in/@usr_bin_linux/linux-network-settings-basic?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=usr_bin_linux"></link><title>Как разобраться c сетевыми настройками Linux, не читая 500-страничную книгу</title><published>2026-03-01T20:49:49.177Z</published><updated>2026-03-01T20:49:49.177Z</updated><summary type="html">Это перевод оригинальной статьи Understanding Linux Networking Without Reading a 500-Page Book.</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;hLsn&quot;&gt;Это перевод оригинальной статьи &lt;a href=&quot;https://medium.com/codex/understanding-linux-networking-without-reading-a-500-page-book-14c756494464&quot; target=&quot;_blank&quot;&gt;Understanding Linux Networking Without Reading a 500-Page Book&lt;/a&gt;.&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;XsVo&quot;&gt;Подписывайтесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;257f&quot;&gt;Раньше я замирал, как только слышал: «&lt;em&gt;Проблема с сетью&lt;/em&gt;».&lt;br /&gt;Процессор? Диск? Хорошо. Но когда я слышал: «Сеть», мой мозг отключался, а сердцебиение учащалось.&lt;/p&gt;
  &lt;p id=&quot;9f87&quot;&gt;Этот страх вполне обоснован. Сетевые возможности Linux — это то, что большинство из нас делает вид, что знает… до тех пор, пока не сталкивается с реальной проблемой…&lt;/p&gt;
  &lt;h2 id=&quot;b4f8&quot;&gt;Единственная реальная проблема, о которой никто не говорит&lt;/h2&gt;
  &lt;p id=&quot;1ab8&quot;&gt;Проблема не в том, что работа с сетями в Linux сложна. Проблема в том, что &lt;strong&gt;мы пытаемся изучать её как теоретический материал. &lt;/strong&gt;OSI-слои. Диаграммы. Стрелки. Замысловатые термины. Но когда сервер не может подключиться к интернету, ничто из этого не помогает. Я усвоил это после множества ошибок.&lt;/p&gt;
  &lt;h2 id=&quot;3e7d&quot;&gt;Моя первая сетевая ошибка&lt;/h2&gt;
  &lt;p id=&quot;348c&quot;&gt;Я был новичком, не очень опытным. У меня были хорошие знания Linux, но сети — это то, чего я боялся. В любом случае это была новая работа, и я обрёл уверенность. В тот день приложение выдало сообщение: &lt;em&gt;«Сервер не может подключиться к базе данных».&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;5395&quot;&gt;В тот момент сеньора не было на месте, и команда разработчиков приложения постоянно просила меня срочно все проверить, поэтому я, как новичок, проверил следующее:&lt;/p&gt;
  &lt;ul id=&quot;g6oM&quot;&gt;
    &lt;li id=&quot;da49&quot;&gt;Сервис работает&lt;/li&gt;
    &lt;li id=&quot;9380&quot;&gt;Firewall «выглядит нормально»&lt;/li&gt;
    &lt;li id=&quot;0e87&quot;&gt;Перезапустил сетевой сервис (большая ошибка).&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;6c6e&quot;&gt;Сеть не восстановилась. SSH пропал.&lt;br /&gt;Я в панике позвонил сеньору, рассказал обо всем, и он поспешил в офис. Через 10 минут сеньор посмотрел на меня и задал один простой вопрос:&lt;/p&gt;
  &lt;blockquote id=&quot;lKg0&quot;&gt;&lt;em&gt;«Вы вообще проверяли маршрут?»&lt;/em&gt;&lt;/blockquote&gt;
  &lt;p id=&quot;7619&quot;&gt;Я этого не делал.&lt;/p&gt;
  &lt;p id=&quot;VW6a&quot;&gt;В тот день я понял важную вещь:&lt;strong&gt;&lt;br /&gt;Нетворкинг — это не теория. Это поток.&lt;/strong&gt;&lt;/p&gt;
  &lt;blockquote id=&quot;yiEQ&quot;&gt;Сначала разрушим это распространённое заблуждение.&lt;br /&gt;&lt;em&gt;«Если есть IP-протокол, то сеть работает нормально».&lt;br /&gt;«Пинг работает, значит, всё работает».&lt;br /&gt;«Это проблема с брандмауэром».&lt;br /&gt;&lt;/em&gt;Нет. Прекратите так думать.&lt;/blockquote&gt;
  &lt;p id=&quot;bdd6&quot;&gt;Сеть ломается в &lt;strong&gt;реальности&lt;/strong&gt;, а не в учебниках.&lt;/p&gt;
  &lt;h2 id=&quot;bf39&quot;&gt;Как я теперь понимаю Linux-сеть&lt;/h2&gt;
  &lt;p id=&quot;7b14&quot;&gt;Никаких книг на 500 страниц. Никаких диаграмм на стене.&lt;br /&gt;Только &lt;strong&gt;пять проверок&lt;/strong&gt;, всегда в таком порядке.&lt;/p&gt;
  &lt;h2 id=&quot;c127&quot;&gt;Начните с интерфейса (а не с Google).&lt;/h2&gt;
  &lt;pre id=&quot;Xxng&quot; data-lang=&quot;bash&quot;&gt;ip addr show&lt;/pre&gt;
  &lt;p id=&quot;dc79&quot;&gt;Задайте себе вопрос:&lt;/p&gt;
  &lt;ul id=&quot;NOax&quot;&gt;
    &lt;li id=&quot;6d87&quot;&gt;Интерфейс активен?&lt;/li&gt;
    &lt;li id=&quot;d405&quot;&gt;У него правильный IP-адрес?&lt;/li&gt;
    &lt;li id=&quot;b6b2&quot;&gt;Это тот интерфейс, который вы себе &lt;em&gt;представляете&lt;/em&gt;?&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;7de6&quot;&gt;Однажды я потратил 30 минут на отладку &lt;code&gt;eth0&lt;/code&gt;.&lt;br /&gt;А реальный трафик шёл через &lt;code&gt;ens192&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;2320&quot;&gt;Урок усвоен.&lt;/p&gt;
  &lt;h2 id=&quot;c267&quot;&gt;Проверьте маршрут&lt;/h2&gt;
  &lt;pre id=&quot;dP8H&quot; data-lang=&quot;bash&quot;&gt;ip route&lt;/pre&gt;
  &lt;p id=&quot;5504&quot;&gt;Большинство проблем скрывается здесь.&lt;/p&gt;
  &lt;p id=&quot;50d7&quot;&gt;Нет default route?&lt;br /&gt;Неправильный gateway?&lt;br /&gt;Несколько маршрутов конфликтуют друг с другом?&lt;/p&gt;
  &lt;p id=&quot;1865&quot;&gt;Если Linux не знает, &lt;strong&gt;куда&lt;/strong&gt; отправлять пакеты, то неважно, насколько вы умны.&lt;/p&gt;
  &lt;h2 id=&quot;255b&quot;&gt;Не стоит слепо доверять пингу.&lt;/h2&gt;
  &lt;p id=&quot;dc6d&quot;&gt;Да, пинг полезен.&lt;br /&gt;Но ложные ответы случаются часто.&lt;/p&gt;
  &lt;pre id=&quot;6oye&quot; data-lang=&quot;bash&quot;&gt;ping -c 3 8.8.8.8&lt;/pre&gt;
  &lt;p id=&quot;07de&quot;&gt;Если работает:&lt;/p&gt;
  &lt;ul id=&quot;crWB&quot;&gt;
    &lt;li id=&quot;9fe8&quot;&gt;IP-маршрутизация работает&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;d17b&quot;&gt;Если это не поможет:&lt;/p&gt;
  &lt;ul id=&quot;ZAw2&quot;&gt;
    &lt;li id=&quot;fa68&quot;&gt;Перестаньте винить DNS&lt;/li&gt;
    &lt;li id=&quot;697c&quot;&gt;Перестаньте трогать firewall&lt;/li&gt;
    &lt;li id=&quot;53dd&quot;&gt;Сначала исправьте маршрутизацию.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;132c&quot;&gt;DNS — это скучно… пока он всё не ломает.&lt;/h2&gt;
  &lt;pre id=&quot;RM0o&quot; data-lang=&quot;bash&quot;&gt;cat /etc/resolv.conf&lt;/pre&gt;
  &lt;p id=&quot;2b95&quot;&gt;Однажды я увидел:&lt;/p&gt;
  &lt;pre id=&quot;ZSyu&quot; data-lang=&quot;bash&quot;&gt;nameserver 127.0.0.1&lt;/pre&gt;
  &lt;p id=&quot;36df&quot;&gt;Служба DNS не запущена.&lt;/p&gt;
  &lt;p id=&quot;2a82&quot;&gt;Проверка простая, эффект огромный.&lt;/p&gt;
  &lt;p id=&quot;51bd&quot;&gt;Проверьте это:&lt;/p&gt;
  &lt;pre id=&quot;ddqm&quot; data-lang=&quot;bash&quot;&gt;nslookup google.com&lt;/pre&gt;
  &lt;p id=&quot;e678&quot;&gt;Если IP-адреса работают, а имена — нет, добро пожаловать в ад DNS.&lt;/p&gt;
  &lt;h2 id=&quot;66dc&quot;&gt;Только теперь смотрите фаервол (в последнюю очередь, не в первую).&lt;/h2&gt;
  &lt;pre id=&quot;LMtV&quot; data-lang=&quot;bash&quot;&gt;iptables -L -n
# or
firewall-cmd --list-all&lt;/pre&gt;
  &lt;p id=&quot;b86b&quot;&gt;Чаще всего в первую очередь винят брандмауэр.&lt;br /&gt;На самом деле он чаще всего оказывается &lt;strong&gt;последним&lt;/strong&gt; в списке причин. Если маршрут настроен неправильно — брандмауэр ни при чём.&lt;/p&gt;
  &lt;h2 id=&quot;ed2a&quot;&gt;Что сеньоры делают иначе&lt;/h2&gt;
  &lt;p id=&quot;4d3d&quot;&gt;Они мысленно &lt;strong&gt;отслеживают путь пакета.&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;e1b3&quot;&gt;Интерфейс → Маршрут → Gateway → DNS → Firewall&lt;/p&gt;
  &lt;p id=&quot;a78e&quot;&gt;Каждый. Раз.&lt;/p&gt;
  &lt;h2 id=&quot;65c0&quot;&gt;Почему это меня зацепило&lt;/h2&gt;
  &lt;p id=&quot;0019&quot;&gt;Я перестал пытаться &lt;em&gt;изучить сеть&lt;/em&gt;. Я начал следить за т&lt;em&gt;рафиком&lt;/em&gt;. Пакеты не интересуются вашими сертификатами. Им важна только правильная направленность.&lt;/p&gt;
  &lt;h2 id=&quot;0aa8&quot;&gt;Для Linux-администраторов в 2026 году&lt;/h2&gt;
  &lt;p id=&quot;e473&quot;&gt;Сегодня системным администраторам не нужна книга по CCNA, достаточно лишь сохранять спокойствие в стрессовых ситуациях. Системные администраторы обладают знаниями во всех областях ИТ, не мастерски, но хорошо разбираются в сетях, операционных системах, физических серверах, оборудовании, облачных технологиях и т.д.&lt;/p&gt;
  &lt;p id=&quot;2016&quot;&gt;Большинство проблем, связанных с сетями, скучны, мы просто делаем их пугающими.&lt;/p&gt;
  &lt;p id=&quot;3781&quot;&gt;Я до сих пор не всё знаю о сетях, но теперь, по крайней мере, я их не боюсь. И это всё меняет.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;kX7c&quot;&gt;На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где будет еще больше полезной информации.&lt;/p&gt;
  &lt;/section&gt;

</content></entry><entry><id>usr_bin_linux:ip-tables-guide</id><link rel="alternate" type="text/html" href="https://teletype.in/@usr_bin_linux/ip-tables-guide?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=usr_bin_linux"></link><title>Практическое руководство по IPTABLES: правила, примеры и лучшие практики безопасности</title><published>2026-03-01T20:45:00.627Z</published><updated>2026-03-01T20:45:00.627Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/a0/18/a018d82f-7b8b-4097-9934-49137c0402d5.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*ZF4m3rPiYueBlx3rhen00g.png&quot;&gt;Это перевод оригинальной статьи Linux IPTABLES Firewall Practical Guide: Rules, Examples &amp; Security Best Practices (Linux Firewall).</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;4TMY&quot;&gt;Это перевод оригинальной статьи &lt;a href=&quot;https://medium.com/write-a-catalyst/iptables-linux-firewall-complete-practical-guide-d469b3111070&quot; target=&quot;_blank&quot;&gt;Linux IPTABLES Firewall Practical Guide: Rules, Examples &amp;amp; Security Best Practices (Linux Firewall)&lt;/a&gt;.&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;VAp9&quot;&gt;Подписывайтесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.&lt;/p&gt;
  &lt;/section&gt;
  &lt;h3 id=&quot;b140&quot;&gt;Брандмауэр на уровне ядра с объяснением правил, кейсов и шпаргалкой для админов&lt;/h3&gt;
  &lt;h2 id=&quot;48cb&quot;&gt;📖 Что такое IPTables?&lt;/h2&gt;
  &lt;p id=&quot;3ea4&quot;&gt;&lt;strong&gt;IPTables&lt;/strong&gt; — это &lt;strong&gt;брандмауэр на уровне ядра&lt;/strong&gt; в Linux, построенный на &lt;strong&gt;фреймворке&lt;/strong&gt; &lt;strong&gt;Netfilter&lt;/strong&gt;. Он фильтрует, модифицирует, разрешает или блокирует сетевой трафик на уровне ОС, что делает его одним из самых мощных и гибких инструментов для защиты Linux.&lt;/p&gt;
  &lt;blockquote id=&quot;1l6h&quot;&gt;&lt;em&gt;⚠️ Примечание: IPTables — это &lt;strong&gt;программный брандмауэр&lt;/strong&gt;, а не аппаратный (хотя он выполняет аналогичные функции безопасности).&lt;/em&gt;&lt;/blockquote&gt;
  &lt;h2 id=&quot;f124&quot;&gt;🎯 Какую проблему решает IPTables?&lt;/h2&gt;
  &lt;p id=&quot;52dd&quot;&gt;Без брандмауэра:&lt;/p&gt;
  &lt;ul id=&quot;0Pxz&quot;&gt;
    &lt;li id=&quot;95bd&quot;&gt;Любой хост может получить доступ к вашему серверу.&lt;/li&gt;
    &lt;li id=&quot;c78f&quot;&gt;Сервисы открыты в интернет&lt;/li&gt;
    &lt;li id=&quot;2ff6&quot;&gt;Системы уязвимы к brute-force и DoS-атакам.&lt;/li&gt;
    &lt;li id=&quot;3fc4&quot;&gt;Отсутствует контроль над входящим/исходящим трафиком.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;77e6&quot;&gt;&lt;strong&gt;IPTables позволяет:&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;s2pg&quot;&gt;
    &lt;li id=&quot;b3fa&quot;&gt;Блокировать неавторизованный доступ&lt;/li&gt;
    &lt;li id=&quot;6ce6&quot;&gt;Контролировать порты входящего и исходящего трафика&lt;/li&gt;
    &lt;li id=&quot;72eb&quot;&gt;Предотвращать подмену IP-адреса&lt;/li&gt;
    &lt;li id=&quot;719f&quot;&gt;Защищать от DoS-атак&lt;/li&gt;
    &lt;li id=&quot;21fb&quot;&gt;Обеспечивать безопасность Linux-серверов (физических, виртуальных, облачных)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;3be9&quot;&gt;🧠 Основные понятия (важно для администраторов и DevOps)&lt;/h2&gt;
  &lt;h2 id=&quot;c567&quot;&gt;Основы работы с IPTables&lt;/h2&gt;
  &lt;ul id=&quot;KoP6&quot;&gt;
    &lt;li id=&quot;7331&quot;&gt;&lt;strong&gt;iptables&lt;/strong&gt; → Команда / утилита / инструмент&lt;/li&gt;
    &lt;li id=&quot;e70b&quot;&gt;&lt;strong&gt;Rules&lt;/strong&gt; → Хранятся в оперативной памяти (временно, если не сохранены).&lt;/li&gt;
    &lt;li id=&quot;0a33&quot;&gt;&lt;strong&gt;Chains&lt;/strong&gt; → INPUT, OUTPUT, FORWARD&lt;/li&gt;
    &lt;li id=&quot;a573&quot;&gt;&lt;strong&gt;Tables&lt;/strong&gt; → filter, nat, mangle, raw&lt;/li&gt;
    &lt;li id=&quot;e9b3&quot;&gt;&lt;strong&gt;Targets&lt;/strong&gt; → ACCEPT, DROP, REJECT, LOG, DNAT, SNAT&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;2273&quot;&gt;📦 Проверка установки и состояния IPTables&lt;/h2&gt;
  &lt;pre id=&quot;gyEN&quot; data-lang=&quot;bash&quot;&gt;rpm -qa | grep -i iptables
/etc/init.d/iptables status
which iptables&lt;/pre&gt;
  &lt;h2 id=&quot;400c&quot;&gt;🧩 IPTables работает на 3-4 уровнях модели OSI&lt;/h2&gt;
  &lt;ul id=&quot;YebG&quot;&gt;
    &lt;li id=&quot;6d27&quot;&gt;&lt;strong&gt;Сетевой уровень (уровень 3)&lt;/strong&gt; — IP&lt;/li&gt;
    &lt;li id=&quot;2203&quot;&gt;&lt;strong&gt;Транспортный уровень (уровень 4)&lt;/strong&gt; — TCP / UDP / ICMP&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;66e2&quot;&gt;🔗 Таблицы IPTables&lt;/h2&gt;
  &lt;h2 id=&quot;af68&quot;&gt;1️⃣ filter (по умолчанию)&lt;/h2&gt;
  &lt;ul id=&quot;CM13&quot;&gt;
    &lt;li id=&quot;7257&quot;&gt;INPUT → Входящий трафик&lt;/li&gt;
    &lt;li id=&quot;dd6b&quot;&gt;OUTPUT → Исходящий трафик&lt;/li&gt;
    &lt;li id=&quot;e13f&quot;&gt;FORWARD → Маршрутизированный трафик&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;ead0&quot;&gt;2️⃣ nat&lt;/h2&gt;
  &lt;ul id=&quot;0f06&quot;&gt;
    &lt;li id=&quot;c557&quot;&gt;PREROUTING → Переадресация портов (DNAT)&lt;/li&gt;
    &lt;li id=&quot;f65d&quot;&gt;POSTROUTING → SNAT / MASQUERADE&lt;/li&gt;
    &lt;li id=&quot;fed9&quot;&gt;OUTPUT → Локальный NAT&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;65a7&quot;&gt;3️⃣ mangle&lt;/h2&gt;
  &lt;ul id=&quot;Yshm&quot;&gt;
    &lt;li id=&quot;92ce&quot;&gt;Модификация заголовков пакетов&lt;/li&gt;
    &lt;li id=&quot;a826&quot;&gt;Изменения QoS, TTL, TOS&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;de61&quot;&gt;4️⃣ raw&lt;/h2&gt;
  &lt;ul id=&quot;cdYw&quot;&gt;
    &lt;li id=&quot;c011&quot;&gt;Отключение отслеживания соединений (NOTRACK)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;7374&quot;&gt;🔁 Общие действия&lt;/h2&gt;
  &lt;figure id=&quot;3OLv&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*ZF4m3rPiYueBlx3rhen00g.png&quot; width=&quot;700&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;7bfc&quot;&gt;🧪 Базовые команды IPTables&lt;/h2&gt;
  &lt;h2 id=&quot;9920&quot;&gt;Просмотр правил&lt;/h2&gt;
  &lt;pre id=&quot;fs8q&quot; data-lang=&quot;bash&quot;&gt;iptables -L
iptables -L -n -v
iptables -n -L -v --line-numbers&lt;/pre&gt;
  &lt;h2 id=&quot;d88f&quot;&gt;Очистка правил (временно):&lt;/h2&gt;
  &lt;pre id=&quot;aJ1t&quot; data-lang=&quot;bash&quot;&gt;iptables -F
iptables -X&lt;/pre&gt;
  &lt;h2 id=&quot;c87d&quot;&gt;Сохранение правил (постоянно)&lt;/h2&gt;
  &lt;pre id=&quot;7LO4&quot; data-lang=&quot;bash&quot;&gt;service iptables save&lt;/pre&gt;
  &lt;h2 id=&quot;83b6&quot;&gt;🚫 Блокировка всего трафика (аварийная ситуация)&lt;/h2&gt;
  &lt;pre id=&quot;fqXl&quot; data-lang=&quot;bash&quot;&gt;iptables -A INPUT -s 0.0.0.0/0 -j REJECT&lt;/pre&gt;
  &lt;p id=&quot;9d24&quot;&gt;⚠️ Временно (только в оперативной памяти) — сохраните, чтобы изменения сохранились.&lt;/p&gt;
  &lt;h2 id=&quot;1c7e&quot;&gt;🔐 Блокировка конкретного IP&lt;/h2&gt;
  &lt;pre id=&quot;ZUWh&quot; data-lang=&quot;bash&quot;&gt;iptables -A INPUT -s 192.168.1.94 -j DROP&lt;/pre&gt;
  &lt;h2 id=&quot;1f19&quot;&gt;🌐 Блокировка подсети&lt;/h2&gt;
  &lt;pre id=&quot;kal1&quot; data-lang=&quot;bash&quot;&gt;iptables -A INPUT -s 192.168.8.0/24 -j DROP&lt;/pre&gt;
  &lt;h2 id=&quot;c406&quot;&gt;🚪 Блокировка порта&lt;/h2&gt;
  &lt;pre id=&quot;mehl&quot; data-lang=&quot;bash&quot;&gt;iptables -A INPUT -p tcp --dport 80 -j DROP&lt;/pre&gt;
  &lt;h2 id=&quot;ee1c&quot;&gt;🎯 Блокировка порта для конкретного IP-адреса&lt;/h2&gt;
  &lt;pre id=&quot;tdys&quot; data-lang=&quot;bash&quot;&gt;iptables -A INPUT -s 192.168.1.10 -p tcp --dport 80 -j DROP&lt;/pre&gt;
  &lt;h2 id=&quot;1db3&quot;&gt;🔄 Разрешение SSH (безопасное правило)&lt;/h2&gt;
  &lt;pre id=&quot;5oia&quot; data-lang=&quot;bash&quot;&gt;iptables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT&lt;/pre&gt;
  &lt;h2 id=&quot;5ed6&quot;&gt;🛑 Политика по умолчанию Drop (рекомендации для продакшена)&lt;/h2&gt;
  &lt;pre id=&quot;NW7l&quot; data-lang=&quot;bash&quot;&gt;iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT&lt;/pre&gt;
  &lt;h2 id=&quot;e0f9&quot;&gt;📡 Контроль ICMP (Ping)&lt;/h2&gt;
  &lt;h2 id=&quot;f765&quot;&gt;Блокировка Ping&lt;/h2&gt;
  &lt;pre id=&quot;UWys&quot; data-lang=&quot;bash&quot;&gt;iptables -A INPUT -p icmp --icmp-type echo-request -j DROP&lt;/pre&gt;
  &lt;h2 id=&quot;4d4e&quot;&gt;Разрешение Ping из внутренней сети&lt;/h2&gt;
  &lt;pre id=&quot;oqe0&quot; data-lang=&quot;bash&quot;&gt;iptables -A INPUT -s 192.168.1.0/24 -p icmp -j ACCEPT&lt;/pre&gt;
  &lt;h2 id=&quot;55e3&quot;&gt;🧯 Предотвращение подмены IP&lt;/h2&gt;
  &lt;pre id=&quot;JLGT&quot; data-lang=&quot;bash&quot;&gt;iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP&lt;/pre&gt;
  &lt;h2 id=&quot;9643&quot;&gt;📝 Логирование и блокировка пакетов&lt;/h2&gt;
  &lt;pre id=&quot;5WQO&quot; data-lang=&quot;bash&quot;&gt;iptables -A INPUT -s 10.0.0.0/8 -j LOG --log-prefix &amp;quot;IP_SPOOF: &amp;quot;
iptables -A INPUT -s 10.0.0.0/8 -j DROP&lt;/pre&gt;
  &lt;p id=&quot;6cca&quot;&gt;Логи отображаются в:&lt;/p&gt;
  &lt;pre id=&quot;fqQr&quot; data-lang=&quot;bash&quot;&gt;/var/log/messages&lt;/pre&gt;
  &lt;h2 id=&quot;d340&quot;&gt;⏱️ Ограничение скорости (защита от DoS-атак)&lt;/h2&gt;
  &lt;pre id=&quot;u3AT&quot; data-lang=&quot;bash&quot;&gt;iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT&lt;/pre&gt;
  &lt;h2 id=&quot;75a8&quot;&gt;🔁 Диапазон разрешенных портов&lt;/h2&gt;
  &lt;pre id=&quot;W9Yl&quot; data-lang=&quot;bash&quot;&gt;iptables -A INPUT -p tcp --dport 7000:7010 -j ACCEPT&lt;/pre&gt;
  &lt;h2 id=&quot;f699&quot;&gt;🔀 Порт-форвардинг (DNAT)&lt;/h2&gt;
  &lt;pre id=&quot;dwPg&quot; data-lang=&quot;bash&quot;&gt;iptables -t nat -A PREROUTING -p tcp --dport 422 -j DNAT --to 192.168.1.10:22&lt;/pre&gt;
  &lt;h2 id=&quot;feb6&quot;&gt;🧠 Реальные сценарии использования (Admin &amp;amp; DevOps)&lt;/h2&gt;
  &lt;figure id=&quot;lbZ6&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*k3_dVKbsWht9D6DDUpU3uA.png&quot; width=&quot;700&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;19d4&quot;&gt;📌 Рекомендации по использованию IPTables&lt;/h2&gt;
  &lt;p id=&quot;082a&quot;&gt;✔ Всегда разрешайте SSH перед DROP&lt;br /&gt;✔ Сохраняйте правила после тестирования&lt;br /&gt;✔ Используйте stateful правила&lt;br /&gt;✔ Ведите логирование перед DROP&lt;br /&gt;✔ Документируйте правила&lt;br /&gt;✔ Предпочитайте nftables на новых дистрибутивах&lt;/p&gt;
  &lt;h2 id=&quot;628b&quot;&gt;⚠️ Важное примечание (для современных версий Linux)&lt;/h2&gt;
  &lt;ul id=&quot;db3O&quot;&gt;
    &lt;li id=&quot;017d&quot;&gt;IPTables &lt;strong&gt;устарел&lt;/strong&gt; на новых системах&lt;strong&gt;.&lt;/strong&gt;&lt;/li&gt;
    &lt;li id=&quot;5417&quot;&gt;&lt;strong&gt;nftables&lt;/strong&gt; — это будущее&lt;/li&gt;
    &lt;li id=&quot;fc75&quot;&gt;IPTables всё ещё широко используется в RHEL 6/7, в legacy-системах и на интервью&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;d6d9&quot;&gt;IPTables — это &lt;strong&gt;мощный, низкоуровневый фаервол,&lt;/strong&gt; который должен глубоко понимать каждый:&lt;/p&gt;
  &lt;ul id=&quot;2reT&quot;&gt;
    &lt;li id=&quot;3e88&quot;&gt;Администратор Linux&lt;/li&gt;
    &lt;li id=&quot;0a67&quot;&gt;DevOps-инженер&lt;/li&gt;
    &lt;li id=&quot;241d&quot;&gt;Cloud инженер&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;fff2&quot;&gt;Освоение IPTables даст вам:&lt;/p&gt;
  &lt;ul id=&quot;NbC8&quot;&gt;
    &lt;li id=&quot;e166&quot;&gt;Надёжные основы безопасности&lt;/li&gt;
    &lt;li id=&quot;fa43&quot;&gt;Уверенность при инцидентах в продакшене&lt;/li&gt;
    &lt;li id=&quot;72be&quot;&gt;Более глубокое понимание понимание облачных фаерволов&lt;/li&gt;
  &lt;/ul&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;hvCI&quot;&gt;На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где будет еще больше полезной информации.&lt;/p&gt;
  &lt;/section&gt;

</content></entry><entry><id>usr_bin_linux:safe-linux-server</id><link rel="alternate" type="text/html" href="https://teletype.in/@usr_bin_linux/safe-linux-server?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=usr_bin_linux"></link><title>Как создать безопасный сервер Linux</title><published>2026-03-01T20:35:30.303Z</published><updated>2026-03-01T20:35:30.303Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/44/9b/449bf1d6-d3a0-44cb-9a2a-9aabcee2b598.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*EInqfRUV9SEEBWo7QNKHbQ.png&quot;&gt;Это перевод оригинальной статьи How to Build a Secure Linux Server.</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;aFVX&quot;&gt;Это перевод оригинальной статьи &lt;a href=&quot;https://systemweakness.com/how-to-build-a-secure-linux-server-509021596097&quot; target=&quot;_blank&quot;&gt;How to Build a Secure Linux Server&lt;/a&gt;.&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;YLLN&quot;&gt;Подписывайтесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.&lt;/p&gt;
  &lt;/section&gt;
  &lt;h3 id=&quot;9e53&quot;&gt;&lt;/h3&gt;
  &lt;figure id=&quot;7Abn&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*EInqfRUV9SEEBWo7QNKHbQ.png&quot; width=&quot;700&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;6645&quot;&gt;Безопасность не обязательно должна быть сложной.&lt;/h2&gt;
  &lt;p id=&quot;bf4c&quot;&gt;Большинство уязвимостей возникают из-за игнорирования основных принципов. Безопасный Linux-сервер начинается с правильной базовой настройки, и она защитит от подавляющего большинства угроз, с которыми можно столкнуться.&lt;/p&gt;
  &lt;h2 id=&quot;079e&quot;&gt;#1. Начните с минимальной установки.&lt;/h2&gt;
  &lt;p id=&quot;b156&quot;&gt;Каждый неустановленный пакет — это пакет, который не может быть использован для взлома. Удалите всё ненужное и устанавливайте только то, что действительно поддерживает систему.&lt;/p&gt;
  &lt;p id=&quot;4169&quot;&gt;Это небольшое решение на самом начальном этапе окупается с лихвой в дальнейшем. Оптимизированную систему проще обновлять, проще контролировать и сложнее взломать. Сохраняя простоту нашего сервера, мы уже предпринимаем один из самых эффективных шагов по обеспечению безопасности. Мы всегда можем добавить пакеты позже, когда они действительно понадобятся.&lt;/p&gt;
  &lt;blockquote id=&quot;aK5F&quot;&gt;Меньшее количество пакетов = меньше уязвимостей = меньшая поверхность атаки.&lt;/blockquote&gt;
  &lt;h3 id=&quot;61cc&quot;&gt;Проверьте прослушиваемые порты:&lt;/h3&gt;
  &lt;pre id=&quot;Ksgz&quot; data-lang=&quot;bash&quot;&gt;sudo ss -tulpn&lt;/pre&gt;
  &lt;p id=&quot;7926&quot;&gt;Эта команда выводит список всех прослушиваемых портов &lt;strong&gt;&lt;code&gt;TCP&lt;/code&gt; &lt;/strong&gt;и &lt;strong&gt;&lt;code&gt;UDP&lt;/code&gt; &lt;/strong&gt;в системе, а также процессов, которые ими владеют. Она очень полезна для проверки того, какие службы запущены и какие порты они используют.&lt;/p&gt;
  &lt;p id=&quot;bc7a&quot;&gt;Внимательно изучите вывод и убедитесь, что все перечисленные службы ожидаемы. Отключите или удалите все ненужные службы, чтобы уменьшить поверхность атаки.&lt;/p&gt;
  &lt;pre id=&quot;cDfS&quot; data-lang=&quot;bash&quot;&gt;# Check enabled services:
systemctl list-unit-files --type=service | grep enabled

# Disable and stop service
sudo systemctl disable service_name
sudo systemctl stop service_name

# Remove unused packages
apt autoremove --purge&lt;/pre&gt;
  &lt;h2 id=&quot;9279&quot;&gt;#2. Защитите SSH&lt;/h2&gt;
  &lt;p id=&quot;f760&quot;&gt;SSH — это основной способ доступа к нашим серверам, и именно поэтому он является одним из первых инструментов, которые пытаются использовать злоумышленники. Обеспечение безопасности SSH всегда должно быть первостепенной задачей.&lt;/p&gt;
  &lt;h3 id=&quot;ba38&quot;&gt;Отключить вход в систему от имени root и вход по паролю.&lt;/h3&gt;
  &lt;p id=&quot;1d59&quot;&gt;Запретите прямой доступ &lt;code&gt;root&lt;/code&gt; по SSH. Всегда входите в систему как обычный пользователь и используйте &lt;code&gt;sudo&lt;/code&gt; вместо этого.&lt;/p&gt;
  &lt;p id=&quot;09aa&quot;&gt;Отредактируйте файл конфигурации &lt;code&gt;SSH&lt;/code&gt; ( &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt;)&lt;/p&gt;
  &lt;pre id=&quot;mVia&quot; data-lang=&quot;bash&quot;&gt;PermitRootLogin no
PasswordAuthentication no&lt;/pre&gt;
  &lt;p id=&quot;7a78&quot;&gt;Отключите вход в систему с правами root и по паролю через SSH, чтобы снизить риск атак методом перебора (brute-force).&lt;/p&gt;
  &lt;h3 id=&quot;ce69&quot;&gt;Измените стандартный порт SSH&lt;/h3&gt;
  &lt;p id=&quot;8e7f&quot;&gt;Порт SSH по умолчанию — 22. Изменение его на нестандартный порт может сократить количество автоматизированных атак.&lt;/p&gt;
  &lt;h3 id=&quot;e6d1&quot;&gt;Fail2ban&lt;/h3&gt;
  &lt;p id=&quot;ee5b&quot;&gt;Рекомендуется установить fail2ban для автоматической блокировки IP-адресов, демонстрирующих вредоносную активность. Это простой демон, который отслеживает логи и создает правила брандмауэра для блокировки злоумышленников после многократных неудачных попыток входа в систему.&lt;/p&gt;
  &lt;h2 id=&quot;9018&quot;&gt;#3. Включите брандмауэр (даже в облаке)&lt;/h2&gt;
  &lt;p id=&quot;63b0&quot;&gt;Брандмауэр контролирует, каким портам, протоколам и IP-адресам разрешено взаимодействовать с нашим сервером.&lt;/p&gt;
  &lt;p id=&quot;25ce&quot;&gt;Основной принцип прост:&lt;/p&gt;
  &lt;blockquote id=&quot;lMZJ&quot;&gt;Блокируйте все входящие соединения, кроме конкретных сервисов, которые мы используем.&lt;/blockquote&gt;
  &lt;p id=&quot;0865&quot;&gt;Если вы размещаете веб-сервер, разрешите порты 80 и 443. Для SSH разрешите только наш собственный порт SSH и, в идеале, ограничьте доступ определенными IP-адресами, если у вас статическое подключение.&lt;/p&gt;
  &lt;h2 id=&quot;7ef9&quot;&gt;#4. Поддерживайте систему в актуальном состоянии.&lt;/h2&gt;
  &lt;p id=&quot;aa07&quot;&gt;Если мы не устанавливаем обновления, злоумышленники могут легко воспользоваться известными уязвимостями в программном обеспечении. Многие атаки не используют новые или сложные методы, они используют старые ошибки, для которых уже доступны исправления.&lt;/p&gt;
  &lt;h3 id=&quot;eafd&quot;&gt;Включите автоматические обновления безопасности&lt;/h3&gt;
  &lt;p id=&quot;e97d&quot;&gt;Автоматические обновления устанавливают важные исправления безопасности в фоновом режиме, поэтому не нужно помнить об этом.&lt;/p&gt;
  &lt;pre id=&quot;H8Tz&quot; data-lang=&quot;bash&quot;&gt;# On Ubuntu / Debian
sudo apt install unattended-upgrades
sudo dpkg-reconfigure unattended-upgrades

# On Rocky Linux / AlmaLinux / CentOS
sudo dnf install dnf-automatic
sudo systemctl enable --now dnf-automatic.timer&lt;/pre&gt;
  &lt;p id=&quot;5e71&quot;&gt;&lt;strong&gt;Важно:&lt;/strong&gt;&lt;br /&gt;не забывайте о перезагрузке! Некоторые обновления (например, исправления ядра) работают только после перезагрузки.&lt;/p&gt;
  &lt;pre id=&quot;Riez&quot; data-lang=&quot;bash&quot;&gt;# Check if a reboot is needed
# Ubuntu
if [ -f /var/run/reboot-required ]; then echo &amp;quot;Reboot needed&amp;quot;; fi

# RHEL-based systems
sudo needs-restarting -r&lt;/pre&gt;
  &lt;h2 id=&quot;b474&quot;&gt;#5. Используйте принцип наименьших привилегий для пользователей и сервисов&lt;/h2&gt;
  &lt;p id=&quot;206b&quot;&gt;Запускать всё с правами администратора &lt;strong&gt;&lt;code&gt;root&lt;/code&gt; &lt;/strong&gt;опасно. Если что-то пойдёт не так, это приведёт к серьёзным последствиям. Сервисы и пользователи должны иметь только те права доступа, которые им действительно необходимы, и ничего больше. Это ограничивает масштабы ущерба в случае компрометации учётной записи или сервиса.&lt;/p&gt;
  &lt;h3 id=&quot;9c58&quot;&gt;Не запускайте сервисы от имени root&lt;/h3&gt;
  &lt;p id=&quot;2fc2&quot;&gt;Большинство современных сервисов поддерживают запуск от имени собственного пользователя, например:&lt;/p&gt;
  &lt;ul id=&quot;tTZF&quot;&gt;
    &lt;li id=&quot;9774&quot;&gt;&lt;code&gt;nginx&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;d652&quot;&gt;&lt;code&gt;www-data&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;ab9c&quot;&gt;&lt;code&gt;postgres&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;29f6&quot;&gt;&lt;code&gt;docker&lt;/code&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;8ae9&quot;&gt;Всегда проверяйте конфигурации сервисов и убедитесь, что они запускаются под отдельной учетной записью пользователя, а не под учетной записью администратора &lt;code&gt;root&lt;/code&gt;. Таким образом, в случае взлома сервиса злоумышленник не получит автоматически полный контроль над системой.&lt;/p&gt;
  &lt;h3 id=&quot;9d67&quot;&gt;Используйте Sudo только для административных задач&lt;/h3&gt;
  &lt;p id=&quot;019f&quot;&gt;Пользователи должны входить в систему как обычные пользователи и использовать &lt;code&gt;sudo&lt;/code&gt; только при необходимости.&lt;/p&gt;
  &lt;ul id=&quot;3GAt&quot;&gt;
    &lt;li id=&quot;fa68&quot;&gt;Отключите прямой вход от имени root.&lt;/li&gt;
    &lt;li id=&quot;7cbd&quot;&gt;Используйте &lt;code&gt;sudo&lt;/code&gt; для внесения изменений в систему.&lt;/li&gt;
    &lt;li id=&quot;07ab&quot;&gt;Ограничьте административный доступ доверенными пользователями&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3 id=&quot;bfec&quot;&gt;Предоставляйте только необходимые разрешения&lt;/h3&gt;
  &lt;p id=&quot;e777&quot;&gt;Не каждому пользователю необходим полный доступ с правами sudo. Мы можем разрешить только выполнение определённых команд.&lt;/p&gt;
  &lt;pre id=&quot;9gqi&quot; data-lang=&quot;bash&quot;&gt;sudo visudo

# deploy user can restart nginx, but can’t run other admin commands.
deploy ALL=(ALL) NOPASSWD: /bin/systemctl restart nginx&lt;/pre&gt;
  &lt;h2 id=&quot;0706&quot;&gt;#6. Мониторинг логов &lt;/h2&gt;
  &lt;p id=&quot;3aaa&quot;&gt;Логи показывают, что происходит в нашей системе. Мониторинг логов помогает выявлять подозрительную активность.&lt;/p&gt;
  &lt;h3 id=&quot;4acb&quot;&gt;Получайте ежедневные сводки логов.&lt;/h3&gt;
  &lt;p id=&quot;4850&quot;&gt;Установите &lt;code&gt;Logwatch&lt;/code&gt; или настройте &lt;code&gt;rsyslog&lt;/code&gt; для отправки ежедневных логов. Не нужно читать каждую строку лога, но следует регулярно просматривать сводки на предмет необычных закономерностей, таких как неожиданные попытки входа в систему, сбои в сервисах или проблемы с дисковым пространством.&lt;/p&gt;
  &lt;p id=&quot;6bf2&quot;&gt;Примечание:&lt;br /&gt;Для более сложного мониторинга рекомендуется настроить централизованное логирование с помощью таких инструментов, как Elasticsearch и Kibana.&lt;/p&gt;
  &lt;h2 id=&quot;2acd&quot;&gt;#7. Настройте правильное резервное копирование и восстановление&lt;/h2&gt;
  &lt;p id=&quot;8d8a&quot;&gt;Как бы ни была защищена наша система, сбои все равно случаются: проблемы с оборудованием, случайные удаления, неудачные деплои или инциденты безопасности. Резервные копии — это последняя линия защиты.&lt;/p&gt;
  &lt;h3 id=&quot;6778&quot;&gt;Автоматизация резервного копирования&lt;/h3&gt;
  &lt;p id=&quot;7e0c&quot;&gt;Резервное копирование должно выполняться автоматически и регулярно. Можно использовать &lt;code&gt;rsync&lt;/code&gt; с &lt;code&gt;cron&lt;/code&gt;, инструменты резервного копирования, такие как &lt;code&gt;BorgBackup&lt;/code&gt; или &lt;code&gt;Restic&lt;/code&gt;, либо снапшоты облачного провайдера.&lt;/p&gt;
  &lt;h3 id=&quot;8124&quot;&gt;Следуйте правилу 3–2–1&lt;/h3&gt;
  &lt;p id=&quot;679e&quot;&gt;Простая и эффективная стратегия:&lt;/p&gt;
  &lt;ul id=&quot;AUzB&quot;&gt;
    &lt;li id=&quot;6696&quot;&gt;&lt;strong&gt;3&lt;/strong&gt; копии данных&lt;/li&gt;
    &lt;li id=&quot;5464&quot;&gt;&lt;strong&gt;2&lt;/strong&gt; разных типа хранения&lt;/li&gt;
    &lt;li id=&quot;e42c&quot;&gt;&lt;strong&gt;1&lt;/strong&gt; копия вне офиса&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;f22c&quot;&gt;Это защищает от сбоев оборудования, случайного удаления и программ-вымогателей.&lt;/p&gt;
  &lt;h3 id=&quot;c150&quot;&gt;Делайте резервные копии того, что важно.&lt;/h3&gt;
  &lt;p id=&quot;a294&quot;&gt;Сосредоточьтесь на данных, которые сложно восстановить:&lt;/p&gt;
  &lt;ul id=&quot;FywL&quot;&gt;
    &lt;li id=&quot;41d3&quot;&gt;Базы данных&lt;/li&gt;
    &lt;li id=&quot;a92c&quot;&gt;Данные приложения&lt;/li&gt;
    &lt;li id=&quot;347d&quot;&gt;Загрузки пользователей&lt;/li&gt;
    &lt;li id=&quot;f564&quot;&gt;Файлы конфигурации&lt;/li&gt;
    &lt;li id=&quot;353f&quot;&gt;Секреты (хранящиеся безопасно)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;4a99&quot;&gt;Резервное копирование всей операционной системы обычно менее важно, чем резервное копирование критически важных данных и конфигурационных файлов.&lt;/p&gt;
  &lt;h2 id=&quot;1880&quot;&gt;# 8. Мониторинг целостности файлов&lt;/h2&gt;
  &lt;p id=&quot;655d&quot;&gt;Безопасность – это не только блокирование атак, но и умение распознавать подозрительные действия.&lt;/p&gt;
  &lt;p id=&quot;ac05&quot;&gt;Мониторинг целостности файлов (FIM) — это средство обеспечения безопасности, которое отслеживает и проверяет изменения критически важных файлов, конфигураций и системных ресурсов, чтобы гарантировать, что они остаются авторизованными и неизмененными.&lt;/p&gt;
  &lt;p id=&quot;f161&quot;&gt;Установите и настройте такие инструменты, как &lt;code&gt;AIDE&lt;/code&gt;(Advanced Intrusion Detection Environment), для мониторинга целостности файлов. Эти инструменты создают базу данных важных системных файлов и оповещают, когда критически важные файлы изменяются неожиданным образом.&lt;/p&gt;
  &lt;h2 id=&quot;b631&quot;&gt;#9. Усильте защиту сетевых сервисов&lt;/h2&gt;
  &lt;p id=&quot;b141&quot;&gt;Для каждого сервиса, предоставляемого через интернет, необходимо уделить время его безопасной настройке.&lt;/p&gt;
  &lt;ul id=&quot;kEK1&quot;&gt;
    &lt;li id=&quot;88ad&quot;&gt;Веб-серверы должны использовать &lt;code&gt;HTTPS&lt;/code&gt; с современными конфигурациями &lt;code&gt;TLS&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;1f1f&quot;&gt;Базы данных не должны прослушивать публичные интерфейсы, если это не является необходимым.&lt;/li&gt;
    &lt;li id=&quot;71d5&quot;&gt;Фреймворки приложений должны работать с минимальными привилегиями&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;bda0&quot;&gt;Читайте документацию по безопасности для каждого сервиса, который мы разворачиваем.&lt;/p&gt;
  &lt;h2 id=&quot;1381&quot;&gt;Заключительные мысли&lt;/h2&gt;
  &lt;p id=&quot;d185&quot;&gt;Идеальной безопасности не существует, но хорошей безопасности можно достичь. Создание защищенного сервера — это не внедрение всех возможных мер безопасности. Это формирование мышления, ориентированного на безопасность.&lt;/p&gt;
  &lt;p id=&quot;77d2&quot;&gt;Задайте себе следующие вопросы:&lt;/p&gt;
  &lt;blockquote id=&quot;zifP&quot;&gt;Зачем нужен этот сервис? Кому необходим доступ к этому ресурсу? Что произойдет, если этот компонент будет скомпрометирован?&lt;/blockquote&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;Iazu&quot;&gt;На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где будет еще больше полезной информации.&lt;/p&gt;
  &lt;/section&gt;

</content></entry><entry><id>usr_bin_linux:systemd-journallctl</id><link rel="alternate" type="text/html" href="https://teletype.in/@usr_bin_linux/systemd-journallctl?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=usr_bin_linux"></link><title>Шпаргалка по Systemd и Journalctl</title><published>2026-03-01T20:27:48.027Z</published><updated>2026-03-01T20:27:48.027Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/c4/0a/c40a89a3-8978-425e-81b4-befb1b049b7a.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*wb6DAEzy-kYRiunHhdejTg.png&quot;&gt;Это перевод оригинальной статьи Systemd &amp; Journalctl Cheat Sheet.</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;7s5o&quot;&gt;Это перевод оригинальной статьи &lt;a href=&quot;https://medium.com/the-tech-notes/systemd-journalctl-cheat-sheet-527c4f185198&quot; target=&quot;_blank&quot;&gt;Systemd &amp;amp; Journalctl Cheat Sheet&lt;/a&gt;.&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;KDA7&quot;&gt;Подписывайтесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;a92b&quot;&gt;&lt;strong&gt;Практическое, удобное для копирования и вставки руководство по освоению systemd и journalctl для специалистов DevOps, системных администраторов и разработчиков.&lt;/strong&gt;&lt;/p&gt;
  &lt;figure id=&quot;7sSz&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*wb6DAEzy-kYRiunHhdejTg.png&quot; width=&quot;700&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;7610&quot;&gt;&lt;strong&gt;Оглавление&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;f15d&quot;&gt;&lt;strong&gt;Часть 1 — Управление сервисами (повседневная деятельность)&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;yRpc&quot;&gt;
    &lt;li id=&quot;853b&quot;&gt;Управление состоянием сервиса ( &lt;code&gt;start&lt;/code&gt;, &lt;code&gt;stop&lt;/code&gt;, &lt;code&gt;restart&lt;/code&gt;, &lt;code&gt;reload&lt;/code&gt;)&lt;/li&gt;
    &lt;li id=&quot;ee4e&quot;&gt;Загрузка и состояние системы ( &lt;code&gt;enable&lt;/code&gt;, &lt;code&gt;disable&lt;/code&gt;)&lt;/li&gt;
    &lt;li id=&quot;cb3b&quot;&gt;Проверка состояния и устранение неполадок ( &lt;code&gt;status&lt;/code&gt;, &lt;code&gt;is-active&lt;/code&gt;)&lt;/li&gt;
    &lt;li id=&quot;0ef4&quot;&gt;Список служб&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;97f4&quot;&gt;&lt;strong&gt;Часть 2 — Освоение логов с помощью Journalctl&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;zCTR&quot;&gt;
    &lt;li id=&quot;ea28&quot;&gt;Мониторинг в реальном времени (&lt;code&gt;-f&lt;/code&gt;)&lt;/li&gt;
    &lt;li id=&quot;03fc&quot;&gt;Фильтрация по времени и услугам (&lt;code&gt;-u&lt;/code&gt;, &lt;code&gt;--since&lt;/code&gt;)&lt;/li&gt;
    &lt;li id=&quot;eff5&quot;&gt;Журналы ядра и загрузки (&lt;code&gt;-k&lt;/code&gt;, &lt;code&gt;-b&lt;/code&gt;)&lt;/li&gt;
    &lt;li id=&quot;841c&quot;&gt;Ведение журнала (&lt;code&gt;--vacuum&lt;/code&gt;)&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;c583&quot;&gt;&lt;strong&gt;Часть 3 — Расширенные навыки работы с Systemd (для опытных пользователей)&lt;/strong&gt;&lt;/p&gt;
  &lt;ul id=&quot;dREs&quot;&gt;
    &lt;li id=&quot;e772&quot;&gt;Анализ производительности загрузки ( &lt;code&gt;blame&lt;/code&gt;, &lt;code&gt;critical-chain&lt;/code&gt;)&lt;/li&gt;
    &lt;li id=&quot;f4be&quot;&gt;Создание пользовательской службы (шаблона)&lt;/li&gt;
    &lt;li id=&quot;d6ae&quot;&gt;Таймеры Systemd против Cron&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;a0b6&quot;&gt;Часть 1 — Управление услугами (повседневная деятельность)&lt;/h2&gt;
  &lt;p id=&quot;d7b0&quot;&gt;Большинство дистрибутивов Linux (Ubuntu, Debian, CentOS, RHEL) теперь работают на Systemd. Вот основные команды, которые используются в 90% случаев.&lt;/p&gt;
  &lt;h2 id=&quot;b288&quot;&gt;1. Базовое управление сервисом&lt;/h2&gt;
  &lt;p id=&quot;aec7&quot;&gt;Замените &lt;code&gt;postgresql&lt;/code&gt;на название вашей службы (например, &lt;code&gt;nginx&lt;/code&gt;, &lt;code&gt;docker&lt;/code&gt;, &lt;code&gt;ssh&lt;/code&gt;).&lt;/p&gt;
  &lt;pre id=&quot;sOuK&quot; data-lang=&quot;bash&quot;&gt;# Немедленный запуск службы
sudo systemctl start postgresql

# Немедленная остановка службы
sudo systemctl stop postgresql

# Перезапуск службы (остановка + запуск)
sudo systemctl restart postgresql

# Перезагрузка конфигурации без разрыва соединений (если поддерживается службой)
sudo systemctl reload postgresql&lt;/pre&gt;
  &lt;h2 id=&quot;2941&quot;&gt;2. Загрузка и состояние системы&lt;/h2&gt;
  &lt;p id=&quot;e211&quot;&gt;Управление автозапуском.&lt;/p&gt;
  &lt;pre id=&quot;i4rj&quot; data-lang=&quot;bash&quot;&gt;# Включить запуск службы при загрузке системы
sudo systemctl enable postgresql

# Отключить запуск службы при загрузке системы
sudo systemctl disable postgresql

# Проверить, включена ли служба
systemctl is-enabled postgresql&lt;/pre&gt;
  &lt;h2 id=&quot;83a9&quot;&gt;3. Проверка состояния (первый шаг отладки)&lt;/h2&gt;
  &lt;p id=&quot;c99e&quot;&gt;Команда &lt;code&gt;status&lt;/code&gt;выводит идентификатор процесса, объем используемой памяти и последние несколько строк лога.&lt;/p&gt;
  &lt;pre id=&quot;xXSy&quot; data-lang=&quot;bash&quot;&gt;# Проверка статуса
systemctl status postgresql

# Проверка только активности (возвращает &amp;quot;active&amp;quot; или &amp;quot;inactive&amp;quot;)
systemctl is -active postgresql

# Проверка наличия сбоя службы 
systemctl is -failed postgresql&lt;/pre&gt;
  &lt;h2 id=&quot;0a19&quot;&gt;4. Проверка статусов служб&lt;/h2&gt;
  &lt;p id=&quot;c6ef&quot;&gt;Узнайте, какие программы запущены в системе.&lt;/p&gt;
  &lt;pre id=&quot;yWQE&quot; data-lang=&quot;bash&quot;&gt;# Вывод списка всех запущенных служб
systemctl list -units --type =service --state=running

# Вывод списка всех служб (включая неактивные)
systemctl list -units --type =service --all

# Поиск конкретной службы (например, связанной с брандмауэром)
systemctl list -units --type =service | grep fire&lt;/pre&gt;
  &lt;h2 id=&quot;4e1d&quot;&gt;Часть 2 — Освоение логирования с помощью Journalctl&lt;/h2&gt;
  &lt;p id=&quot;4477&quot;&gt;Прекратите использовать &lt;code&gt;tail -f /var/log/syslog&lt;/code&gt;&amp;#x60;.&amp;#x60; &lt;code&gt;journalctl&lt;/code&gt;— это современный, структурированный способ обработки логов.&lt;/p&gt;
  &lt;h2 id=&quot;67ba&quot;&gt;1. Просмотр и отслеживание логов&lt;/h2&gt;
  &lt;pre id=&quot;Zi8E&quot; data-lang=&quot;bash&quot;&gt;# Отслеживание логов в  реальном времени ( как tail -f )
journalctl -f

# Отслеживание логов только для КОНКРЕТНОЙ службы ( стандартная команда)
journalctl -u postgresql -f

# Просмотр логов в обратном порядке ( сначала самые новые )
journalctl -r&lt;/pre&gt;
  &lt;h2 id=&quot;c18f&quot;&gt;2. Фильтрация по времени&lt;/h2&gt;
  &lt;p id=&quot;b709&quot;&gt;Отлично подходит для постмортемов.&lt;/p&gt;
  &lt;pre id=&quot;rN87&quot; data-lang=&quot;bash&quot;&gt;# Отображение логов с момента последней перезагрузки
journalctl -b

# Отображение логов за последний час
journalctl --since &amp;quot; 1  час назад&amp;quot;

# Отображение логов за определенный период времени
journalctl --since &amp;quot;2025-12-20 14:00:00&amp;quot; --until &amp;quot;2025-12-20 15:00:00&amp;quot; &lt;/pre&gt;
  &lt;h2 id=&quot;5208&quot;&gt;3. Логи ядра и ошибок&lt;/h2&gt;
  &lt;pre id=&quot;jWD7&quot; data-lang=&quot;bash&quot;&gt;# Отображать только сообщения ядра (эквивалент dmesg)
journalctl -k

# Отображать только сообщения с критичностями Error, Critical и Alert
journalctl -p err&lt;/pre&gt;
  &lt;h2 id=&quot;cd5d&quot;&gt;4. Ведение логов&lt;/h2&gt;
  &lt;p id=&quot;11ed&quot;&gt;Если ваш диск заполняется, безопасно очистите журналы событий.&lt;/p&gt;
  &lt;pre id=&quot;pXmh&quot; data-lang=&quot;bash&quot;&gt;# Проверка объема дискового пространства, занимаемого логами
journalctl --disk-usage

# Сохранять только последние 1  ГБ логов
journalctl --vacuum-size=1G

# Сохранять только последние 2 дня логов
journalctl --vacuum - time=2d &lt;/pre&gt;
  &lt;h2 id=&quot;51f6&quot;&gt;Часть 3 — Расширенные навыки работы с Systemd (для опытных пользователей)&lt;/h2&gt;
  &lt;p id=&quot;7b6e&quot;&gt;Превратите свои навыки из &amp;quot;оператора&amp;quot; в &amp;quot;инженера&amp;quot;.&lt;/p&gt;
  &lt;h2 id=&quot;af32&quot;&gt;1. Анализ производительности загрузки&lt;/h2&gt;
  &lt;p id=&quot;d94b&quot;&gt;Ваш сервер загружается медленно? Найдите причину.&lt;/p&gt;
  &lt;pre id=&quot;T6P2&quot; data-lang=&quot;bash&quot;&gt;# Список всех служб , отсортированных по времени инициализации
systemd - analyze blame

# Визуализация в виде дерева
systemd - analyze critical - chain&lt;/pre&gt;
  &lt;figure id=&quot;SH3w&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*qPvw_FniPPhA4OXN5btdWg.png&quot; width=&quot;700&quot; /&gt;
    &lt;figcaption&gt;&lt;strong&gt;systemd-analyze plot &amp;gt; boot.sv&lt;/strong&gt;&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;d0bc&quot;&gt;2. Создание пользовательской службы&lt;/h2&gt;
  &lt;p id=&quot;1e22&quot;&gt;Хотите запустить скрипт на Python или исполняемый файл Go в качестве службы? Создайте файл по адресу &lt;code&gt;/etc/systemd/system/myapp.service&lt;/code&gt;:&lt;/p&gt;
  &lt;pre id=&quot;o8Kj&quot; data-lang=&quot;bash&quot;&gt;[Unit]
Description=My Custom Application After =network.target

[Service]
# Пользователь, запускающий скрипт
User=ubuntu
# Рабочий каталог
WorkingDirectory=/home/ubuntu/app
# Команда запуска
ExecStart=/usr/bin/python3 /home/ubuntu/app/main.py
# Автоматический перезапуск при сбое
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target&lt;/pre&gt;
  &lt;p id=&quot;b06d&quot;&gt;&lt;em&gt;После создания файла запустите команду, &lt;code&gt;sudo systemctl daemon-reload&lt;/code&gt;а затем &lt;code&gt;sudo systemctl start myapp&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;
  &lt;h2 id=&quot;5422&quot;&gt;3. Таймеры Systemd (современный Cron)&lt;/h2&gt;
  &lt;p id=&quot;1bd0&quot;&gt;Таймеры Systemd часто предпочтительнее cron, поскольку они могут зависеть от других служб и обеспечивают более качественное логирование.&lt;/p&gt;
  &lt;pre id=&quot;78EJ&quot; data-lang=&quot;bash&quot;&gt;# Вывести список всех активных таймеров
systemctl list-timers&lt;/pre&gt;
  &lt;h2 id=&quot;67e3&quot;&gt;Золотое правило (совет для начинающих)&lt;/h2&gt;
  &lt;blockquote id=&quot;mrbf&quot;&gt;&lt;em&gt;&lt;strong&gt;Прекратите щуриться, разглядывая усеченные лог. &lt;/strong&gt;Если &lt;code&gt;systemctl status&lt;/code&gt;отображает сообщение об ошибке, но важные строки с ошибками обрезаются (потому что они слишком длинные), &lt;strong&gt;не стоит гадать&lt;/strong&gt; .Запустите &lt;code&gt;journalctl -u [service_name] -e .&lt;/code&gt;Фильтры &lt;code&gt;-u &lt;/code&gt;отображает только нужную службу и сразу переходят к &lt;strong&gt;концу&lt;/strong&gt; (самым последним записям). Это самый быстрый способ выяснить причину, не пролистывая тысячи строк.&lt;/em&gt;&lt;/blockquote&gt;
  &lt;h2 id=&quot;0c6a&quot;&gt;&lt;/h2&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;UA5n&quot;&gt;На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где будет еще больше полезной информации.&lt;/p&gt;
  &lt;/section&gt;

</content></entry><entry><id>usr_bin_linux:9-linux-tricks</id><link rel="alternate" type="text/html" href="https://teletype.in/@usr_bin_linux/9-linux-tricks?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=usr_bin_linux"></link><title>9 хитростей Linux</title><published>2026-02-17T07:45:37.793Z</published><updated>2026-02-17T07:45:37.793Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/70/07/70070515-2b5d-45d5-9c4f-26ec63631e14.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*Wg-2XsO4oDtnLRiABrKqbw.png&quot;&gt;Это перевод оригинальной статьи 9 Linux Tricks.</summary><content type="html">
  &lt;section style=&quot;background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;WW7Z&quot;&gt;Это перевод оригинальной статьи &lt;a href=&quot;https://ozwizard.medium.com/9-linux-tricks-ab64b595cb75&quot; target=&quot;_blank&quot;&gt;9 Linux Tricks&lt;/a&gt;.&lt;/p&gt;
  &lt;/section&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;IGAo&quot;&gt;Подписывайтесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;b2ef&quot;&gt;Любой может работать с файловой системой. Но настоящий системный инженер знает, как управлять памятью процессов, восстанавливать потерянные сессии и создавать дисковое пространство из ничего, когда сервер уходит в 100% загрузки в 3 часа ночи.&lt;/p&gt;
  &lt;p id=&quot;74b9&quot;&gt;Это не просто команды; это инструменты выживания. Вот &lt;strong&gt;9 продвинутых трюков Linux&lt;/strong&gt;, которые помогут вам превратиться из пользователя в мастера :)&lt;/p&gt;
  &lt;figure id=&quot;sdCu&quot; class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://miro.medium.com/v2/resize:fit:875/1*Wg-2XsO4oDtnLRiABrKqbw.png&quot; width=&quot;700&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;ccfa&quot;&gt;Оглавление&lt;/h2&gt;
  &lt;ol id=&quot;SBrF&quot;&gt;
    &lt;li id=&quot;5420&quot;&gt;&lt;strong&gt;Охота за привидениями:&lt;/strong&gt; поиск удаленных файлов, занимающих место на диске (&lt;code&gt;lsof&lt;/code&gt;)&lt;/li&gt;
    &lt;li id=&quot;4ae9&quot;&gt;&lt;strong&gt;Путешествие во времени:&lt;/strong&gt; перемещение запущенного процесса в screen (&lt;code&gt;reptyr&lt;/code&gt;)&lt;/li&gt;
    &lt;li id=&quot;8c5a&quot;&gt;&lt;strong&gt;Рентген:&lt;/strong&gt; отладка процессов без логов (&lt;code&gt;strace&lt;/code&gt;)&lt;/li&gt;
    &lt;li id=&quot;0945&quot;&gt;&lt;strong&gt;Шпионаж за конфигурацией:&lt;/strong&gt; чтение окружения запущенного процесса (&lt;code&gt;/proc&lt;/code&gt;)&lt;/li&gt;
    &lt;li id=&quot;50b0&quot;&gt;&lt;strong&gt;Кнопка паники:&lt;/strong&gt; мгновенное освобождение дискового пространства для пользователя Root (&lt;code&gt;tune2fs&lt;/code&gt;)&lt;/li&gt;
    &lt;li id=&quot;eac8&quot;&gt;&lt;strong&gt;Турбо-режим SSH:&lt;/strong&gt; Мультиплексирование соединений (&lt;code&gt;ControlMaster&lt;/code&gt;)&lt;/li&gt;
    &lt;li id=&quot;63ab&quot;&gt;&lt;strong&gt;Быстрое исправление:&lt;/strong&gt; мгновенное исправление опечаток (&lt;code&gt;^old^new&lt;/code&gt;)&lt;/li&gt;
    &lt;li id=&quot;9922&quot;&gt;&lt;strong&gt;Современный сетевой анализ:&lt;/strong&gt; &lt;code&gt;netstat&lt;/code&gt; мертв, да здравствует &lt;code&gt;ss&lt;/code&gt; !&lt;/li&gt;
    &lt;li id=&quot;e6f6&quot;&gt;&lt;strong&gt;Мышечная память:&lt;/strong&gt; &lt;code&gt;sudo!!&lt;/code&gt; и &lt;code&gt;!$&lt;/code&gt;&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h2 id=&quot;bb11&quot;&gt;1. Охота на привидений: &lt;code&gt;lsof +L1&lt;/code&gt;&lt;/h2&gt;
  &lt;p id=&quot;8f55&quot;&gt;&lt;strong&gt;Ситуация:&lt;/strong&gt; &lt;code&gt;df -h&lt;/code&gt; показывает 100% загрузку диска, но вы только что удалили гигабайты файлов логов. &lt;strong&gt;Причина:&lt;/strong&gt; если какой-либо процесс (например, Apache или Postgres) продолжает запись в удаленный файл, операционная система не освобождает место (inode). Файл становится «зомби-файлом».&lt;/p&gt;
  &lt;p id=&quot;eb81&quot;&gt;&lt;strong&gt;Решение:&lt;/strong&gt;&lt;/p&gt;
  &lt;pre id=&quot;cAqk&quot; data-lang=&quot;bash&quot;&gt;lsof +L1
# Look for files marked as (deleted) but still held by a PID.
# You must reload/restart that specific PID to free the space.&lt;/pre&gt;
  &lt;h2 id=&quot;2c48&quot;&gt;2. Путешествие во времени: &lt;code&gt;reptyr&lt;/code&gt;&lt;/h2&gt;
  &lt;p id=&quot;5c7c&quot;&gt;&lt;strong&gt;Ситуация:&lt;/strong&gt; Вы запустили долгий скрипт, он работает уже 4 часа, но вы забыли запустить &lt;code&gt;screen&lt;/code&gt; или &lt;code&gt;tmux&lt;/code&gt;. Вам нужно отключиться, но закрытие терминала прервет выполнение скрипта.&lt;/p&gt;
  &lt;p id=&quot;14e6&quot;&gt;&lt;strong&gt;Решение:&lt;/strong&gt; Используйте &lt;code&gt;reptyr&lt;/code&gt;, чтобы «перехватить» процесс и перенести его на новый экран.&lt;/p&gt;
  &lt;pre id=&quot;kMtX&quot; data-lang=&quot;bash&quot;&gt;# 1. Background the process: Ctrl+Z, then type &amp;#x27;bg&amp;#x27;
# 2. Disown it from current shell: &amp;#x27;disown &amp;lt;PID&amp;gt;&amp;#x27;
# 3. Open a new screen/tmux and pull it in:
reptyr &amp;lt;PID&amp;gt;&lt;/pre&gt;
  &lt;h2 id=&quot;7027&quot;&gt;3. Рентген: &lt;code&gt;strace&lt;/code&gt;&lt;/h2&gt;
  &lt;p id=&quot;d5ed&quot;&gt;&lt;strong&gt;Ситуация:&lt;/strong&gt; Процесс завис. Нет логов. Нет загрузки ЦП. Ожидает ли он подключения к сети? Или ему отказано в доступе? &lt;strong&gt;Решение:&lt;/strong&gt; Не гадайте. Наблюдайте за системными вызовами в реальном времени.&lt;/p&gt;
  &lt;pre id=&quot;lz1w&quot; data-lang=&quot;bash&quot;&gt;strace -p &amp;lt;PID&amp;gt;
# You will see exactly what the kernel is doing: 
# open(), connect(), read()... 
# This is the ultimate debugging weapon.&lt;/pre&gt;
  &lt;h2 id=&quot;07ce&quot;&gt;4. Шпионаж за конфигурацией: файловая система &lt;code&gt;/proc&lt;/code&gt;&lt;/h2&gt;
  &lt;p id=&quot;0686&quot;&gt;&lt;strong&gt;Ситуация:&lt;/strong&gt; Разработчик утверждает: «У меня всё работает», но производственный сервис не запускается. Вы подозреваете, что он получил неверный пароль к базе данных или ключ API из окружения. &lt;br /&gt;&lt;strong&gt;Решение:&lt;/strong&gt; Считывать данные из памяти запущенного процесса напрямую.&lt;/p&gt;
  &lt;pre id=&quot;l9CN&quot; data-lang=&quot;bash&quot;&gt;cat /proc/&amp;lt;PID&amp;gt;/environ | tr &amp;#x27;\0&amp;#x27; &amp;#x27;\n&amp;#x27;
# This dumps every environment variable the process was started with.
# No more guessing.&lt;/pre&gt;
  &lt;h2 id=&quot;4bd0&quot;&gt;5. Кнопка паники: &lt;code&gt;tune2fs&lt;/code&gt;&lt;/h2&gt;
  &lt;p id=&quot;b780&quot;&gt;&lt;strong&gt;Ситуация:&lt;/strong&gt; Работа системы приостановлена. Диск заполнен на 100%. Вы даже не можете автодополнить команды, потому что нет места для временных файлов. &lt;strong&gt;Решение:&lt;/strong&gt; Linux по умолчанию резервирует 5% блоков для &lt;code&gt;root&lt;/code&gt; пользователя. В экстренной ситуации вы можете установить это значение на 0%, чтобы мгновенно получить гигабайты свободного места.&lt;/p&gt;
  &lt;pre id=&quot;SQLg&quot; data-lang=&quot;bash&quot;&gt;tune2fs -m 0 /dev/sdX
# Warning: Set it back to 5% once you clean up!&lt;/pre&gt;
  &lt;h2 id=&quot;e38d&quot;&gt;6. Турбо-режим SSH: &lt;code&gt;ControlMaster&lt;/code&gt;&lt;/h2&gt;
  &lt;p id=&quot;e8d7&quot;&gt;&lt;strong&gt;Ситуация:&lt;/strong&gt; Запуск Ansible или открытие нескольких вкладок с одним и тем же сервером происходит медленно из-за процесса установления SSH-соединения. &lt;strong&gt;Решение:&lt;/strong&gt; Включить мультиплексирование соединений. Первое соединение проходит аутентификацию; последующие соединения мгновенно проходят через существующий туннель.&lt;/p&gt;
  &lt;pre id=&quot;eW68&quot; data-lang=&quot;bash&quot;&gt;# In your ~/.ssh/config:
Host *
    ControlMaster auto
    ControlPath ~/.ssh/sockets/%r@%h-%p
    ControlPersist 600&lt;/pre&gt;
  &lt;h2 id=&quot;57a2&quot;&gt;7. Быстрое решение: &lt;code&gt;^old^new&lt;/code&gt;&lt;/h2&gt;
  &lt;p id=&quot;bf6d&quot;&gt;&lt;strong&gt;Ситуация:&lt;/strong&gt; Вы ввели длинную команду с опечаткой. &lt;code&gt;systemctl restart nginxx&lt;/code&gt; &lt;strong&gt;Решение:&lt;/strong&gt; Не нажимайте стрелку вверх и не прокручивайте назад.&lt;/p&gt;
  &lt;pre id=&quot;cpHa&quot; data-lang=&quot;bash&quot;&gt;^nginxx^nginx
# Bash automatically runs: systemctl restart nginx&lt;/pre&gt;
  &lt;h2 id=&quot;0e19&quot;&gt;8. Современный сетевой анализ: &lt;code&gt;ss&lt;/code&gt;&lt;/h2&gt;
  &lt;p id=&quot;dd7b&quot;&gt;&lt;strong&gt;Ситуация:&lt;/strong&gt; Вы всё ещё используете &lt;code&gt;netstat&lt;/code&gt;. &lt;br /&gt;&lt;strong&gt;Решение:&lt;/strong&gt; &lt;code&gt;netstat&lt;/code&gt; устарел, работает медленно и обрезает вывод. &lt;code&gt;ss&lt;/code&gt;(Статистика сокетов) взаимодействует напрямую с ядром и работает невероятно быстро.&lt;/p&gt;
  &lt;pre id=&quot;H1vE&quot; data-lang=&quot;bash&quot;&gt;ss -tulpn
# -t: TCP, -u: UDP, -l: Listening, -p: Process, -n: Numeric
# See everything listening on your server in milliseconds.&lt;/pre&gt;
  &lt;h2 id=&quot;a557&quot;&gt;9. Мышечная память: &lt;code&gt;sudo !!&lt;/code&gt; и &lt;code&gt;!$&lt;/code&gt;&lt;/h2&gt;
  &lt;ul id=&quot;O3e9&quot;&gt;
    &lt;li id=&quot;5d66&quot;&gt;&lt;strong&gt;&lt;code&gt;sudo !!&lt;/code&gt;: &lt;/strong&gt;Вы ввели команду, но забыли &lt;code&gt;sudo&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;8ee9&quot;&gt;&lt;em&gt;Действие:&lt;/em&gt; Введите &lt;code&gt;sudo !!&lt;/code&gt;(выполняет последнюю команду от имени root).&lt;/li&gt;
    &lt;li id=&quot;0063&quot;&gt;&lt;strong&gt;&lt;code&gt;!$&lt;/code&gt;: &lt;/strong&gt;Вы создали директорию и теперь хотите в неё перейти.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;BuRa&quot; data-lang=&quot;bash&quot;&gt;mkdir -p /var/www/html/project/v2 cd !$  
# &amp;#x27;!$&amp;#x27; expands to the last argument of the previous command&lt;/pre&gt;
  &lt;h2 id=&quot;ab3a&quot;&gt;Заключение&lt;/h2&gt;
  &lt;p id=&quot;2c1b&quot;&gt;Эти приёмы предназначены не просто для демонстрации мастерства; они придут на помощь, когда стандартные инструменты окажутся неэффективными. Освоив их, вы превратите терминал в продолжение своего разума, а не просто в чёрный экран.&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(34,  84%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;Mfch&quot;&gt;На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал &lt;a href=&quot;https://t.me/usr_bin_linux&quot; target=&quot;_blank&quot;&gt;usr_bin&lt;/a&gt;, где будет еще больше полезной информации.&lt;/p&gt;
  &lt;/section&gt;

</content></entry></feed>