<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Anthony</title><generator>teletype.in</generator><description><![CDATA[📝 Заметки по программированию и настройке сервисов для ИТ-инфраструктуры]]></description><image><url>https://img3.teletype.in/files/e7/3a/e73a2fbd-d7b4-496e-a696-aa78ab08b5bc.jpeg</url><title>Anthony</title><link>https://306.antroot.ru/</link></image><link>https://306.antroot.ru/?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=antroot</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/antroot?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/antroot?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Sat, 25 Apr 2026 13:45:26 GMT</pubDate><lastBuildDate>Sat, 25 Apr 2026 13:45:26 GMT</lastBuildDate><item><guid isPermaLink="true">https://306.antroot.ru/gitlab</guid><link>https://306.antroot.ru/gitlab?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=antroot</link><comments>https://306.antroot.ru/gitlab?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=antroot#comments</comments><dc:creator>antroot</dc:creator><title>Установка GitLab CE на Linux</title><pubDate>Wed, 25 Feb 2026 08:41:28 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/48/f5/48f58aac-920d-4270-9dae-35bb378bccc1.png"></media:content><category>Sysadmin</category><tt:hashtag>gitlab</tt:hashtag><tt:hashtag>git</tt:hashtag><tt:hashtag>linux</tt:hashtag><tt:hashtag>sysadmin</tt:hashtag><description><![CDATA[<img src="https://img2.teletype.in/files/9b/98/9b98fae3-6d66-4273-8ae8-3237a101be32.jpeg"></img>Подробная инструкция по установке GitLab на Linux, обновлению и миграции]]></description><content:encoded><![CDATA[
  <figure id="8sTL" class="m_original">
    <img src="https://img2.teletype.in/files/9b/98/9b98fae3-6d66-4273-8ae8-3237a101be32.jpeg" width="700" />
  </figure>
  <p id="o0MH"><strong>Git</strong> - это система контроля версий, используется для ведения проектов в том числе распределенными группами разработчиков.</p>
  <p id="xlFD"><a href="https://306.antroot.ru/git" target="_blank">Справка по Git</a> | <a href="https://306.antroot.ru/git-set" target="_blank">Настройка клиента Git</a></p>
  <p id="HrvX"><strong>GitLab</strong> - это проект, который используя систему управления репозиториями <strong>git</strong> полностью обеспечивает жизненный цикл <strong>DevOps</strong>, включая wiki, CI/CD и многое другое.</p>
  <p id="WGS0"><strong>GitLab</strong> поставляется в нескольких вариантах:</p>
  <ul id="0mNZ">
    <li id="thQw">Docker - запускается в виде контейнера;</li>
    <li id="BflV">Source code - компилируется под конкретную ОС;</li>
    <li id="DQsr">Omnibus - &quot;все в одном&quot;.</li>
  </ul>
  <p id="8ozB">Мы рассмотрим вариант <strong>Omnibus</strong> - он подразумевает установку всех необходимых для функционирования <strong>GitLab</strong> утилит вместе с GitLab: PostgreSQL, Redis, Nginx, Prometheus, Grafana, Registry, и т.д.</p>
  <h2 id="подготовка-системы">Подготовка системы</h2>
  <p id="afGu">Установить имя хоста, записать значение в <code>/etc/hosts</code></p>
  <pre id="mVyj" data-lang="bash">hostnamectl set-hostname gitlab
sed -i s/127.0.1.1/\#127.0.1.1/g /etc/hosts
echo &quot;10.0.3.101 gitlab&quot; &gt;&gt; /etc/hosts</pre>
  <p id="BfxO">Укажите в <a href="https://306.antroot.ru/dns-bind" target="_blank">DNS</a> IP-адрес Gitlab сервера и настройте <a href="https://306.antroot.ru/nginx" target="_blank">обратный прокси</a> в случае необходимости.<br />Установить дополнительные пакеты</p>
  <pre id="ohFz" data-lang="bash">apt install -y curl ca-certificates openssl perl</pre>
  <p id="2BeP">Установить локаль, потребуется для PostgreSQL</p>
  <pre id="5iZs" data-lang="bash">sh -c &quot;echo &#x27;LANG=en_US.UTF-8\nLC_ALL=en_US.UTF-8&#x27; &gt; /etc/default/locale&quot;</pre>
  <p id="es4Z">Установить агент передачи почты (MTA), например Postfix</p>
  <pre id="2qUC" data-lang="bash">apt install -y postfix</pre>
  <p id="CMJs">Для выбора пунктов в установщике используйте клавишу <strong>Tab</strong> и клавишу <strong>Enter</strong> для подтверждения.</p>
  <ul id="kXm0">
    <li id="6BAm">Выберите <code>Internet site</code></li>
    <li id="tm0D">Задайте в <code>Mail name</code> полное доменное имя (FQDN), например <em>gitlab.antroot.ru</em></li>
    <li id="JG2B">Остальные настройки можно пропустить, нажав <em>Enter</em><br />Запустить и включить <code>postfix</code></li>
  </ul>
  <pre id="pyCq" data-lang="bash">systemctl start postfix
systemctl enable postfix</pre>
  <h2 id="установка-gitlab">Установка Gitlab</h2>
  <p id="kryC">На официальном сайте <a href="https://web.archive.org/web/20230601022024mp_/http://gitlab.com/" target="_blank">gitlab.com</a> можно уточнить инструкции для установки на определенные дистрибутивы операционных систем. В варианте Debian для добавления репозитория используется скрипт (задать переменные <code>os</code> и <code>dist</code>, если скрипт не смог определить):</p>
  <pre id="ocbu" data-lang="bash">curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | os=debian dist=buster bash</pre>
  <p id="Trp6">Установка</p>
  <pre id="1kzV" data-lang="bash">EXTERNAL_URL=&quot;https://gitlab.antroot.ru&quot; \
GITLAB_ROOT_PASSWORD=&quot;MyStrongPassword&quot; \
apt install gitlab-ce gitlab-cli</pre>
  <p id="IaX5">Если перед установкой не была задана переменная с паролем администратора, после установки пароль администратора в течение 24 часов хранится в файле</p>
  <pre id="tN50" data-lang="bash">/etc/gitlab/initial_root_password</pre>
  <p id="GLKE">Основные файлы <strong>GitLab</strong> расположены:</p>
  <ul id="zs8W">
    <li id="JGut"><code>/etc/gitlab/</code> - конфигурация <strong>gitlab</strong></li>
    <li id="lCb7"><code>/var/log/gitlab/</code> - журналы <strong>gitlab</strong></li>
    <li id="bstw"><code>/opt/gitlab/</code> - бинарные файлы <strong>gitlab</strong></li>
    <li id="vBD7"><code>/var/opt/gitlab/</code> - рабочие директории nginx, postgresql, redis, registry, prometheus, grafana</li>
  </ul>
  <p id="8VDy">Основные параметры <strong>GitLab</strong><br />В файле <code>/etc/gitlab/gitlab.rb</code></p>
  <pre id="JrX7" data-lang="bash">external_url &#x27;https://gitlab.antroot.ru&#x27;
