4. Установка на Linux - Internet-Helper/AdGuard-Home GitHub Wiki

1. Установка AdGuard Home

Шаг 1. Команда для установки AdGuard Home

Запустите скрипт установки через SSH консоль, например Termius:

curl -s -S -L https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v

Шаг 2. Запуск и первоначальная настройка AdGuard Home

Перейдите по любой из предложенных ссылок в консоли (лучше всего по адресу внешний IPv4 VPS:3000), после чего Вам откроется страница приветствия:

1

Шаг 3. Выбор интерфейса для веб-интерфейса администрирования AdGuard Home (сайт для управления настройками)

Вариант 1. Локальный интерфейс (рекомендуется)
AdGuard Home будет привязан к интерфейсу 127.0.0.1 и поэтому для входа на сайт для управления настройками требуется проброс порта (как это сделать будет описано ниже).
Установите в разделе Веб-интерфейс администрирования адрес 127.0.0.1 и выберите любой свободный порт в диапазоне от 1000 до 65535.

2

Вариант 2. Внешний интерфейс
AdGuard Home будет доступен как все сайты в интернете и поэтому любой желающий может пробовать подобрать логин и пароль, зная ваш IP-адрес и порт.
Если выберете Все интерфейсы и любой свободный порт в диапазоне от 1000 до 65535, то настоятельно рекомендуется установить чрезвычайно сложный логин и пароль.

3

Шаг 4. Выбор интерфейса для DNS-сервера AdGuard Home

Вариант 1. Локальный интерфейс (рекомендуется)
DNS-сервер будет принимать запросы только от вашего сервера. Оставляем 53 порт. Рекомендуемый вариант.

4

Вариант 2. Внешний интерфейс
DNS-сервер будет доступен для всех устройств в интернете. Оставляем 53 порт.

5

Закончите первоначальную настройку.

Шаг 5. Использование AdGuard Home как главного DNS-сервера

Чтобы перенаправить весь DNS-трафик сервера через AdGuard Home, создадим автоматическую задачу, которая при каждой загрузке системы будет проверять, установлен ли AdGuard Home как основной DNS-сервер в файле resolv.conf. Если будут обнаружены изменения — она восстановит нужные настройки.

Для этого откройте спойлер ниже, скопируйте весь скрипт, вставьте его в консоль и нажмите Enter:


Нажмите, чтобы увидеть скрипт
#!/bin/bash

clear

# Проверка, что скрипт запущен с правами суперпользователя
if [ "$EUID" -ne 0 ]; then
  echo "Ошибка: Скрипт должен быть запущен с правами суперпользователя (через sudo)"
  read -p "Нажмите Enter для завершения..."
  exit 1
fi

# Получаем имя текущего пользователя
CURRENT_USER="${SUDO_USER:-$(whoami)}"
if [ -z "$CURRENT_USER" ] || [ "$CURRENT_USER" = "root" ]; then
  CURRENT_USER="$(logname 2>/dev/null || echo nobody)"
fi
if [ "$CURRENT_USER" = "nobody" ] || [ -z "$CURRENT_USER" ]; then
  echo "Ошибка: Не удалось определить текущего пользователя."
  read -p "Нажмите Enter для завершения..."
  exit 1
fi

# Флаг для отслеживания ошибок
ERROR_FLAG=0

# Функция для определения типа ОС и настройки менеджера пакетов
detect_os() {
  if [ -f /etc/os-release ]; then
      . /etc/os-release
      OS=$ID
      VERSION=$VERSION_ID
  else
      echo "Ошибка: Не удалось определить операционную систему."
      ERROR_FLAG=1
      return 1
  fi

  case $OS in
      debian|ubuntu)
          PKG_MANAGER="apt"
          PKG_UPDATE="apt update -y"
          PKG_INSTALL="apt install -y"
          DNS_PACKAGE="dnsutils"  # Пакет для nslookup/dig
          ;;
      centos|almalinux|rocky|fedora)
          PKG_MANAGER="yum"
          if [ "$OS" = "fedora" ]; then
              PKG_MANAGER="dnf"
          fi
          PKG_UPDATE="$PKG_MANAGER update -y"
          PKG_INSTALL="$PKG_MANAGER install -y"
          DNS_PACKAGE="bind-utils"  # Пакет для nslookup/dig
          ;;
      *)
          echo "Ошибка: Неподдерживаемая операционная система: $OS"
          ERROR_FLAG=1
          return 1
          ;;
  esac
}

