Синхронизация времени в Linux за proxy-сервером
Сегодня мы снова будем решать проблему синхронизации времени на компьютере с Astra Linux в сети, которая находится за proxy-сервером.
После перехода на импортозамещённые ноутбуки столкнулся с одной неприятной особенностью: стоит такому «отечественному» ноутбуку полежать пару дней без работы, как время на нём сбрасывается обратно в 2021 год.
Казалось бы, проблему легко решить при помощи NTP — даже в Astra Linux это не вызывает сложностей. Но возникает довольно парадоксальная ситуация: выход в интернет осуществляется через ESPD, а для доступа необходимо авторизоваться через Госуслуги.
Для одного-двух ноутбуков это не проблема. Но когда одновременно приходится работать более чем с десятью устройствами, ситуация становится не просто неудобной — это уже катастрофически ненормально.
Поэтому для решения этой проблемы был придуман следующий подход. В сети есть proxy-сервер, через который можно выходить в интернет без авторизации через Госуслуги. Однако NTP через прокси не работает. Поэтому мы поступим иначе.
С помощью утилиты curl мы будем получать текущие дату и время с сайта, а затем устанавливать их как системные. Да, точность будет ниже, чем при использовании NTP, но для моих задач достаточно погрешности в пределах ±1–2 минут. Это гораздо удобнее, чем каждый раз авторизовываться через Госуслуги или вручную выставлять время.
Для начала проверим, что curl вообще может работать через наш proxy-сервер. Выполним в терминале следующую команду:
curl -sI -x http://192.168.10.5:8080 mail.ru | grep -i '^Date:'BashВместо http://192.168.10.5:8080 укажите адрес и порт вашего proxy-сервера.
Убедитесь, что выбранный сайт действительно отдаёт время. Обычно крупные порталы без проблем возвращают HTTP-заголовок Date, из которого можно получить актуальные дату и время.
В выводе должно появиться что-то вроде этого, но уже с текущей датой:
Date: Thu, 21 May 2026 05:26:25 GMTBashЕсли обратить внимание, то время указано по Гринвичу (UTC), поэтому часы будут отличаться на значение вашего часового пояса. Это мы учтём далее при установке времени.
Теперь создадим скрипт, который будет получать текущее время с выбранного сайта и устанавливать его как системное. Его можно запускать вручную, но это неудобно. Поэтому дополнительно создадим ещё один скрипт, который будет автоматически запускать синхронизацию времени при подключении к определённой сети, например ESPD. Также напишем установочный скрипт, который автоматически всё настроит.
Для начала создадим папку, в которой будут храниться наши скрипты:
mkdir -p time_scriptBashСоздадим в этой папке скрипт для обновления времени:
nano ./time_script/sync-time-via-proxy.shBashВ открывшемся редакторе nano вставим следующий код:
#!/bin/bash
#
# Скрипт синхронизации времени через HTTP-прокси
# с последующей записью времени в BIOS/RTC
#
# ================= НАСТРОЙКИ =================
# Адрес proxy-сервера
PROXY="http://192.168.10.5:8080"
# Список серверов для получения времени
SERVERS=("mail.ru" "rt.ru" "vniiftri.ru")
# true -> время из заголовка Date считается UTC
# false -> время считается локальным
USE_UTC=true
# Задержка перед запуском скрипта
SLEEP_BEFORE=4
# =============================================
sleep $SLEEP_BEFORE
for server in "${SERVERS[@]}"; do
DATE_HEADER=$(curl -sI --proxy "$PROXY" "https://$server" 2>/dev/null | grep -i '^Date:' | head -n 1)
if [ -n "$DATE_HEADER" ]; then
RAW_DATE=$(echo "$DATE_HEADER" | sed 's/^Date:[[:space:]]*//i')
if [ "$USE_UTC" = "true" ]; then
TIME_TO_SET="$RAW_DATE"
DATE_CMD="date -u -s"
HWCLK_OPT="--utc"
else
TIME_TO_SET="$RAW_DATE"
DATE_CMD="date -s"
HWCLK_OPT="--localtime"
fi
# ==== Устанавливаем системное время ====
sudo $DATE_CMD "$TIME_TO_SET" >/dev/null 2>&1
if [ $? -eq 0 ]; then
CURRENT_TIME=$(date '+%Y-%m-%d %H:%M:%S %Z')
echo "Системное время установлено: $CURRENT_TIME" >&2
logger -t time-sync "Системное время успешно установлено через $server (USE_UTC=$USE_UTC) → $CURRENT_TIME"
# ==== Записываем время в BIOS/RTC ====
if sudo hwclock --systohc $HWCLK_OPT 2>/dev/null; then
echo "Время успешно записано в BIOS/RTC ($HWCLK_OPT)" >&2
logger -t time-sync "Время записано в BIOS/RTC ($HWCLK_OPT)"
else
echo "Ошибка записи в BIOS/RTC" >&2
logger -t time-sync "Ошибка записи времени в BIOS/RTC"
fi
exit 0
else
logger -t time-sync "Ошибка установки системного времени от $server"
fi
fi
done
logger -t time-sync "Не удалось получить заголовок Date ни с одного сервера"
echo "Не удалось синхронизировать время" >&2
exit 1BashУ скрипта есть несколько настроек. В переменной PROXY необходимо указать адрес вашего proxy-сервера. В переменную SERVERS записывается список сайтов, с которых будет получаться текущее время. Адреса указываются в кавычках через пробел. Обязательно убедитесь, что выбранные сайты действительно возвращают HTTP-заголовок Date через наш прокси. Проверить это можно командой, приведённой в начале статьи. Скрипт будет перебирать адреса серверов до тех пор, пока не получит корректный ответ с датой и временем.
Переменная USE_UTC определяет, как будет восприниматься полученное время:true — время считается UTC;false — время считается локальным.
В первом случае система автоматически добавит смещение вашего часового пояса.
Переменная SLEEP_BEFORE задаёт задержку перед запуском скрипта. Это нужно для того, чтобы после включения компьютера успело подняться сетевое подключение.
После получения времени скрипт также записывает его в BIOS/RTC при помощи hwclock. Это важно, потому что Linux и Windows по-разному работают с аппаратными часами:
- Linux по умолчанию считает, что в BIOS хранится время в UTC;
- Windows обычно считает, что в BIOS записано локальное время.
Из-за этого при двойной загрузке могут возникать постоянные смещения времени. Поэтому параметр USE_UTC и настройка hwclock должны соответствовать вашей конфигурации системы.
Теперь создадим скрипт, который будет запускать синхронизацию времени при подключении к сети ESPD:
nano ./time_script/99-sync-timeBashВставляем в него следующий код:
#!/bin/bash
INTERFACE="$1"
ACTION="$2"
if [ "$ACTION" = "up" ] || [ "$ACTION" = "dhcp4-change" ] || [ "$ACTION" = "connectivity-change" ]; then
if [ "$CONNECTION_ID" = "ESPD" ]; then
/usr/local/bin/sync-time-via-proxy.sh &
fi
fiBashТеперь создадим установочный скрипт:
nano ./time_script/install.shBashЗаписываем в него следующий код:
#!/bin/bash
sudo cp -f ./sync-time-via-proxy.sh /usr/local/bin/sync-time-via-proxy.sh
sudo chmod 755 /usr/local/bin/sync-time-via-proxy.sh
sudo cp -f ./99-sync-time /etc/NetworkManager/dispatcher.d/99-sync-time
sudo chmod 755 /etc/NetworkManager/dispatcher.d/99-sync-time
sudo chown root:root /etc/NetworkManager/dispatcher.d/99-sync-time
sudo systemctl restart NetworkManagerBashСделаем установочный скрипт исполняемым:
chmod +x ./time_script/install.shBashДля установки выполните следующую команду:
sudo sh ./time_script/install.shBashТеперь при подключении к сети ESPD система автоматически будет получать текущее время через proxy-сервер и устанавливать его без необходимости ручной авторизации через Госуслуги.