gitlab_rails[&#x27;time_zone&#x27;] = &#x27;UTC&#x27;

gitlab_rails[&#x27;gitlab_email_enabled&#x27;] = true
gitlab_rails[&#x27;gitlab_email_from&#x27;] = &#x27;gitlab@antroot.ru&#x27;
gitlab_rails[&#x27;gitlab_email_display_name&#x27;] = &#x27;GitLab&#x27;
gitlab_rails[&#x27;gitlab_email_reply_to&#x27;] = &#x27;noreply@antroot.ru&#x27;
gitlab_rails[&#x27;gitlab_email_subject_suffix&#x27;] = &#x27;gitlab.antroot.ru&#x27;

gitlab_rails[&#x27;gitlab_default_theme&#x27;] = 2</pre>
  <p id="yvWR">Расположение репозиториев по умолчанию <code>/var/opt/gitlab/git-data</code>:</p>
  <pre id="giiV" data-lang="bash">git_data_dirs({
  &quot;default&quot; =&gt; {
    &quot;path&quot; =&gt; &quot;/mnt/git-data&quot;
   }
})
# или
git_data_dirs({
  &quot;default&quot; =&gt; { &quot;path&quot; =&gt; &quot;/var/opt/gitlab/git-data&quot; },
  &quot;alternative&quot; =&gt; { &quot;path&quot; =&gt; &quot;/mnt/git-data&quot; }
})</pre>
  <p id="qqco">Для синхронизации выполните:</p>
  <pre id="O0ie" data-lang="bash">gitlab-ctl stop
rsync -av --delete /var/opt/gitlab/git-data/repositories /mnt/git-data/
gitlab-ctl reconfigure
gitlab-ctl start</pre>
  <p id="ux3r">Registry располагается по умолчанию в <code>/var/opt/gitlab/gitlab-rails/shared/registry</code>:</p>
  <pre id="AQ1l" data-lang="bash">registry_external_url &#x27;https://registry.antroot.ru&#x27;
gitlab_rails[&#x27;registry_enabled&#x27;] = true
gitlab_rails[&#x27;registry_host&#x27;] = &quot;registry.antroot.ru&quot;
gitlab_rails[&#x27;registry_port&#x27;] = &quot;5005&quot;
gitlab_rails[&#x27;registry_path&#x27;] = &quot;/mnt/shared/registry&quot;

registry_nginx[&#x27;enable&#x27;] = true
registry_nginx[&#x27;listen_port&#x27;] = 5005</pre>
  <p id="t6yG">Другие хранилища из <code>/var/opt/gitlab/gitlab-rails/shared/</code> также можно переместить на подключенные диски:</p>
  <pre id="6fqU" data-lang="bash">gitlab_rails[&#x27;lfs_enabled&#x27;] = true
gitlab_rails[&#x27;lfs_storage_path&#x27;] = &quot;/mnt/shared/lfs-objects&quot;

gitlab_rails[&#x27;uploads_directory&#x27;] = &quot;/mnt/uploads&quot;

gitlab_rails[&#x27;terraform_state_enabled&#x27;] = true
gitlab_rails[&#x27;terraform_state_storage_path&#x27;] = &quot;/mnt/shared/terraform_state&quot;

gitlab_rails[&#x27;pages_local_store_enabled&#x27;] = true
gitlab_rails[&#x27;pages_local_store_path&#x27;] = &quot;/mnt/shared/pages&quot;

gitlab_rails[&#x27;manage_backup_path&#x27;] = true
gitlab_rails[&#x27;backup_path&#x27;] = &quot;/mnt/backups&quot;
# default skip
#gitlab_rails[&#x27;env&#x27;] = {
#    &quot;SKIP&quot; =&gt; &quot;db,uploads,repositories,builds,artifacts,lfs,registry,pages&quot;
#}
gitlab_rails[&#x27;env&#x27;] = {
    &quot;SKIP&quot; =&gt; &quot;uploads,builds,artifacts,lfs,registry&quot;
}</pre>
  <p id="1Cb9">После применения настроек из файла <code>/etc/gitlab/gitlab.rb</code> необходимо выполнить реконфигурацию <strong>gitlab</strong></p>
  <pre id="oHkn" data-lang="bash">gitlab-ctl reconfigure</pre>
  <p id="T62O">Конфигурация <a href="https://306.antroot.ru/nginx" target="_blank">обратного прокси</a> (reverse proxy) для <strong>gitlab</strong> на примере <strong>nginx</strong></p>
  <pre id="cjUQ" data-lang="nginx"># переадресация на HTTPS
server {
    listen 80;
    server_name gitlab.antroot.ru;
    return 301 https://$http_host$request_uri;
}

# блок обработки основного сайта с выдачей контента через proxy_pass с сервера в DMZ
server {
    server_name gitlab.antroot.ru;
    listen 443 http2 ssl;

    location / {
        resolver 10.0.2.2;
        proxy_pass https://gitlab.antroot.lan;
        proxy_set_header Host $host;
    }
    access_log /var/log/nginx/gitlab.antroot.ru.access.log;
    error_log  /var/log/nginx/gitlab.antroot.ru.error.log;

    #ssl_certificate /etc/letsencrypt/live/gitlab.antroot.ru/fullchain.pem;
    #ssl_certificate_key /etc/letsencrypt/live/gitlab.antroot.ru/privkey.pem;
}

# блок для реестра registry также с выдачей контента через proxy_pass из DMZ
server {
    server_name registry.antroot.ru;
    listen 5005 ssl;
    listen 443 http2 ssl;

    location / {
        resolver 10.0.2.2;
        proxy_pass https://gitlab.antroot.lan:5005;
        proxy_set_header Host $host;
        proxy_cache off;
        proxy_buffering off;
        proxy_request_buffering off;
    }
    access_log /var/log/nginx/registry.antroot.ru.access.log;
    error_log  /var/log/nginx/registry.antroot.ru.error.log;

    #ssl_certificate /etc/letsencrypt/live/registry.mijor.ru/fullchain.pem;
    #ssl_certificate_key /etc/letsencrypt/live/registry.mijor.ru/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}</pre>
  <p id="16aC">Здесь закрыты комментарием ссылки на файлы сертификатов, которые можно установить с помощью <strong>certbot</strong>, подробнее смотрите в <a href="https://306.antroot.ru/nginx" target="_blank">статье</a></p>
  <h2 id="проверка">Проверка</h2>
  <p id="EJTG">После установки и настройки можно зайти браузером на адрес <em>http://gitlab.antroot.ru</em> (используйте указанный при настройке gitlab) - первая авторизация по указанному выше в статье паролю или из файла в <code>/etc/gitlab/initial_root_password</code>.<br />Авторизуйтесь, смените пароль (правое верхнее меню, profile, password), создайте группу (левое верхнее меню, groups, create group) и проект (левое верхнее меню, projects, create project).<br />В настройках проекта в левом меню <strong>Packages &amp; Registries</strong> / <strong>Container Registry</strong> есть настройки доступа к репозиторию образов Container Registry. Например, при указании адреса реестра <em>registry.antroot.ru</em>, в группе <em>group1</em> и проекте <em>project1</em>:</p>
  <pre id="Htkn" data-lang="bash">docker login registry.antroot.ru
docker build -t registry.antroot.ru:/group1/project1 .
docker push registry.antroot.ru/group1/project1</pre>
  <p id="LD5J">Создадим тестовый образ и проверим работу реестра registry:</p>
  <pre id="zbnC" data-lang="bash">docker login registry.antroot.ru
# Введите Username / Password

# сборка образа из Dockerfile
docker image build -t registry.antroot.ru:5005/group1/project1:latest -&lt;&lt;EOF
FROM busybox
RUN echo &quot;Hello from Busybox&quot;
EOF

# копирование образа в registry
docker push registry.antroot.ru/group1/project1:latest

# запуск контейнера из образа
docker run registry.antroot.ru/group1/project1:latest</pre>
  <hr />
  <h2 id="установка-gitlab-runner">Установка GitLab Runner</h2>
  <p id="z7eJ">Для установки сборщика нужно воспользоваться официальным репозиторием <strong>GitLab</strong>, например для Debian 10 (Buster):</p>
  <pre id="4K24" data-lang="bash"># установка Docker
apt install -y ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
  &quot;deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable&quot; | tee /etc/apt/sources.list.d/docker.list &gt; /dev/null
apt update
apt install -y docker-ce docker-ce-cli containerd.io

# установка GitLab-Runner
curl -L &quot;https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh&quot; | bash -
apt update
apt install -y gitlab-runner</pre>
  <p id="HlM8">После установки открыть в <strong>GitLab</strong> раздел Admin Area / Runners - скопировать URL и Token, а затем на устанавливаемом раннере запустить регистрацию:</p>
  <pre id="M10z" data-lang="bash">gitlab-runner register</pre>
  <p id="pqEZ">и ответить на вопросы:</p>
  <ul id="icM4">
    <li id="CHZn">Gitlab URL: <em>https://gitlab.antroot.ru ;</em></li>
    <li id="NpKs">Registration token: из раздела Admin / Runners;</li>
    <li id="tMLJ">Description: описание, отображаемое в GitLab (gitlab-runner-1);</li>
    <li id="Sdmi">Tags: теги, по которым можно назначать задания в CI (docker, intel, x86);</li>
    <li id="yrHs">Executor: способ запуска, например docker;</li>
    <li id="FxuS">Default image: образ по умолчанию: alpine:3.12.8</li>
  </ul>
  <p id="GACB">Конфигурация <code>/etc/gitlab-runner/config.toml</code>. Здесь в конфиг по умолчанию добавлены параметры:</p>
  <ul id="ZnuV">
    <li id="KpXu">dns - установка своего DNS сервера;</li>
    <li id="Rpqj">daemon.json - подключение конфигурации docker на раннере в запускаемый контейнер;</li>
    <li id="tHyW">registry-mirror - подключение зеркала docker hub.</li>
  </ul>
  <pre id="6Ece" data-lang="bash">concurrent = 2
check_interval = 0
listen_address = &quot;:9252&quot;

[[runners]]
  name = &quot;gitlab-runner-1&quot;
  url = &quot;https://gitlab.antroot.ru&quot;
  token = &quot;SomeHashedStringXJKSKFJS&quot;
  executor = &quot;docker&quot;
  [runners.custom_build_dir]
  [runners.docker]
    dns = [&quot;10.0.3.2&quot;]
    pull_policy = [&quot;always&quot;, &quot;if-not-present&quot;]
    tls_verify = false
    image = &quot;alpine:3.12.8&quot;
    privileged = true
    disable_cache = false
    volumes = [&quot;/var/run/docker.sock:/var/run/docker.sock&quot;, &quot;/cache&quot;, &quot;/certs/client&quot;,&quot;/etc/docker/daemon.json:/etc/docker/daemon.json:ro&quot;]
    shm_size = 0
    [[runners.docker.services]]
      command = [&quot;--registry-mirror&quot;, &quot;https://dockerhub.antroot.ru&quot;]
  [runners.cache]
    Type = &quot;s3&quot;
    Shared = true
    [runners.cache.s3]
      ServerAddress = &quot;s3.antroot.ru:9000&quot;
      AccessKey = &quot;minio&quot;
      SecretKey = &quot;S3SecretPass&quot;
      BucketName = &quot;runners&quot;
      BucketLocation = &quot;ru-east-1&quot;
      Insecure = true</pre>
  <p id="QcQy">Конфигурация <code>/etc/docker/daemon.json</code></p>
  <pre id="RXou" data-lang="bash">{
    &quot;registry-mirrors&quot;: [ &quot;https://dockerhub.antroot.ru&quot; ],
    &quot;dns&quot;: [&quot;10.0.3.2&quot;, &quot;8.8.8.8&quot;, &quot;1.1.1.1&quot;]
}</pre>
  <p id="WQgC">После изменения конфиугурации <strong>gitlab-runner</strong>, она должна автоматически подхватиться раннером. Перезапуск и просмотр состояния выполняется простыми командами:</p>
  <pre id="SFUz" data-lang="bash">gitlab-runner restart
gitlab-runner status</pre>
  <p id="jGqV">В <strong>GitLab</strong> в администрировании можно увидеть статус подключенного раннера.</p>
  <hr />
  <h2 id="обновление-gitlab">Обновление GitLab</h2>
  <p id="rr6e"><strong>GitLab</strong> обновляется очень просто!</p>
  <pre id="gF5x" data-lang="bash">apt update
apt install gitlab-ce</pre>
  <p id="75dg">Обновление GPG ключа репозитория:</p>
  <pre id="eoys" data-lang="bash">curl -L https://packages.gitlab.com/gitlab/gitlab-ee/gpgkey | sudo apt-key add -</pre>
  <p id="0EoI">Для обновления на специфичную версию, нужно выяснить номер версии и затем обновиться:</p>
  <pre id="YoSd" data-lang="bash">apt update
apt-cache policy gitlab-ce
apt install gitlab-ce=14.4.1-ce.0</pre>
  <p id="3dvp">Версии <strong>GitLab</strong> нумеруются так: <strong>XX.YY.ZZ</strong>, где:</p>
  <ul id="mZ7U">
    <li id="5oQt">XX - мажорная версия</li>
    <li id="qXqC">YY - минор</li>
    <li id="lkTi">ZZ - патч</li>
  </ul>
  <p id="4VxT">Обновления без изменения минорной версии можно выполнять через любое количество патчей.<br /><strong>Обновления минора лучше выполнить последовательно</strong>.</p>
  <p id="YDWI">Иногда после обновления <strong>GitLab</strong> может не стартовать автоматически, тогда достаточно попробовать выполнить перезапуск:</p>
  <pre id="bSnT" data-lang="bash">gitlab-ctl restart</pre>
  <p id="e9Vg">Если все ещё не работает, выполнить переконфигурацию:</p>
  <pre id="0RME" data-lang="bash">gitlab-ctl reconfigure
gitlab-ctl restart</pre>
  <p id="J7D9">Также при обновлении через большое количество версий, или с большим количеством проектов внутри <strong>GitLab</strong> возможны ошибки:</p>
  <ul id="868J">
    <li id="9uU7"><code>TASK: gitlab tasks: top =&gt; db:migrate</code></li>
    <li id="6gy1"><code>Upgrade fails with &quot;Error executing action &#x27;run&#x27; on resource &#x27;bash[migrate gitlab-rails database]&#x27;</code></li>
  </ul>
  <p id="Nl2V">это связано с ошибкой миграции данных при обновлении. Посмотреть состояние миграций можно так:</p>
  <pre id="4Fd1" data-lang="bash">gitlab-rake db:migrate:status</pre>
  <p id="RSDm">на выходе появится длинный список миграций в состоянии <strong>up</strong> - выполнена, <strong>down</strong> - не выполнена. Запустить миграции вручную можно так:</p>
  <pre id="i4tO" data-lang="bash">gitlab-rake db:migrate</pre>
  <p id="zQXw">После выполнения иногда может понадобиться завершить какую-нибудь миграцию блокирующую дальнейшие преобразования вручную, о чем будет выведено сообщение, например такое:</p>
  <pre id="8xgA" data-lang="bash">... run it manually
sudo gitlab-rake gitlab:background_migrations:finalize[CopyColumnUsingBackgroundMigrationJob,taggings,id,&#x27;[[&quot;id&quot;\, &quot;taggable_id&quot;]\, [&quot;id_convert_to_bigint&quot;\, &quot;taggable_id_convert_to_bigint&quot;]]&#x27;]</pre>
  <p id="wt2F">нужно выполнить это вручную, затем снова запустить миграции <code>gitlab-rake db:migrate</code>, и так до победного, чтобы в выводе <code>gitlab-rake db:migrate:status</code> все миграции были выполнены. Затем останется перезапустить <strong>gitlab</strong></p>
  <pre id="ByQD" data-lang="bash">gitlab-ctl restart</pre>
  <p id="9TH2">Проверка состояния <strong>GitLab</strong></p>
  <pre id="DvW2" data-lang="bash">gitlab-rake gitlab:env:info
gitlab-rake gitlab:check</pre>
  <hr />
  <h2 id="миграция-gitlab-на-другой-сервер">Миграция GitLab на другой сервер</h2>
  <h3 id="gitlab-сервер-источник">GitLab сервер - источник</h3>
  <p id="6ntT">Убедиться, что все необходимые компоненты сохраняются в резервной копии в конфигурационном файле <code>/etc/gitlab/gitlab.rb</code> - <code>SKIP</code> определяет, какой компонент пропустить и не копировать:</p>
  <pre id="dRvn" data-lang="bash">#&quot;SKIP&quot; =&gt; &quot;db,uploads,repositories,builds,artifacts,lfs,registry,pages&quot;
gitlab_rails[&#x27;env&#x27;] = {
    &quot;SKIP&quot; =&gt; &quot;uploads,builds,artifacts,lfs&quot;
}</pre>
  <p id="ReXN">Вначале нужно остановить сервер, чтобы сохранить целостность резервной копии:</p>
  <pre id="FeSL" data-lang="bash">gitlab-ctl stop unicorn
gitlab-ctl stop puma
gitlab-ctl stop sidekiq</pre>
  <p id="Ze68">Сохранить конфигурацию и данные:</p>
  <pre id="vmae" data-lang="bash">gitlab-ctl backup-etc
# для версий до 12.1 включительно
gitlab-rake gitlab:backup:create
# для версий после 12.1
gitlab-backup create</pre>
  <p id="CByw">Полученные файлы необходимо скопировать на новый сервер:</p>
  <ul id="Atyq">
    <li id="ResL"><code>/etc/gitlab/config_backups/gitlab_config_&lt;TIMESTAMP&gt;_&lt;DATE&gt;.tar</code> - архви с конфигурационными файлами <code>gitlab.rb</code>, <code>config.json</code>, <code>ssl</code></li>
    <li id="ajtG"><code>/var/opt/gitlab/backups/&lt;TIMESTAMP&gt;_&lt;DATE&gt;_&lt;VERSION&gt;_gitlab_backup.tar</code> - архив с данными</li>
  </ul>
  <pre id="Koqc" data-lang="bash">scp /etc/gitlab/config_backups/* user@newserver.antroot.ru:~
scp /var/opt/gitlab/backups/* user@newserver.antroot.ru:~</pre>
  <h3 id="gitlab-сервер-приемник">GitLab сервер - приемник</h3>
  <p id="Sdza">Установить <strong>GitLab</strong> такой же версии, что исходный сервер, согласно инструкции по Установке GitLab (описано выше)</p>
  <pre id="gLNY" data-lang="bash">apt install gitlab-ce=14.4.1-ce.0</pre>
  <p id="jFxF">Распаковать архив конфигурационных файлов в <code>/etc/gitlab</code></p>
  <pre id="v1iu" data-lang="bash">tar zxvf ~/config_backups/gitlab_config_&lt;TIMESTAMP&gt;_&lt;DATE&gt;.tar -C /</pre>
  <p id="DpJr">Скопировать архив данных в директорию с резервными копиями:</p>
  <pre id="oN92" data-lang="bash">scp ~/&lt;TIMESTAMP&gt;_&lt;DATE&gt;_gitlab_backup.tar /var/opt/gitlab/backups/
chown -R git:git /var/opt/gitlab/backups/</pre>
  <p id="MUcZ">Поправить значения в конфигурации <code>/etc/gitlab/gitlab.rb</code> при необходимости (например, указать новый URL):</p>
  <pre id="7vsf" data-lang="bash">gitlab-ctl reconfigure
gitlab-ctl restart</pre>
  <p id="At0U">Остановить сервисы, использующие PostgreSQL:</p>
  <pre id="Y6y3" data-lang="bash">gitlab-ctl stop unicorn
gitlab-ctl stop puma
gitlab-ctl stop sidekiq</pre>
  <p id="GXb1">Восстановить архив:</p>
  <pre id="yxYF" data-lang="bash"># для версий до 12.1 включительно
gitlab-rake gitlab:backup:restore BACKUP=&lt;TIMESTAMP&gt;_&lt;DATE&gt;_&lt;VERSION&gt;
# для версий после 12.1
gitlab-backup restore BACKUP=&lt;TIMESTAMP&gt;_&lt;DATE&gt;_&lt;VERSION&gt;</pre>
  <p id="C2vT">Запустить <strong>GitLab</strong> и выполнить проверку:</p>
  <pre id="xLMn" data-lang="bash">gitlab-ctl start
gitlab-rake gitlab:check SANITIZE=true</pre>
  <tt-tags id="8LDS">
    <tt-tag name="gitlab">#gitlab</tt-tag>
    <tt-tag name="git">#git</tt-tag>
    <tt-tag name="linux">#linux</tt-tag>
    <tt-tag name="sysadmin">#sysadmin</tt-tag>
  </tt-tags>

]]></content:encoded></item><item><guid isPermaLink="true">https://306.antroot.ru/mongodb</guid><link>https://306.antroot.ru/mongodb?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=antroot</link><comments>https://306.antroot.ru/mongodb?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=antroot#comments</comments><dc:creator>antroot</dc:creator><title>Установка MongoDB</title><pubDate>Mon, 02 Jun 2025 15:31:49 GMT</pubDate><category>Sysadmin</category><tt:hashtag>mongodb</tt:hashtag><tt:hashtag>linux</tt:hashtag><tt:hashtag>sysadmin</tt:hashtag><description><![CDATA[Установка NoSQL хранилища MongoDB]]></description><content:encoded><![CDATA[
  <p id="xBUw">Установка NoSQL хранилища MongoDB</p>
  <pre id="r55Z" data-lang="bash">apt -y install gnupg2
wget -qO - https://www.mongodb.org/static/pgp/server-4.2.asc | apt-key add -
echo &quot;deb http://repo.mongodb.org/apt/debian buster/mongodb-org/4.2 main&quot; | tee /etc/apt/sources.list.d/mongodb-org.list
apt install mongodb</pre>
  <p id="y5ze"></p>
  <p id="3Fei"><strong>Включить доступ по сети к MongoDB</strong><br />Доступ по сети определяется интерфейсами, которые слушает MongoDB, для этого в файле <code>/etc/mongod.conf</code> добавляем IP адрес (замените &lt;your_server_ip_address&gt; IP адресом своего сервера MongoDB):</p>
  <pre id="XbCP" data-lang="bash"># network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1,&lt;your_server_ip_address&gt;
  
</pre>
  <p id="VuVT">после чего нужно <strong>перезапустить MongoDB</strong></p>
  <pre id="zsjs" data-lang="bash">systemctl restart mongod</pre>
  <p id="LWUS"></p>
  <p id="sH6F"><strong>Зайти в CLI MongoDB</strong></p>
  <pre id="K6xB" data-lang="bash">mongo
mongo -u root -p &lt;password&gt;</pre>
  <p id="JdmO"></p>
  <p id="kzLF"><strong>Посмотреть список баз данных MongoDB</strong></p>
  <pre id="S0qD" data-lang="bash">show dbs</pre>
  <p id="Tl3T"></p>
  <p id="bung"><strong>Подключиться к</strong> выбранной <strong>базе данных</strong> &lt;database_name&gt; в MongoDB или создать ее, если не существует</p>
  <pre id="x9LK" data-lang="bash">use database_name</pre>
  <p id="88Pt"></p>
  <p id="hoSI"><strong>Создать пользователя</strong> &lt;database_user&gt; для базы данных &lt;database_name&gt;</p>
  <pre id="dHq9" data-lang="bash">use database_name
db.createUser(
  {
    user: &quot;database_user&quot;,
    pwd: &quot;SecretPassword,
    roles: [
      { role: &quot;readWrite&quot;, db: &quot;database_name&quot; }
    ]
  }
)</pre>
  <p id="Xv95"></p>
  <p id="AVI4"><strong>Посмотреть список коллекций</strong> в выбранной базе данных MongoDB</p>
  <pre id="ER0d" data-lang="bash">show collections</pre>
  <p id="kBdZ"></p>
  <p id="yxvc"><strong>Посмотреть список пользователей</strong> базы данных MongoDB</p>
  <pre id="J3sU" data-lang="bash">show users</pre>
  <p id="aBUz"></p>
  <p id="9mkP"><strong>Создать пользователя</strong> базы данных MongoDB</p>
  <pre id="Q9my" data-lang="bash">db.createUser({user:&#x27;username&#x27;, pwd:&#x27;SecretPassword&#x27;, roles:[&quot;readWrite&quot;]})</pre>
  <p id="yB9w"></p>
  <h2 id="безопасность-в-mongodb">Безопасность в MongoDB</h2>
  <p id="OHZR">Для включения авторизации доступа к MongoDB нужно добавить суперпользователя и запустить демона MongoDB с ключом <code>--auth</code><br />Подключиться к MongoDB CLI</p>
  <pre id="JrYp" data-lang="bash">mongo</pre>
  <p id="sX2K"></p>
  <p id="zcIE"><strong>Выполнить</strong></p>
  <pre id="vJDW" data-lang="bash">use admin
db.createUser(
  {
    user: “superuser”,
    pwd: “SecretPassword”,
    roles: [ “root” ]
  }
)</pre>
  <p id="4Xng"></p>
  <p id="PAzM"><strong>Проверить</strong>, что пользователь создан</p>
  <pre id="y14a" data-lang="bash">show users</pre>
  <p id="tDjU"></p>
  <p id="nTX5"><strong>Выключить сервер</strong></p>
  <pre id="XTh6" data-lang="bash">db.shutdownServer()
exit</pre>
  <p id="w3dV"></p>
  <p id="2R9V">и <strong>запустить демона</strong> MongoDB</p>
  <pre id="CeSg" data-lang="bash">mongod --auth</pre>
  <p id="Re6h"></p>
  <tt-tags id="Gvu3">
    <tt-tag name="mongodb">#mongodb</tt-tag>
    <tt-tag name="linux">#linux</tt-tag>
    <tt-tag name="sysadmin">#sysadmin</tt-tag>
  </tt-tags>

]]></content:encoded></item><item><guid isPermaLink="true">https://306.antroot.ru/gunicorn</guid><link>https://306.antroot.ru/gunicorn?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=antroot</link><comments>https://306.antroot.ru/gunicorn?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=antroot#comments</comments><dc:creator>antroot</dc:creator><title>Установка Gunicorn</title><pubDate>Wed, 28 May 2025 06:02:22 GMT</pubDate><category>Sysadmin</category><tt:hashtag>gunicorn</tt:hashtag><tt:hashtag>python</tt:hashtag><tt:hashtag>linux</tt:hashtag><tt:hashtag>sysadmin</tt:hashtag><description><![CDATA[Gunicorn (green unicorn) - это WSGI сервер для запуска web-приложений, написанных на языке Python.]]></description><content:encoded><![CDATA[
  <p id="UC3w"><strong>Gunicorn </strong>(green unicorn) - это WSGI сервер для запуска web-приложений, написанных на языке Python.</p>
  <pre id="ZEm4">apt update</pre>
  <p id="p7Z5"><strong>Создать виртуальное окружение для Python 2</strong></p>
  <pre id="cqZB">apt install python python-pip python-dev
cd /srv/www/antroot
pip install virtualenv
virtualenv antroot</pre>
  <p id="pCv8"><strong>Создать виртуальное окружение для Python 3</strong></p>
  <pre id="bhXC" data-lang="bash">apt install python3.5 python3-pip python3-dev python3-venv
cd /srv/www/antroot
pip3 install virtualenv
python3 -m venv antroot</pre>
  <p id="66zR"><strong>Установить gunicorn</strong></p>
  <pre id="BjxK">source antroot/bin/activate
pip install gunicorn
pip install -r requirements.txt</pre>
  <p id="h7S3"><strong>Отключить виртуальное окружение</strong></p>
  <pre id="zo8q" data-lang="bash">deactivate</pre>
  <p id="IOG9"></p>
  <h2 id="запуск-приложения-через-systemd">Запуск приложения через systemd</h2>
  <p id="IMOw">Для запуска в <code>/etc/systemd/system</code> нужно создать единицу запуска:</p>
  <pre id="6Icl" data-lang="bash">[Unit]
Description=Gunicorn antroot Web server
After=network.target

[Service]
EnvironmentFile=-/srv/www/antroot/.env
ExecStart=/srv/www/antroot/bin/gunicorn --config /srv/www/antroot/gunicorn_config.py antroot:app
ExecReload=/bin/kill -9 $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
Type=notify

[Install]
WantedBy=multi-user.target
Alias=antroot.service</pre>
  <p id="Ai8p"><strong>Включить и запустить</strong></p>
  <pre id="sTF4">systemctl daemon-reload
systemctl enable antroot
systemctl start antroot</pre>
  <p id="y5ga"></p>
  <tt-tags id="6gO7">
    <tt-tag name="gunicorn">#gunicorn</tt-tag>
    <tt-tag name="python">#python</tt-tag>
    <tt-tag name="linux">#linux</tt-tag>
    <tt-tag name="sysadmin">#sysadmin</tt-tag>
  </tt-tags>

]]></content:encoded></item><item><guid isPermaLink="true">https://306.antroot.ru/haproxy</guid><link>https://306.antroot.ru/haproxy?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=antroot</link><comments>https://306.antroot.ru/haproxy?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=antroot#comments</comments><dc:creator>antroot</dc:creator><title>Установка прокси-сервера и балансировщика HAProxy</title><pubDate>Tue, 27 May 2025 13:02:30 GMT</pubDate><category>Sysadmin</category><tt:hashtag>haproxy</tt:hashtag><tt:hashtag>linux</tt:hashtag><tt:hashtag>sysadmin</tt:hashtag><description><![CDATA[Предположим, что у нас есть один белый IP-адрес, на который нужно навесить различные сервисы.
Идеальный вариант для этого - использование обратного прокси-сервера, например чуть ранее был описан способ virtual host на Nginx]]></description><content:encoded><![CDATA[
  <p id="OSqS">Предположим, что у нас есть один белый IP-адрес, на который нужно навесить различные сервисы.<br />Идеальный вариант для этого - использование обратного прокси-сервера, например чуть ранее был описан способ <strong>virtual host</strong> на <a href="https://306.antroot.ru/nginx" target="_blank">Nginx</a></p>
  <h2 id="установка-haproxy">Установка HAProxy</h2>
  <p id="dswG">Чаще всего <strong>HAProxy</strong> уже находится в стандартном репозитории:</p>
  <pre id="ARmS" data-lang="bash">apt install -y haproxy
mv /etc/haproxy/haproxy.conf{,.orig}</pre>
  <p id="Vrbf"></p>
  <p id="xeF4">Например настроим <strong>haproxy</strong> для перенаправления всего трафика http (80) и https (443) на виртуальную машину <strong>router</strong>, предварительно настроенную для маршрутизации, например в гипервизоре Proxmox VE, с выдачей IP адреса по <a href="https://306.antroot.ru/dhcp" target="_blank">DHCP</a> и регистрацией в <a href="https://306.antroot.ru/ddns-dhcp" target="_blank">DNS</a>, с настроенным <a href="https://306.antroot.ru/nginx" target="_blank">Nginx</a> и виртуальными хостами.</p>
  <p id="ii8s"><strong>haproxy.conf - simple</strong></p>
  <pre id="pJ7e" data-lang="bash">global
        log /dev/log    local0
        log /dev/log    local1 notice
        chroot /var/lib/haproxy
        stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
        stats timeout 30s
        user haproxy
        group haproxy
        daemon
defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        option forwardfor
        #option http-server-close
        timeout connect 10s
        timeout client  60s
        timeout server  60s

        errorfile 400 /etc/haproxy/errors/400.http
        errorfile 403 /etc/haproxy/errors/403.http
        errorfile 408 /etc/haproxy/errors/408.http
        errorfile 500 /etc/haproxy/errors/500.http
        errorfile 502 /etc/haproxy/errors/502.http
        errorfile 503 /etc/haproxy/errors/503.http
        errorfile 504 /etc/haproxy/errors/504.http

listen stats
        stats enable
        mode http
        bind :7000
        stats realm      Haproxy\ Statistics
        stats auth someuser:somepassword
        stats uri /haproxystats
        stats refresh    30s

frontend http_bind
        bind *:80
        mode tcp
        option tcplog
        default_backend router_http

frontend https_bind
        bind *:443
        mode tcp
        option tcplog
        default_backend router_https

backend router_http
        mode tcp
        balance leastconn
        option httpclose
        option forwardfor
        server router_server router.antroot.lan:80
        server router_server router2.antroot.lan:80

backend router_https
        mode tcp
        server router_server router.antroot.lan:443</pre>
  <p id="YbfK"></p>
  <p id="DbKh">Добавим немного логики в <strong>haproxy</strong>, чтобы убрать из цепочки <strong>nginx</strong>.<br />Включим виртуальные хосты, перенаправим http-трафик на порт 80 соответствующих виртуальных машин, а https-трафик перенаправим на четвертом уровне сетевой модели по TCP, чтобы не пришлось устанавливать SSL-сертификаты на <strong>haproxy</strong>. Также это полезно, если в качестве конечного пункта выступает ingress кластера Kubernetes:</p>
  <p id="i0f1"><strong>haproxy.conf - ssl passthrough</strong></p>
  <pre id="OtN2" data-lang="bash">global
        log /dev/log    local0
        log /dev/log    local1 notice
        chroot /var/lib/haproxy
        stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
        stats timeout 30s
        user haproxy
        group haproxy
        daemon

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        timeout connect 10s
        timeout client  60s
        timeout server  60s
        errorfile 400 /etc/haproxy/errors/400.http
        errorfile 403 /etc/haproxy/errors/403.http
        errorfile 408 /etc/haproxy/errors/408.http
        errorfile 500 /etc/haproxy/errors/500.http
        errorfile 502 /etc/haproxy/errors/502.http
        errorfile 503 /etc/haproxy/errors/503.http
        errorfile 504 /etc/haproxy/errors/504.http

frontend http_in
        mode http
        option httplog
        bind *:80
        option forwardfor
        acl host_pve hdr(host) -i pve.antroot.ru
        acl host_git hdr(host) -i gitlab.antroot.ru
        acl host_wik hdr(host) -i wiki.antroot.ru
        acl host_k8s hdr(host) -i k8s.antroot.ru
        use_backend http_pve if host_pve
        use_backend http_git if host_git
        use_backend http_wik if host_wik
        use_backend http_k8s if host_k8s

backend http_pve
        mode http
        option httplog
        option forwardfor
        server pve pve.antroot.lan:80
backend http_git
        server git gitlab.antroot.lan:80
backend http_wik
        server wiki wiki.antroot.lan:80
backend http_k8s
        server k8s k8s.antroot.lan:80

frontend https_in
        mode tcp
        option tcplog
        option ssl-hello-chk # !
        bind *:443
        acl tls req.ssl_hello_type 1
        tcp-request inspect-delay 5s
        tcp-request content accept if tls
        #tcp-request content accept if { req.ssl_hello_type 1 }

        acl host_pve hdr(host) req.ssl_sni -i pve.antroot.ru
        acl host_git hdr(host) req.ssl_sni -i gitlab.antroot.ru
        acl host_wik hdr(host) req.ssl_sni -i wiki.antroot.ru
        acl host_k8s hdr(host) req.ssl_sni -i k8s.antroot.ru
        use_backend https_pve if host_pve
        use_backend https_git if host_git
        use_backend https_wik if host_wik
        use_backend https_k8s if host_k8s

backend https_pve
        mode tcp
        option tcplog
        option ssl-hello-chk
        server pve pve.antroot.lan:443
backend https_git
        server git gitlab.antroot.lan:443
backend https_wik
        server wiki wiki.antroot.lan:443
backend https_k8s
        mode tcp
        balance source # source leastconn roundrobin
        server k8s1 k8s1.antroot.lan:443 check ssl verify none fall 3 rise 2
        server k8s2 k8s2.antroot.lan:443 check ssl verify none fall 3 rise 2</pre>
  <p id="eYUA"></p>
  <tt-tags id="xJhn">
    <tt-tag name="haproxy">#haproxy</tt-tag>
    <tt-tag name="linux">#linux</tt-tag>
    <tt-tag name="sysadmin">#sysadmin</tt-tag>
  </tt-tags>

]]></content:encoded></item><item><guid isPermaLink="true">https://306.antroot.ru/ufw</guid><link>https://306.antroot.ru/ufw?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=antroot</link><comments>https://306.antroot.ru/ufw?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=antroot#comments</comments><dc:creator>antroot</dc:creator><title>Настройка брандмауэра UFW в Ubuntu Linux</title><pubDate>Mon, 26 May 2025 06:17:14 GMT</pubDate><category>Sysadmin</category><tt:hashtag>ufw</tt:hashtag><tt:hashtag>firewall</tt:hashtag><tt:hashtag>ubuntu</tt:hashtag><tt:hashtag>linux</tt:hashtag><tt:hashtag>sysadmin</tt:hashtag><description><![CDATA[В Ubuntu Linux средством настройки файервола является UFW]]></description><content:encoded><![CDATA[
  <p id="AUeP">В Ubuntu Linux средством настройки файервола является UFW</p>
  <p id="07aw"><strong>Посмотреть статус файервола</strong>:</p>
  <pre id="1T9K" data-lang="bash">ufw status
ufw status verbose</pre>
  <p id="VLCj"></p>
  <p id="qmvP"><strong>Получить список всех правил с номерами и удалить правило с номером</strong>:</p>
  <pre id="oygK" data-lang="bash">ufw status numbered
ufw delete &lt;number&gt;
ufw delete allow ssh</pre>
  <p id="7u1R"></p>
  <p id="mQqT"><strong>Установить политику по умолчанию</strong>:</p>
  <pre id="SBha" data-lang="bash">ufw default deny incoming
ufw default allow outgoing
ufw default allow routed</pre>
  <p id="9xX1"></p>
  <p id="63UW"><strong>Разрешить подключение по SSH только с IP адреса 10.20.30.40</strong></p>
  <pre id="94UO" data-lang="bash">ufw allow from 10.20.30.40 to any port 22</pre>
  <p id="BMYy"></p>
  <p id="dfQ3"><strong>Разрешить подключения на порты http и https</strong>:</p>
  <pre id="5Jlx" data-lang="bash">ufw allow http
ufw allow https</pre>
  <p id="y33y"></p>
  <p id="uBiw"><strong>Включить файервол UFW</strong>:</p>
  <pre id="9OdK" data-lang="bash">ufw enable</pre>
  <p id="ucqv"></p>
  <p id="pvwH"><strong>Сброс и отключение UFW</strong>:</p>
  <pre id="Tzxb" data-lang="bash">ufw reset
ufw disable</pre>
  <p id="XE3e"></p>
  <tt-tags id="B6iz">
    <tt-tag name="ufw">#ufw</tt-tag>
    <tt-tag name="firewall">#firewall</tt-tag>
    <tt-tag name="ubuntu">#ubuntu</tt-tag>
    <tt-tag name="linux">#linux</tt-tag>
    <tt-tag name="sysadmin">#sysadmin</tt-tag>
  </tt-tags>

]]></content:encoded></item><item><guid isPermaLink="true">https://306.antroot.ru/iptables</guid><link>https://306.antroot.ru/iptables?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=antroot</link><comments>https://306.antroot.ru/iptables?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=antroot#comments</comments><dc:creator>antroot</dc:creator><title>Настройка брандмауэра через iptables в Debian/Ubuntu Linux</title><pubDate>Fri, 23 May 2025 06:28:56 GMT</pubDate><category>Sysadmin</category><tt:hashtag>firewall</tt:hashtag><tt:hashtag>iptables</tt:hashtag><tt:hashtag>linux</tt:hashtag><tt:hashtag>sysadmin</tt:hashtag><description><![CDATA[Брандмауэр в Debian Linux обычно настраивается при помощи правил iptables.
Посмотреть текущее состояние файерволла:]]></description><content:encoded><![CDATA[
  <p id="wRAI">Брандмауэр в Debian Linux обычно настраивается при помощи правил <code>iptables</code>.<br />Посмотреть текущее состояние файерволла:</p>
  <pre id="oycM" data-lang="bash">iptables -L -n</pre>
  <p id="zvBd">Например, добавить правила для почтового сервера:</p>
  <pre id="H5PH" data-lang="bash">iptables -A INPUT -i eth0 -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 143 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 993 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 110 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 995 -m state --state NEW,ESTABLISHED -j ACCEPT
bash -c &#x27;iptables-save &gt; /etc/iptables/rules.v4&#x27;</pre>
  <p id="N3bd">Для сохранения правил после перезагрузки понадобится пакет <code>iptables-persistent</code>, после установки пакета будет задан вопрос о сохранении текущей конфигурации файерволла:</p>
  <pre id="j83s" data-lang="bash">apt install -y iptables-persistent</pre>
  <p id="LhEu">После добавления своих правил нужно обновить содержимое таблиц <strong>iptables</strong></p>
  <pre id="J5Ez" data-lang="bash">bash -c &#x27;iptables-save &gt; /etc/iptables/rules.v4&#x27;</pre>
  <p id="lACp"></p>
  <tt-tags id="68z6">
    <tt-tag name="firewall">#firewall</tt-tag>
    <tt-tag name="iptables">#iptables</tt-tag>
    <tt-tag name="linux">#linux</tt-tag>
    <tt-tag name="sysadmin">#sysadmin</tt-tag>
  </tt-tags>

]]></content:encoded></item><item><guid isPermaLink="true">https://306.antroot.ru/ddns-dhcp</guid><link>https://306.antroot.ru/ddns-dhcp?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=antroot</link><comments>https://306.antroot.ru/ddns-dhcp?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=antroot#comments</comments><dc:creator>antroot</dc:creator><title>Настройка DHCP сервера с динамически обновляемым сервером DNS</title><pubDate>Thu, 22 May 2025 12:29:43 GMT</pubDate><category>Sysadmin</category><tt:hashtag>dns</tt:hashtag><tt:hashtag>dhcp</tt:hashtag><tt:hashtag>linux</tt:hashtag><tt:hashtag>sysadmin</tt:hashtag><description><![CDATA[Сервер DNS занимается преобразованиями доменных имен в IP адрес и наоборот.
Сервер DHCP в сети занимается выдачей IP адресов устройствам. Одновременно с выдачей адресов, он может обновить данные в DNS, обновив данные о появившемся в сети устройстве.]]></description><content:encoded><![CDATA[
  <p id="9BVq"><strong>Сервер DNS</strong> занимается преобразованиями доменных имен в IP адрес и наоборот.<br /><strong>Сервер DHCP</strong> в сети занимается выдачей IP адресов устройствам. Одновременно с выдачей адресов, он может обновить данные в DNS, обновив данные о появившемся в сети устройстве.</p>
  <h2 id="установка-dhcp">Установка DHCP</h2>
  <p id="ntpA">Этот пакет скорее всего один из старейших резидентов всевозможных репозиториев. Устанавливаем из стандартного:</p>
  <pre id="mkUj" data-lang="bash">apt install isc-dhcp-server bind9utils</pre>
  <p id="u4aa">Включить в файле <code>/etc/default/isc-dhcp-server</code> интерфейсы для прослушивания:</p>
  <pre id="RzFW" data-lang="bash">INTERFACESv4=&quot;ens18,eth0,vlan3&quot;</pre>
  <p id="DW9x">Основной конфигурационный файл <code>/etc/dhcp/dhcpd.conf</code>,</p>
  <pre id="1rKg" data-lang="bash">option domain-name &quot;antroot.ru&quot;;
option domain-name-servers 10.0.2.2, 10.0.2.3;
authoritative;
subnet 10.0.1.0 netmask 255.255.255.0 {
}
subnet 10.0.2.0 netmask 255.255.255.0 {
}
subnet 10.0.3.0 netmask 255.255.255.0 {
    range 10.0.3.50 10.0.3.99;
    option subnet-mask 255.255.255.0;
    option routers 10.0.3.2;
    option ntp-servers 10.0.3.2;
    option domain-name-servers 10.0.3.2;
    option domain-name &quot;antroot.lan&quot;;
    ddns-domainname &quot;antroot.lan&quot;;
    default-lease-time 300;
    max-lease-time 600;
}</pre>
  <p id="KjCH">Немного тюнинга:</p>
  <pre id="TOrp" data-lang="bash">authoritative;
allow declines;
update-conflict-detection false;
update-optimization on;
update-static-leases off;</pre>
  <p id="DILJ">Запуск <strong>isc-dhcp-server</strong></p>
  <pre id="KtNP" data-lang="bash">systemctl start isc-dhcp-server
systemctl enable isc-dhcp-server
systemctl status isc-dhcp-server</pre>
  <p id="TV1j"></p>
  <h3 id="настройка-обновления-dns-из-dhcp">Настройка обновления DNS из DHCP</h3>
  <p id="idK4">Включить обновление сервера DNS в <code>dhcpd.conf</code></p>
  <pre id="PLFN" data-lang="bash">ddns-update-style interim;
ddns-domainname &quot;antroot.lan&quot;;
allow declines;</pre>
  <p id="5k7F">Сгенерировать секретные ключи:</p>
  <ul id="pa2U">
    <li id="ULo7"><code>DHCP_UPDATER</code> - для обновления DNS;</li>
    <li id="j50y"><code>dhcp_omapi</code> - для взаимодействия между репликами DHCP сервера.</li>
  </ul>
  <pre id="hE00" data-lang="bash">dnssec-keygen -a HMAC-MD5 -b 512 -n USER DHCP_UPDATER
dnssec-keygen -a HMAC-MD5 -b 512 -n USER DHCP_OMAPI
cat Kdhcp_updater.+*.private | grep ^Key | cut -d &#x27; &#x27; -f2-
cat Kdhcp_omapi.+*.private   | grep ^Key | cut -d &#x27; &#x27; -f2-</pre>
  <p id="wNhS">и добавить в конфигурационный файл dhcpd.conf под псевдонимом <code>DHCP_UPDATER</code></p>
  <pre id="GF32" data-lang="bash">key DHCP_UPDATER {
     algorithm HMAC-MD5.SIG-ALG.REG.INT;
     secret S2RoX3bfdXXkYgRlco4rMMM3KzU4MzkwCg==;
}
key dhcp_omapi {
     algorithm hmac-md5;
     secret S2RoBEXfb21hexDFdf5K3zE1NyswMDA2Mgo=;
}</pre>
  <p id="zZQT">Для включения режима failover понадобится указать порт OMAPI. OMAPI протокол используется, чтобы определять и изменять состояние DHCP сервера.</p>
  <pre id="gDAE" data-lang="bash">omapi-port 7911;
omapi-key dhcp_omapi;</pre>
  <p id="BNUD">Указать зоны, которые необходимо обновлять в <code>dhcpd.conf</code></p>
  <pre id="K1CF" data-lang="bash">zone antroot.lan. {
    primary 10.0.3.2;
    secondary 10.0.3.3;
    key DHCP_UPDATER;
}
zone 3.0.10.in-addr.arpa. {
    primary 10.0.3.2;
    secondary 10.0.3.3;
    key DHCP_UPDATER;
}</pre>
  <p id="iJjm">Добавить резервный DHCP сервер (опционально)</p>
  <pre id="NJQV" data-lang="bash">failover peer &quot;failover-partner&quot; {
     primary;
     address 10.0.1.2;
     port 519;
     peer address 10.0.1.3;
     peer port 520;
     max-response-delay 60;
     max-unacked-updates 10;
     mclt 3600;
     split 128;
     load balance max seconds 3;
}</pre>
  <p id="qy0O">и указать в подсети <code>pool</code>, который должен реплицироваться:</p>
  <pre id="3gq9" data-lang="bash">subnet 10.0.3.0 netmask 255.255.255.0 {
    pool {
        failover peer &quot;failover-partner&quot;;
        range 10.0.3.50 10.0.3.99;
        option subnet-mask 255.255.255.0;
        option routers 10.0.3.2;
        option domain-name-servers 10.0.3.2;
        option domain-name &quot;antroot.lan&quot;;
        ddns-domainname &quot;antroot.lan&quot;;
    }
}</pre>
  <p id="9n7D">На резервном DHCP сервере все то же самое, за исключением</p>
  <pre id="36Eo" data-lang="bash">failover peer &quot;failover-partner&quot; {
     secondary;
     address 10.0.1.3;
     port 520;
     peer address 10.0.1.2;
     peer port 519;
     max-response-delay 60;
     max-unacked-updates 10;
     load balance max seconds 3;
}</pre>
  <p id="LNcl"></p>
  <h2 id="установка-dns-сервера">Установка DNS сервера</h2>
  <p id="FN6r">Сервер DNS (Domain Name Services - сервис доменных имен) предназначен для преобразования доменных имен в IP адрес (прямое преобразование) и обратно (обратное преобразование, reverse DNS).<br />Этот пакет также является основополагающим, и присутствует во всяческих репозиториях.<br />Установка производится стандартным образом:</p>
  <pre id="Rf1N" data-lang="bash">apt install -y bind9</pre>
  <p id="8cd8">Стандартными для Debian/Ubuntu Linux расположениями файлов Bind9 являются</p>
  <ul id="9H85">
    <li id="Ikwe">/etc/default/bind9 - параметры запуска демона;</li>
    <li id="bd1d">/etc/bind/ - файлы конфигурации;</li>
    <li id="KK5N">/var/cache/bind/ - директория обслуживаемых доменных зон.</li>
  </ul>
  <p id="4Guc">Четко установившаяся традиция разделения длинных конфигурационных файлов на части здесь может быть использована максимально эффективно при помощи директивы <code>include</code>, где основной файл конфигурации выглядит так</p>
  <pre id="Ms9M" data-lang="bash">include &quot;/etc/bind/named.conf.options&quot;;
include &quot;/etc/bind/named.conf.local&quot;;
include &quot;/etc/bind/named.conf.default-zones&quot;;
include &quot;/etc/bind/named.conf.zones&quot;;
include &quot;/etc/bind/named.conf.zones.dynamic&quot;;</pre>
  <p id="otXI">Для добавления своей динамической в данном случае зоны воспользуемся файлом, например, <code>named.conf.zones.dynamic</code>.<br />Сгенерируем конфигурацию для обновления зоны:</p>
  <pre id="3ow8" data-lang="bash">ddns-confgen -z antroot.lan</pre>
  <p id="59wL">Добавим секретный ключ, который создали для DHCP</p>
  <pre id="tlPY" data-lang="bash">key DHCP_UPDATER {
    algorithm HMAC-MD5.SIG-ALG.REG.INT;
    secret S2RoX3bfdXXkYgRlco4rMMM3KzU4MzkwCg==;
};</pre>
  <p id="9p7V">И зоны, прямую и обратную:</p>
  <pre id="6xNP" data-lang="bash">zone &quot;antroot.lan&quot; {
    type master;
    file &quot;antroot.lan.hosts&quot;;
    masterfile-format text;
    allow-update {
        key DHCP_UPDATER;
        10.0.3.2;
        10.0.3.3;
    };
    notify no;
};

zone &quot;3.0.10.in-addr.arpa&quot; IN {
    type master;
    file &quot;_db.10.0.3&quot;;
    masterfile-format text;
    allow-update {
        key DHCP_UPDATER;
        10.0.3.2;
        10.0.3.3;
    };
};</pre>
  <p id="ODyU">И также необходимо создать мастер-файлы этих зон в директории <code>/var/cache/bind</code><br />Мастер файл прямой зоны antroot<code>.lan.hosts</code></p>
  <pre id="da4x" data-lang="bash">$ORIGIN .
$TTL 86400      ; 1 day
antroot.lan  IN SOA  antroot.lan. admin.antroot.lan. (
                                2021100601 ; serial
                                600        ; refresh (10 minutes)
                                300        ; retry (5 minutes)
                                3600       ; expire (1 hour)
                                600        ; minimum (10 minutes)
                                )
                        NS      ns.antroot.lan.
                        MX      10 mx.antroot.lan.
                        TXT     &quot;antroot.ru server&quot;
                        HINFO   &quot;Pentium-III-1200&quot; &quot;Linux&quot;
                        A       10.0.3.2
$ORIGIN antroot.lan.
ns                      A       10.0.3.2
mx                      A       10.0.3.2
$TTL 300        ; 5 minutes
nas.                    A       10.0.3.8</pre>
  <p id="8rpm">Мастер файл обратной <code>_db.10.0.3</code></p>
  <pre id="Zdfj" data-lang="bash">$ORIGIN .
$TTL 600        ; 10 minutes
3.0.10.in-addr.arpa     IN SOA  mijor.lan. cd.mijor.lan. (
                                34         ; serial
                                600        ; refresh (10 minutes)
                                3600       ; retry (1 hour)
                                86400      ; expire (1 day)
                                3600       ; minimum (1 hour)
                                )
                        NS      localhost.
$ORIGIN 3.0.10.in-addr.arpa.
$TTL 300        ; 5 minutes
90                      PTR     nas.mijor.lan.</pre>
  <p id="tSHF">Проверка конфигурационных файлов:</p>
  <pre id="nkvm" data-lang="bash">named-checkconf /etc/bind/named.conf</pre>
  <p id="BIcw"></p>
  <h2 id="управление-dns-через-утилиту-rndc">Управление DNS через утилиту rndc</h2>
  <p id="v4kS">Сгенерировать конфигурацию rndc</p>
  <pre id="91P4" data-lang="bash">rndc-confgen &gt; /etc/bind/rndc.conf</pre>
  <p id="TDab">следующего содержания:</p>
  <pre id="yLNo" data-lang="bash">key &quot;rndc-key&quot; {
      algorithm hmac-md5;
    secret &quot;ABCDEFGHIJKLMNOPQRSTUVWXYZ==&quot;;
};
options {
     default-server 127.0.0.1;
     default-port 953;
     default-key &quot;rndc-key&quot;;
};</pre>
  <p id="1x2u">Добавить в /etc/bind/named.conf</p>
  <pre id="T6Hx" data-lang="bash">include &quot;/etc/bind/rndc.key&quot;;
controls {
        inet 127.0.0.1 port 953
        allow { 127.0.0.1; } keys { &quot;rndc-key&quot;; };
    };</pre>
  <p id="oEKK">После перезапуска bind9 (<code>systemctl restart bind9</code>) можно воспользоваться:</p>
  <ul id="unGn">
    <li id="MPwo"><code>rndc status</code> - вывод общего состояния DNS сервера;</li>
    <li id="gLQ6"><code>rndc freeze antroot.lan</code> - заморозка зоны antroot.lan для ручного внесения изменений;</li>
    <li id="VFOU"><code>rndc thaw antroot.lan</code> - вернуть возможность обновления зоны antroot.lan</li>
  </ul>
  <p id="vkD3"></p>
  <h2 id="ошибки-конфигурации">Ошибки конфигурации</h2>
  <blockquote id="SHhf">dhcp_updater: updating zone &#x27;antroot.lan/IN&#x27;: update unsuccessful: srv1.antroot.lan: &#x27;name not in use&#x27; prerequisite not satisfied (YXDOMAIN)</blockquote>
  <p id="vFRz">Решение: в <code>dhcpd.conf</code><br />заменить <code>ignore client-updates;</code> на <code>allow client-updates;</code></p>
  <p id="0LAt"></p>
  <blockquote id="XiEt">Forward map from srv1.antroot.lan to xx.xx.xx.xx FAILED: Has an A record but no DHCID, not mine.</blockquote>
  <p id="ZRd1">DHCP-ID формируется, как хэш, вычисленный из комбинации FQDN машины, MAC адреса. DHCP-ID сохраняется в TXT записи в DNS<br />Решение: в <code>dhcpd.conf</code> добавить<br /><code>update-conflict-detection off;</code></p>
  <p id="N6Rb"></p>
  <blockquote id="ookY">Не разрешаются имена, кроме укзанных своих зон:</blockquote>
  <p id="CR5h">Убедитесь, что не включена опция <code>allow-recursion { none; };</code></p>
  <p id="xjrD"></p>
  <tt-tags id="MgPh">
    <tt-tag name="dns">#dns</tt-tag>
    <tt-tag name="dhcp">#dhcp</tt-tag>
    <tt-tag name="linux">#linux</tt-tag>
    <tt-tag name="sysadmin">#sysadmin</tt-tag>
  </tt-tags>

]]></content:encoded></item><item><guid isPermaLink="true">https://306.antroot.ru/dns-bind</guid><link>https://306.antroot.ru/dns-bind?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=antroot</link><comments>https://306.antroot.ru/dns-bind?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=antroot#comments</comments><dc:creator>antroot</dc:creator><title>Установка и настройка DNS сервера Bind9 в Debian/Ubuntu Linux</title><pubDate>Thu, 22 May 2025 07:06:05 GMT</pubDate><category>Sysadmin</category><tt:hashtag>dns</tt:hashtag><tt:hashtag>linux</tt:hashtag><tt:hashtag>sysadmin</tt:hashtag><description><![CDATA[Сервер DNS (Domain Name Services - сервис доменных имен) предназначен для преобразования доменных имен в IP адрес (прямое преобразование) и обратно (обратное преобразование, reverse DNS).]]></description><content:encoded><![CDATA[
  <p id="wNOq"><strong>Сервер DNS</strong> (Domain Name Services - сервис доменных имен) предназначен для преобразования доменных имен в IP адрес (прямое преобразование) и обратно (обратное преобразование, reverse DNS).</p>
  <h2 id="установка-dns-сервера">Установка DNS сервера</h2>
  <p id="JdZY">Этот пакет является основополагающим, и присутствует во всяческих репозиториях.<br />Установка производится стандартным образом:</p>
  <pre id="OLoU" data-lang="bash">apt install -y bind9 bind9utils</pre>
  <p id="Y0Vb">Стандартными для Debian/Ubuntu Linux расположениями файлов Bind9 являются</p>
  <ul id="Eopq">
    <li id="pCvC"><code>/etc/default/bind9</code> - параметры запуска демона;</li>
    <li id="AWCh"><code>/etc/bind/</code> - файлы конфигурации;</li>
    <li id="QMZf"><code>/var/cache/bind/</code> - директория обслуживаемых доменных зон;</li>
    <li id="qROR"><code>/var/log/bind/</code> - файлы журналов.</li>
  </ul>
  <p id="WiHU">Четко установившаяся традиция разделения длинных конфигурационных файлов на части здесь может быть использована максимально эффективно при помощи директивы <code>include</code>, где основной файл конфигурации выглядит так</p>
  <pre id="UMII" data-lang="bash">include &quot;/etc/bind/named.conf.options&quot;;
include &quot;/etc/bind/named.conf.local&quot;;
include &quot;/etc/bind/named.conf.default-zones&quot;;
include &quot;/etc/bind/named.conf.zones&quot;;
include &quot;/etc/bind/named.conf.zones.dynamic&quot;;</pre>
  <p id="bQCI"></p>
  <h2 id="основные-параметры-конфигурации-dns-bind9">Основные параметры конфигурации DNS Bind9</h2>
  <p id="aLLy">В разделе <code>options</code> определяются общие параметры DNS сервера.</p>
  <ul id="9q2J">
    <li id="jioX"><code>directory</code> - определяет расположение мастер-файлов зон;</li>
    <li id="Deyn"><code>forwarders</code> - вышестоящие DNS серверы (заменить 0.0.0.0 и убрать комментарий);</li>
    <li id="BnxX"><code>listen-on</code> - какие интерфейсы должны прослушиваться;</li>
    <li id="4wvm"><code>version</code> - информация о версии сервера.</li>
  </ul>
  <pre id="rJe6" data-lang="bash">options {
        // forwarders { 0.0.0.0; };
        directory &quot;/var/cache/bind&quot;;
        listen-on { 10.0.1.2; 10.0.2.2; 10.0.3.2; 127.0.0.1; };
        version none;
};</pre>
  <p id="Eiab"></p>
  <h2 id="журналирование-в-dns-bind9">Журналирование в DNS Bind9</h2>
  <p id="KkDx">Для разбивки журналов можно использовать каналы, которые записывать в различные файлы.</p>
  <pre id="sZLE" data-lang="bash">logging {
        // Общий канал для всех запросов в DNS
        channel default_ch {
                // Параметры ротации файла: размер 100КБ, 4 версии
                file &quot;/var/log/bind/named.log&quot; versions 4 size 100k;
                severity info;      // Уровень информативности
                print-time yes;     // Показывать время
                print-category yes; // Указывать категорию
        };
        // Канал для упрощенных запросов
        channel lame_ch {
                file &quot;/var/log/bind/lame_servers.log&quot; versions 4 size 100k;
                severity info;
                print-time yes;
                print-category yes;
                };
        // Канал безопасности
        channel security_ch {
                file &quot;/var/log/bind/security.log&quot; versions 4 size 100k;
                severity info;
                print-severity yes;
                print-time yes;
                print-category yes;
                };
        // Канал передачи зон между серверами
        channel xfer_ch {
                file &quot;/var/log/bind/xfer.log&quot; versions 4 size 100k;
                severity info;
                print-time yes;
                print-category yes;
                };
        // Канал отладки обновлений зон
        channel update_debug {
                file &quot;/var/log/bind/update_debug.log&quot; versions 4 size 100k;
                severity debug 3;
                print-category yes;
                print-severity yes;
                print-time     yes;
                print-severity yes;
                print-time     yes;
        };
        // Канал обновлений зон
        channel update_log {
                file &quot;/var/log/bind/update.log&quot; versions 4 size 100k;
                severity dynamic;
                print-category yes;
                print-severity yes;
                print-time     yes;
        };

        // Направление категорий сообщений в соответствующие каналы
        category lame-servers { lame_ch; };
        category xfer-in  { xfer_ch; };
        category xfer-out { xfer_ch; };
        category update   { update_debug; update_log; };
        category update-security { update_debug; };
        category security { security_ch; };
        category default  { default_ch; };
};</pre>
  <p id="MS7w">При необходимости отключения любой категории, направьте ее в <code>null</code></p>
  <pre id="aIaA" data-lang="bash">category lame-servers { null; };</pre>
  <p id="khmP"></p>
  <h2 id="добавление-зоны-в-dns">Добавление зоны в DNS</h2>
  <p id="el1V">Для добавления своей динамической в данном случае зоны воспользуемся файлом, например, <code>named.conf.zones.dynamic</code>.<br />Добавим секретный ключ для DHCP</p>
  <pre id="9amS" data-lang="bash">key DHCP_UPDATER {
    algorithm HMAC-MD5.SIG-ALG.REG.INT;
    secret S2RoX3bfdXXkYgRlco4rMMM3KzU4MzkwCg==;
};</pre>
  <p id="2q6y">И зоны, прямую и обратную:</p>
  <pre id="f9J6" data-lang="bash">zone &quot;antroot.lan&quot; {
    type master;
    file &quot;antroot.lan.hosts&quot;;
    masterfile-format text;
    allow-update {
        key DHCP_UPDATER;
        10.0.3.2;
        10.0.3.3;
    };
    notify no;
};

zone &quot;3.0.10.in-addr.arpa&quot; IN {
    type master;
    file &quot;_db.10.0.3&quot;;
    masterfile-format text;
    allow-update {
        key DHCP_UPDATER;
        10.0.3.2;
        10.0.3.3;
    };
};</pre>
  <p id="CZnm">И также необходимо создать мастер-файлы этих зон в директории <code>/var/cache/bind</code><br />Мастер файл прямой зоны <code>antroot.lan.hosts</code></p>
  <pre id="sEKb" data-lang="bash">$ORIGIN .
$TTL 86400      ; 1 day
antroot.lan  IN SOA  antroot.lan. admin.antroot.lan. (
                                2021100601 ; serial
                                600        ; refresh (10 minutes)
                                300        ; retry (5 minutes)
                                3600       ; expire (1 hour)
                                600        ; minimum (10 minutes)
                                )
                        NS      ns.antroot.lan.
                        MX      10 mx.antroot.lan.
                        TXT     &quot;antroot.ru server&quot;
                        HINFO   &quot;Pentium-III-1200&quot; &quot;Linux&quot;
                        A       10.0.3.2
$ORIGIN antroot.lan.
ns                      A       10.0.3.2
mx                      A       10.0.3.2
$TTL 300        ; 5 minutes
nas.                    A       10.0.3.8</pre>
  <p id="Xjsi">Мастер файл обратной <code>_db.10.0.3</code></p>
  <pre id="PkbA" data-lang="bash">$ORIGIN .
$TTL 600        ; 10 minutes
3.0.10.in-addr.arpa     IN SOA  mijor.lan. cd.mijor.lan. (
                                34         ; serial
                                600        ; refresh (10 minutes)
                                3600       ; retry (1 hour)
                                86400      ; expire (1 day)
                                3600       ; minimum (1 hour)
                                )
                        NS      localhost.
$ORIGIN 3.0.10.in-addr.arpa.
$TTL 300        ; 5 minutes
90                      PTR     nas.mijor.lan.</pre>
  <p id="1jFR">Проверка конфигурационных файлов:</p>
  <pre id="FKyo">named-checkconf /etc/bind/named.conf</pre>
  <p id="fjCH"></p>
  <h2 id="настройка-split-dns">Настройка Split DNS</h2>
  <p id="NH25">Иногда требуется сделать различное отображение данных DNS для внутренних клиентов в корпоративной сети и для внешних, обращающихся через интернет. В частности, для использования машин с несколькими IP адресами, или работающими через nginx/haproxy прокси серверы.<br />Определим внешних и внутренних клиентов:</p>
  <pre id="Tu3z" data-lang="bash">acl internal_nets { 172.16.72.0/24; 192.168.1.0/24; };
acl external_nets { bastion-ips-go-here; };</pre>
  <p id="iaqT">и определим отображения <code>view</code></p>
  <pre id="SjqK" data-lang="bash">view &quot;internal&quot; {
    match-clients {
        192.168.0.0/16;
        172.16.0.0/12;
        10.0.0.0/8;
        127.0.0.0/8;
    };
    recursion yes;

    zone &quot;antroot.ru&quot; {
        type master;
        file &quot;antroot.ru.local.hosts&quot;;
        ...
    }
    include &quot;named.conf.zones&quot;;
}
view &quot;external&quot; {
    match-clients { any; };
    zone &quot;antroot.ru&quot; {
        type master;
        file &quot;antroot.ru.hosts&quot;;
        notify yes;
        allow-transfer { slave_ns; };
    };
    include &quot;named.conf.zones&quot;;
};</pre>
  <p id="52D2">Здесь определено два отображения <code>view</code>, <code>internal</code> - внутренняя, котороая будет отдаваться только на запросы из внутренних сетей, и <code>external</code> - внешняя, которая будет отвечать на запросы любому клиенту. При помощи директивы <code>include</code> подключаются общие для всех клиентов данные.<br />В приведенном примере, разделяется (split) зона<code> antroot.ru</code>. Мы определяем адреса серверов из демилитаризованной зоны в файле <code>antroot.ru.local.hosts</code></p>
  <pre id="EFnQ" data-lang="bash">srv1  IN A 10.0.3.101
srv2  IN A 10.0.3.102</pre>
  <p id="KQq5">и наряду с этим задаем в файле <code>antroot.ru.hosts</code> белый IP адрес, на котором установлен, например, прокси сервер, перенаправляющий запросы по имени хоста на соответствующий адрес в локальной сети:</p>
  <pre id="w6iL" data-lang="bash">srv1  IN A 50.60.70.80
srv2  IN A 50.60.70.80</pre>
  <p id="ilvP"></p>
  <h2 id="запуск-сервера-dns-bind9">Запуск сервера DNS Bind9</h2>
  <p id="nGKd">Запуск, перезапуск осуществляется через утилиту <code>systemctl</code></p>
  <pre id="kXKh" data-lang="bash">systemctl start bind9
systemctl enable bind9
systemctl status bind9</pre>
  <p id="peTx"></p>
  <h2 id="управление-dns-через-утилиту-rndc">Управление DNS через утилиту rndc</h2>
  <p id="egva">Сгенерировать конфигурацию rndc:</p>
  <pre id="Eard">rndc-confgen &gt; /etc/bind/rndc.conf</pre>
  <p id="nWWf">следующего содержания:</p>
  <pre id="0iKJ" data-lang="bash">key &quot;rndc-key&quot; {
      algorithm hmac-md5;
    secret &quot;ABCDEFGHIJKLMNOPQRSTUVWXYZ==&quot;;
};
options {
     default-server 127.0.0.1;
     default-port 953;
     default-key &quot;rndc-key&quot;;
};</pre>
  <p id="eioG">Добавить в <code>/etc/bind/named.conf</code></p>
  <pre id="TW8x" data-lang="bash">include &quot;/etc/bind/rndc.key&quot;;
controls {
        inet 127.0.0.1 port 953
        allow { 127.0.0.1; } keys { &quot;rndc-key&quot;; };
    };</pre>
  <p id="NFmQ">После перезапуска bind9 (<code>systemctl restart bind9</code>) можно воспользоваться:</p>
  <ul id="JIWt">
    <li id="tR5L"><code>rndc status</code> - вывод общего состояния DNS сервера;</li>
    <li id="wYl5"><code>rndc freeze antroot.lan</code> - заморозка зоны antroot.lan для ручного внесения изменений;</li>
    <li id="Nshj"><code>rndc thaw antroot.lan</code> - вернуть возможность обновления зоны antroot.lan.</li>
  </ul>
  <p id="w3sy"></p>
  <h2 id="некоторые-ошибки">Некоторые ошибки</h2>
  <blockquote id="OBt2">Ошибка синхронизации журнала изменений зоны</blockquote>
  <pre id="ViqP" data-lang="bash">general: zone antroot.lan/IN: journal rollforward failed: journal out of sync with zone</pre>
  <p id="SKSy">Удалить файл журнала и перезапустить DNS сервер</p>
  <pre id="49XS" data-lang="bash">rm var/cache/bind/antroot.lan.hosts.jnl
systemctl restart bind9</pre>
  <p id="6dcP"></p>
  <tt-tags id="Xyw0">
    <tt-tag name="dns">#dns</tt-tag>
    <tt-tag name="linux">#linux</tt-tag>
    <tt-tag name="sysadmin">#sysadmin</tt-tag>
  </tt-tags>

]]></content:encoded></item><item><guid isPermaLink="true">https://306.antroot.ru/dhcp</guid><link>https://306.antroot.ru/dhcp?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=antroot</link><comments>https://306.antroot.ru/dhcp?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=antroot#comments</comments><dc:creator>antroot</dc:creator><title>Настройка DCHP сервера в Debian/Ubuntu Linux</title><pubDate>Wed, 21 May 2025 08:41:46 GMT</pubDate><category>Sysadmin</category><tt:hashtag>dhcp</tt:hashtag><tt:hashtag>linux</tt:hashtag><tt:hashtag>sysadmin</tt:hashtag><description><![CDATA[Сервер DHCP в сети занимается выдачей IP адресов устройствам. Одновременно с выдачей адресов...]]></description><content:encoded><![CDATA[
  <p id="0KAt">Сервер <strong>DHCP</strong> в сети занимается выдачей IP адресов устройствам. Одновременно с выдачей адресов.</p>
  <h2 id="установка-сервера-dhcp">Установка сервера DHCP</h2>
  <p id="dZLX">Этот пакет скорее всего один из старейших резидентов всевозможных репозиториев. Устанавливаем из стандартного:</p>
  <pre id="IgVE" data-lang="bash">apt install isc-dhcp-server</pre>
  <p id="Mtxu"></p>
  <h2 id="настройка-сервера-dhcp">Настройка сервера DHCP</h2>
  <p id="6VJy">Первая настройка в файле <code>/etc/default/isc-dhcp-server</code>, в котором нужно указать необходимые для прослушивания интерфейсы системы, физические и виртуальные.</p>
  <pre id="u6DB" data-lang="bash">INTERFACESv4=&quot;ens18,eth0,vlan1&quot;</pre>
  <p id="Xf55">Файл записей аренды адресов располагается по умолчанию <code>/var/lib/dhcp/dhcpd.leases</code><br />Дальнейшая настройка производится в основном конфигурационном файле <code>/etc/dhcp/dhcpd.conf</code>,<br />где необходимо указать основное имя домена и DNS</p>
  <pre id="QFoT" data-lang="bash">option domain-name &quot;antroot.ru&quot;;
option domain-name-servers 10.0.2.1, 10.0.2.2;</pre>
  <p id="VEmI">Если устанавливается DHCP сервер, значит планируется раздавать IP адреса этим сервером, поэтому указываем, что он уполномочен это делать:</p>
  <pre id="USzm" data-lang="bash">authoritative;</pre>
  <p id="3x8K">Следует указать все подсети, к которым подключен сервер, чтобы он понимал конфигурацию сети, указывая только в нужной параметры раздачи IP адресов</p>
  <pre id="O11A" data-lang="bash">subnet 10.0.1.0 netmask 255.255.255.0 { }
subnet 10.0.2.0 netmask 255.255.255.0 { }
subnet 10.0.3.0 netmask 255.255.255.0 {
    range 10.0.3.50 10.0.3.99;
    option subnet-mask 255.255.255.0;
    option routers 10.0.3.2;
    option domain-name-servers 10.0.2.1;
}</pre>
  <p id="JCeX">Для фиксации IP адреса определенному устройству в сети можно указать его MAC адрес</p>
  <pre id="UtnZ" data-lang="bash">host some-client {
  hardware ethernet fe:ce:12:34:56:78;
  fixed-address 10.0.3.11;
  option host-name &quot;antroot-1&quot;;
  ddns-hostname &quot;antroot-1&quot;;
}</pre>
  <p id="lNF3">Несколько хостов можно объединить в группу <code>group</code>, чтобы задать общие для группы параметры:</p>
  <pre id="b4Bl" data-lang="bash">group {
  # общие для группы параметры
  option domain-name &quot;antroot.lan&quot;;
  option domain-name-servers 10.0.3.2;
  option routers 10.0.3.2;
  host srv1 {
    # параметры хоста srv1
    hardware ethernet fe:ce:12:34:56:78;
    fixed-address 10.0.3.11;
  }
  host srv2 {
    # параметры хоста srv2
    hardware ethernet fe:ce:12:34:56:79;
    fixed-address 10.0.3.12;
  }
}</pre>
  <p id="3XsV">Для определенной подсети <code>subnet</code> пула <code>pool</code> группы <code>group</code> можно указать время аренды IP адреса в секундах - это бывает нужно для тестовых машин, когда их создается очень много на короткое время, чтобы пул адресов быстрее освобождался:</p>
  <pre id="Z3j9" data-lang="bash">max-lease-time 300;
default-lease-time 300;</pre>
  <p id="FsQ3">Подсеть <code>subnet</code> может быть разделена на пулы <code>pool</code>, каждому из которых можно определить свои дополнительные параметры:</p>
  <pre id="mBVx" data-lang="bash">subnet 10.0.3.0 netmask 255.255.255.0 {
  option routers 10.0.3.2;
  pool {
    range 10.0.3.150 10.0.3.199;
    option domain-name-servers 10.0.3.2;
    max-lease-time 300;
    default-lease-time 300;
    allow unknown-clients;
  }
  pool {
    range 10.0.3.50 10.0.3.99;
    option domain-name-servers 10.0.2.1, 10.0.3.2;
    deny unknown-clients;
  }
}</pre>
  <p id="Z3Ht"></p>
  <h2 id="журналирование-сервера-dhcp">Журналирование сервера DHCP</h2>
  <p id="1iX1">Включаем маркирование логов в файле <code>dhcpd.conf</code></p>
  <pre id="P148" data-lang="bash">log-facility local7;</pre>
  <p id="Z5Eb">Затем необходимо добавить в конфигурацию syslog перенаправление в отдельный файл, для чего в директории <code>/etc/rsyslog.d/</code> добавить файл <code>isc-dhcp-server.conf</code> с таким содержимым:</p>
  <pre id="OCpq" data-lang="bash">local7.* /var/log/dhcpd.log
&amp; ~</pre>
  <p id="x7N1">и в основном файле конфигурации отключить запись в <code>/var/log/syslog</code> этих сообщений</p>
  <pre id="pR1O" data-lang="bash">*.*;auth,authpriv.none -/var/log/syslog
# заменить на
*.*;auth,authpriv.none;local7.none -/var/log/syslog</pre>
  <p id="cclO">и перезапустить syslog</p>
  <pre id="9tIy" data-lang="bash">systemctl restart rsyslog</pre>
  <p id="h94b"></p>
  <h2 id="запуск-сервера-dhcp">Запуск сервера DHCP</h2>
  <p id="wPHh">Запускаем <strong>isc-dhcp-server</strong></p>
  <pre id="J6bs" data-lang="bash">systemctl start isc-dhcp-server
systemctl enable isc-dhcp-server
systemctl status isc-dhcp-server</pre>
  <p id="fRTf"></p>
  <tt-tags id="YiOH">
    <tt-tag name="dhcp">#dhcp</tt-tag>
    <tt-tag name="linux">#linux</tt-tag>
    <tt-tag name="sysadmin">#sysadmin</tt-tag>
  </tt-tags>

]]></content:encoded></item><item><guid isPermaLink="true">https://306.antroot.ru/kafka-linux</guid><link>https://306.antroot.ru/kafka-linux?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=antroot</link><comments>https://306.antroot.ru/kafka-linux?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=antroot#comments</comments><dc:creator>antroot</dc:creator><title>Установка Kafka на Ubuntu Linux</title><pubDate>Tue, 20 May 2025 08:05:31 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/06/42/0642cdd7-c6a3-4fd0-bff6-bcfe94cad30a.png"></media:content><category>Sysadmin</category><tt:hashtag>kafka</tt:hashtag><tt:hashtag>linux</tt:hashtag><tt:hashtag>ubuntu</tt:hashtag><tt:hashtag>sysadmin</tt:hashtag><description><![CDATA[<img src="https://img3.teletype.in/files/6a/32/6a3201ee-4530-417f-9ff1-b1f7d441e3d5.png"></img>Apache Kafka - это распределенная канальная платформа. Платформа каналов обладает такими возможностями...]]></description><content:encoded><![CDATA[
  <p id="LGYd"><strong>Apache Kafka</strong> - это распределенная канальная платформа. Платформа каналов обладает такими возможностями:</p>
  <ul id="eCAr">
    <li id="CaS4">Публикация и подписка на каналы записей, что очень похоже на очередь сообщений</li>
    <li id="2lwz">Сохранение каналов записей в отказоустойчивом долгосрочном хранилище</li>
    <li id="CsFV">Обработка калаов записей сразу при их появлении</li>
  </ul>
  <p id="lLAL"><strong>Kafka</strong> обычно <strong>используется</strong> для приложений:</p>
  <ul id="YiAh">
    <li id="ctai">Построения конвейеров передачи данных в реальном времени между приложениями</li>
    <li id="E1lU">Построения потоковых приложений, преобразовывающих или реагирующих на потоки данных</li>
  </ul>
  <p id="wqZ3"><strong>Концепция</strong>:</p>
  <ul id="hDjG">
    <li id="6ngM">Kafka запускается, как кластер, выполняющийся на одном или нескольких серверах, расположенных, возможно, в нескольких дата-центрах</li>
    <li id="hbmC">Kafka сохраняет потоки записей в категориях, называемых &quot;тема&quot;</li>
    <li id="PAOj">Каждая запис состоит из ключа, значения и отметки времени</li>
  </ul>
  <p id="x9mD"><strong>Kafka содержит</strong> четыре <strong>API</strong>:</p>
  <ul id="JXfh">
    <li id="DFF1">Producer API - позволяет приложениям публиковать потоки записей в одну или несколько тем</li>
    <li id="BcKG">Consumer API - позволяет приложениям подписываться на темы и обрабатывать потоки записей, публикуемых в них</li>
    <li id="I9U3">Streams API - позволяет приложениям работать, как обработчик потоков, предполагая извлечение записей из входящего потока по одной или нескольким темам, и публикуя выходящий поток в одну или несколько тем, выполняя некоторое преобразование входящих потоков в исходящие потоки</li>
    <li id="H1Nx">Connector API - позволяет строить и запускать переиспользуемых публикаторов и подписчиков, что соединяет темы Kafka с существующими приложениями. К примеру, коннектор к реляционной базе данных может отлавливать каждое изменение таблицы.</li>
  </ul>
  <figure id="zaow" class="m_column">
    <img src="https://img3.teletype.in/files/6a/32/6a3201ee-4530-417f-9ff1-b1f7d441e3d5.png" width="1069" />
  </figure>
  <p id="AVdZ">В Kafka коммуникация между клиентами и серверами выполняется на простом, высокопроизводительном языке по TCP протоколу. Протокол версионен и поддерживает обратную совместимость со старыми версиями. Существует множество клиентов для Kafka на различных языках, среди которых Go, Java, PHP, Python, Rust, Swift.</p>
  <p id="m2Qc"></p>
  <h2 id="установка-apache-kafka-на-ubuntu-linux-1">Установка Apache Kafka на Ubuntu Linux</h2>
  <p id="WRm3"><strong>Установить Java</strong></p>
  <pre id="dlpz" data-lang="bash">apt install -y default-jre
java -version</pre>
  <p id="NeD7"><strong>Создать пользователя</strong></p>
  <pre id="7Feg" data-lang="bash">adduser kafka
adduser kafka sudo
su -l kafka</pre>
  <p id="3XJs"><strong>Установки Apache Kafka 3.1.0 со Scala 2.13</strong></p>
  <pre id="OZvC" data-lang="bash">curl -fsSLO https://dlcdn.apache.org/kafka/3.1.0/kafka_2.13-3.1.0.tgz
tar zxvf kafka_2.13-3.1.0.tgz
mv kafka_2.13-3.1.0 ~/kafka
cd ~/kafka
#./bin/kafka-server-start.sh config/server.properties
#./bin/zookeeper-server-start.sh config/zookeeper.properties</pre>
  <p id="nnsT"><strong>Настройка</strong></p>
  <pre id="4yhM" data-lang="bash">vi ~/kafka/config/server.properties
# установить следующие значечния
delete.topic.enable = true
log.dirs=/home/kafka/logs</pre>
  <p id="IsXr"><strong>Настроить Systemd Units</strong><br /><code>sudo vi /etc/systemd/system/zookeeper.service</code></p>
  <pre id="hZMc" data-lang="bash">[Unit]
Requires=network.target remote-fs.target
After=network.target remote-fs.target

[Service]
Type=simple
User=kafka
ExecStart=/home/kafka/kafka/bin/zookeeper-server-start.sh /home/kafka/kafka/config/zookeeper.properties
ExecStop=/home/kafka/kafka/bin/zookeeper-server-stop.sh
Restart=on-abnormal

[Install]
WantedBy=multi-user.target</pre>
  <p id="e02B"><code>sudo vi /etc/systemd/system/kafka.service</code></p>
  <pre id="K2mp" data-lang="bash">[Unit]
Requires=zookeeper.service
After=zookeeper.service

[Service]
Type=simple
User=kafka
ExecStart=/bin/sh -c &#x27;/home/kafka/kafka/bin/kafka-server-start.sh /home/kafka/kafka/config/server.properties &gt; /home/kafka/kafka/kafka.log 2&gt;&amp;1&#x27;
ExecStop=/home/kafka/kafka/bin/kafka-server-stop.sh
Restart=on-abnormal

[Install]
WantedBy=multi-user.target</pre>
  <p id="REGw"></p>
  <pre id="hh8V" data-lang="bash">systemctl start zookeeper
systemctl start kafka
systemctl enable zookeeper
systemctl enable kafka</pre>
  <p id="Xgza"><strong>Тестирование Kafka</strong></p>
  <pre id="Je20" data-lang="bash"># создать тему QUEUE
#./bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic QUEUE
./bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic QUEUE
# создать публикатора для темы QUEUE, и написать несколько строк сообщений
./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic QUEUE
# показать список тем
#./bin/kafka-topics.sh --list --zookeeper localhost:2181
./bin/kafka-topics.sh --list --bootstrap-server localhost:9092
# создать подписчика на тему QUEUE и просмотреть сообщения
./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic QUEUE --from-beginning</pre>
  <p id="m0h0">их соседнего терминала можно отправить сообщение в открытый с подписчиком</p>
  <pre id="gOBv" data-lang="bash">echo &quot;Hello World!&quot; | ~/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic QUEUE &gt; /dev/null</pre>
  <p id="of6a"><strong>Установка утилиты администрирования KafkaT</strong></p>
  <pre id="55JB" data-lang="bash">sudo apt install ruby ruby-dev build-essential
sudo CFLAGS=-Wno-error=format-overflow gem install kafkat</pre>
  <p id="I9Vb"><code>vi ~/.kafkatcfg</code></p>
  <pre id="XGRM" data-lang="bash">{
  &quot;kafka_path&quot;: &quot;~/kafka&quot;,
  &quot;log_path&quot;: &quot;/home/kafka/logs&quot;,
  &quot;zk_path&quot;: &quot;localhost:2181&quot;
}</pre>
  <p id="ilAN"><code>kafkat partitions</code></p>
  <p id="OQgK"></p>
  <tt-tags id="Dc9T">
    <tt-tag name="kafka">#kafka</tt-tag>
    <tt-tag name="linux">#linux</tt-tag>
    <tt-tag name="ubuntu">#ubuntu</tt-tag>
    <tt-tag name="sysadmin">#sysadmin</tt-tag>
  </tt-tags>

]]></content:encoded></item></channel></rss>