# Функция для установки пакета для nslookup/dig
install_dns_tools() {
  if ! command -v nslookup >/dev/null 2>&1 && ! command -v dig >/dev/null 2>&1; then
      echo "Утилиты nslookup или dig не найдены. Устанавливаем пакет $DNS_PACKAGE..."
      $PKG_UPDATE
      $PKG_INSTALL $DNS_PACKAGE
      if [ $? -ne 0 ]; then
          echo "Предупреждение: Не удалось установить пакет $DNS_PACKAGE. Проверка DNS будет выполнена через ping."
          return 1
      fi
  fi
  return 0
}

# Проверка наличия AdGuard Home и файла конфигурации
check_adguard() {
  if systemctl is-active --quiet adguard-home || [ -d "/opt/AdGuardHome" ]; then
      if [ ! -f "/opt/AdGuardHome/AdGuardHome.yaml" ]; then
          echo "AdGuard Home обнаружен, но файл конфигурации /opt/AdGuardHome/AdGuardHome.yaml отсутствует."
          echo "Необходимо выполнить первоначальную настройку AdGuard Home."
          echo "Выполнили первоначальную настройку? Введите '+' если да, '-' если хотите остановить скрипт, и нажмите Enter:"
          read -p "Ваш выбор (+/-): " SETUP_CHOICE
          if [ "$SETUP_CHOICE" = "-" ]; then
              echo "Скрипт прерван. DNS-серверы в системе остались нетронутыми."
              exit 0
          fi
          return 1
      fi
      return 0
  else
      echo "AdGuard Home не установлен."
      echo "Установить AdGuard Home? Введите '+' если да, '-' если хотите остановить установку, и нажмите Enter:"
      read -p "Ваш выбор (+/-): " INSTALL_CHOICE
      if [ "$INSTALL_CHOICE" = "+" ]; then
          echo "Запускаем установку AdGuard Home..."
          curl -s -S -L https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v
          if [ $? -ne 0 ]; then
              echo "Ошибка: Установка AdGuard Home не удалась."
              ERROR_FLAG=1
              return 1
          fi
          # Проверка после установки
          if [ ! -f "/opt/AdGuardHome/AdGuardHome.yaml" ]; then
              echo "Установка завершена!"
              prompt_initial_setup
          fi
          return 0
      else
          echo "Скрипт прерван. DNS-серверы в системе остались нетронутыми."
          exit 0
      fi
  fi
}

# Функция для запроса первоначальной настройки
prompt_initial_setup() {
  while true; do
      echo "Необходимо выполнить первоначальную настройку AdGuard Home."
      echo "Выполнили первоначальную настройку? Введите '+' если да, '-' если хотите остановить скрипт, и нажмите Enter:"
      read -p "Ваш выбор (+/-): " SETUP_CHOICE
      if [ "$SETUP_CHOICE" = "+" ]; then
          if [ ! -f "/opt/AdGuardHome/AdGuardHome.yaml" ]; then
              echo "Файл /opt/AdGuardHome/AdGuardHome.yaml отсутствует, настройка считается незавершенной."
          else
              echo "Файл конфигурации найден. Настройка завершена."
              break
          fi
      elif [ "$SETUP_CHOICE" = "-" ]; then
          echo "Скрипт прерван. DNS-серверы в системе остались нетронутыми."
          exit 0
      else
          echo "Некорректный ввод. Пожалуйста, введите + или -."
      fi
  done
}

# 1. Создание скрипта /opt/set-dns.sh
SET_DNS_SCRIPT="/opt/set-dns.sh"

echo "Делаем AdGuard Home главным DNS-сервером..."

cat > "$SET_DNS_SCRIPT" << 'EOF'
#!/bin/bash

# Путь к resolv.conf
RESOLV_CONF="/etc/resolv.conf"

