4. Установка на Linux - Internet-Helper/AdGuard-Home GitHub Wiki
Запустите скрипт установки через SSH консоль, например Termius:
curl -s -S -L https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v
Перейдите по любой из предложенных ссылок в консоли (лучше всего по адресу внешний IPv4 VPS:3000
), после чего Вам откроется страница приветствия:
Шаг 3. Выбор интерфейса для веб-интерфейса администрирования AdGuard Home (сайт для управления настройками)
Вариант 1. Локальный интерфейс (рекомендуется)
AdGuard Home будет привязан к интерфейсу 127.0.0.1
и поэтому для входа на сайт для управления настройками требуется проброс порта (как это сделать будет описано ниже).
Установите в разделе Веб-интерфейс администрирования
адрес 127.0.0.1
и выберите любой свободный порт в диапазоне от 1000
до 65535
.
Вариант 2. Внешний интерфейс
AdGuard Home будет доступен как все сайты в интернете и поэтому любой желающий может пробовать подобрать логин и пароль, зная ваш IP-адрес и порт.
Если выберете Все интерфейсы
и любой свободный порт в диапазоне от 1000
до 65535
, то настоятельно рекомендуется установить чрезвычайно сложный логин и пароль.
Вариант 1. Локальный интерфейс (рекомендуется)
DNS-сервер будет принимать запросы только от вашего сервера. Оставляем 53 порт. Рекомендуемый вариант.
Вариант 2. Внешний интерфейс
DNS-сервер будет доступен для всех устройств в интернете. Оставляем 53 порт.
Закончите первоначальную настройку.
Чтобы перенаправить весь 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, если выбрали Все интерфейсы
в обоих параметрах.
Откройте Termius (подразумевается, что у Вас есть профиль вашего сервера в «Hosts»):
- Перейдите в
Port Forwarding
- Нажмите на
NEW FORWARDING
- Нажмите на
Continue
- Введите порт, который Вы выбрали для
Веб-интерфейс администрирования
.Bind address
сам заполнится. - Нажмите на
Continue
Нажмите на Select a host
Выберите Ваш сервер.
- Введите в
Destination address
этот адрес -127.0.0.1
- Введите в
Destination port number
тот порт, который Вы выбрали дляВеб-интерфейс администрирования
- Нажмите на
Continue
- Придумайте понятное Вам название
- Нажмите на
Done
Наведите на только что созданный проброс порта и нажмите на него два раза либо используйте клавишу Enter, после чего окошко станет зелёным
Теперь если Вы перейдите по локальному адресу с портом, выбранным Вами ранее (например, 127.0.0.1:8888
), то откроется окно для входа в веб панель