# Проверка статуса AdGuard Home
if ! systemctl is-active --quiet adguard-home; then
  echo "Ошибка: AdGuard Home не активен. Попытка запустить через systemd..."
  sudo systemctl enable --now adguard-home >/dev/null 2>&1
  if ! systemctl is-active --quiet adguard-home; then
      echo "Не удалось запустить через systemd. Пробуем напрямую..."
      if ! sudo /opt/AdGuardHome/AdGuardHome -s restart; then
          echo "Не удалось запустить AdGuard Home. Используем резервные DNS."
          TEMP_FILE=$(mktemp)
          echo "nameserver 1.1.1.1" > "$TEMP_FILE"
          echo "nameserver 1.0.0.1" >> "$TEMP_FILE"
          echo "nameserver 8.8.8.8" >> "$TEMP_FILE"
          echo "nameserver 8.8.4.4" >> "$TEMP_FILE"
      else
          echo "AdGuard Home успешно запущен напрямую. Устанавливаем DNS на 127.0.0.1"
          TEMP_FILE=$(mktemp)
          echo "nameserver 127.0.0.1" > "$TEMP_FILE"
      fi
  else
      echo "AdGuard Home успешно запущен через systemd. Устанавливаем DNS на 127.0.0.1"
      TEMP_FILE=$(mktemp)
      echo "nameserver 127.0.0.1" > "$TEMP_FILE"
  fi
else
  echo "AdGuard Home уже запущен. Устанавливаем DNS на 127.0.0.1"
  TEMP_FILE=$(mktemp)
  echo "nameserver 127.0.0.1" > "$TEMP_FILE"
fi

# Снимаем атрибут неизменяемости, если он есть
sudo chattr -i "$RESOLV_CONF" 2>/dev/null || true

# Проверяем права на запись, изменяем владельца, если необходимо
if [ -f "$RESOLV_CONF" ] && [ ! -w "$RESOLV_CONF" ]; then
  sudo chown "${SUDO_USER:-$(logname 2>/dev/null || echo nobody)}:${SUDO_USER:-$(logname 2>/dev/null || echo nobody)}" "$RESOLV_CONF"
  if [ $? -ne 0 ]; then
      echo "Ошибка: Не удалось изменить владельца $RESOLV_CONF."
      echo "Текущий владелец: $(ls -l $RESOLV_CONF)"
      echo "Атрибуты файла: $(lsattr $RESOLV_CONF 2>/dev/null || echo 'lsattr не поддерживается')"
      exit 1
  fi
fi

# Копируем новый resolv.conf
sudo cp "$TEMP_FILE" "$RESOLV_CONF"
sudo chmod 644 "$RESOLV_CONF"

# Делаем файл неизменяемым
sudo chattr +i "$RESOLV_CONF"

# Удаляем временный файл
rm "$TEMP_FILE"

# Проверка результата
if ! grep -q "nameserver" "$RESOLV_CONF"; then
  echo "Ошибка: настройка DNS не удалась, проверьте $RESOLV_CONF"
  exit 1
fi
EOF

# Установка прав на скрипт
chmod +x "$SET_DNS_SCRIPT"

# 2. Создание systemd-сервиса /etc/systemd/system/set-dns.service
SERVICE_FILE="/etc/systemd/system/set-dns.service"

cat > "$SERVICE_FILE" << 'EOF'
[Unit]
Description=Set DNS servers to 127.0.0.1 after boot
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
ExecStart=/opt/set-dns.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF

# 3. Функция для установки атрибута неизменяемости и проверки владельца для /etc/resolv.conf
configure_resolv_conf() {
  RESOLV_CONF="/etc/resolv.conf"

  # Пытаемся снять атрибут неизменяемости
  sudo chattr -i "$RESOLV_CONF" 2>/dev/null || true

  # Проверка, является ли файловая система только для чтения
  if ! touch "$RESOLV_CONF" 2>/dev/null; then
      echo "Ошибка: Файловая система для $RESOLV_CONF только для чтения или доступ ограничен."
      return 1
  fi

  if [ -f "$RESOLV_CONF" ]; then
      if [ ! -w "$RESOLV_CONF" ]; then
          echo "Нет прав на запись для $RESOLV_CONF. Изменяем владельца на $CURRENT_USER:$CURRENT_USER..."
          chown "$CURRENT_USER:$CURRENT_USER" "$RESOLV_CONF"
          if [ $? -ne 0 ]; then
              echo "Ошибка: Не удалось изменить владельца $RESOLV_CONF."
              echo "Текущий владелец: $(ls -l $RESOLV_CONF)"
              echo "Атрибуты файла: $(lsattr $RESOLV_CONF 2>/dev/null || echo 'lsattr не поддерживается')"
              return 1
          fi
      fi
      chattr -i "$RESOLV_CONF" 2>/dev/null || true
      echo "nameserver 127.0.0.1" > "$RESOLV_CONF"
      chmod 644 "$RESOLV_CONF"
      chattr +i "$RESOLV_CONF"
  else
      echo "Файл $RESOLV_CONF не существует, создаём его..."
      echo "nameserver 127.0.0.1" > "$RESOLV_CONF"
      chmod 644 "$RESOLV_CONF"
      chown "$CURRENT_USER:$CURRENT_USER" "$RESOLV_CONF" 2>/dev/null || true
      chattr +i "$RESOLV_CONF"
  fi
}

# Функция для проверки DNS
check_dns() {
  if command -v nslookup >/dev/null 2>&1; then
      echo "Проверка DNS с помощью nslookup..."
      nslookup ya.ru
      if [ $? -eq 0 ]; then
          echo "DNS работает исправно. Можете приступать к дальнейшей настройке AdGuard Home."
      else
          echo "Ошибка: DNS-запрос не выполнен."
          ERROR_FLAG=1
      fi
  elif command -v dig >/dev/null 2>&1; then
      echo "Проверка DNS с помощью dig..."
      dig +short ya.ru
      if [ $? -eq 0 ]; then
          echo "DNS работает исправно. Можете приступать к дальнейшей настройке AdGuard Home."
      else
          echo "Ошибка: DNS-запрос не выполнен."
          ERROR_FLAG=1
      fi
  else
      echo "Проверка DNS с помощью ping (nslookup и dig недоступны)..."
      ping -c 1 ya.ru >/dev/null 2>&1
      if [ $? -eq 0 ]; then
          echo "DNS работает исправно (ping ya.ru успешен). Можете приступать к дальнейшей настройке AdGuard Home."
      else
          echo "Ошибка: DNS-запрос не выполнен (ping ya.ru не удался)."
          ERROR_FLAG=1
      fi
  fi
}

# Основной процесс
detect_os
if [ $ERROR_FLAG -eq 0 ]; then
  # Установка пакета для nslookup/dig
  install_dns_tools
  check_adguard
  if [ $? -eq 0 ]; then
      if ! configure_resolv_conf; then
          echo "Скрипт остановлен из-за ошибки в настройке /etc/resolv.conf."
          ERROR_FLAG=1
      fi
  else
      ERROR_FLAG=1
  fi
fi

# 4. Перезагрузка конфигурации systemd и включение сервиса (только если нет ошибок)
if [ $ERROR_FLAG -eq 0 ]; then
  systemctl daemon-reload
  systemctl enable set-dns.service

  clear
  echo "Содержимое /etc/resolv.conf:"
  cat /etc/resolv.conf
  echo "Если сверху 127.0.0.1 — значит теперь главный AdGuard Home!"
  echo ""
  check_dns
else
  echo "Настройка не завершена..."
fi

Теперь перейдите в настройки AdGuard Home, если выбрали Все интерфейсы в обоих параметрах.

Шаг 6. Проброс порта к серверу (если выбрали локальный интерфейс)

Откройте Termius (подразумевается, что у Вас есть профиль вашего сервера в «Hosts»):

  1. Перейдите в Port Forwarding
  2. Нажмите на NEW FORWARDING
  3. Нажмите на Continue

1

  1. Введите порт, который Вы выбрали для Веб-интерфейс администрирования. Bind address сам заполнится.
  2. Нажмите на Continue

2

Нажмите на Select a host

3

Выберите Ваш сервер.

4

  1. Введите в Destination address этот адрес - 127.0.0.1
  2. Введите в Destination port number тот порт, который Вы выбрали для Веб-интерфейс администрирования
  3. Нажмите на Continue

5

  1. Придумайте понятное Вам название
  2. Нажмите на Done

6

Наведите на только что созданный проброс порта и нажмите на него два раза либо используйте клавишу Enter, после чего окошко станет зелёным

7

Теперь если Вы перейдите по локальному адресу с портом, выбранным Вами ранее (например, 127.0.0.1:8888), то откроется окно для входа в веб панель

8

Шаг 7. Перейти к настройке AdGuard Home.

⚠️ **GitHub.com Fallback** ⚠️