Как использовать ntpdate за прокси?

Можно ли использовать ntpdate за HTTP-прокси с аутентификацией? Если это невозможно, есть ли хорошие альтернативы?

11 ответов

Решение

Это похоже на очевидный случай для tlsdate.

 tlsdate: secure parasitic rdate replacement

  tlsdate sets the local clock by securely connecting with TLS to remote
  servers and extracting the remote time out of the secure handshake. Unlike
  ntpdate, tlsdate uses TCP, for instance connecting to a remote HTTPS or TLS
  enabled service, and provides some protection against adversaries that try
  to feed you malicious time information.

Я не думаю, что когда-либо видел столько рекомендаций по использованию неанизированных данных из Интернета в качестве аргумента для вызова sudo.

Github: https://github.com/ioerror/tlsdate

Расширяя ответ от carveone:

sudo date -s "$(wget -S  "http://www.google.com/" 2>&1 | grep -E '^[[:space:]]*[dD]ate:' | sed 's/^[[:space:]]*[dD]ate:[[:space:]]*//' | head -1l | awk '{print $1, $3, $2,  $5 ,"GMT", $4 }' | sed 's/,//')"

Один лайнер

Предполагая переменную среды http_proxy уже установлено:

sudo date -s "$(curl -sD - google.com | grep '^Date:' | cut -d' ' -f3-6)Z"

Чтобы быть уверенным, что передается sudo date -sПросто запустите curl ... часть команды, чтобы увидеть ее вывод:

curl -sD - google.com | grep '^Date:' | cut -d' ' -f3-6

Или более безопасная версия, которая проверяет выходную длину curl:

date_utc=$(curl -sD - google.com | grep '^Date:' | cut -d' ' -f3-6)

[ -n "$date_utc" ] && sudo date -s "${date_utc}Z"

Заметки

На всякий случай, некоторые варианты могут быть необходимы для curl:

  • curl -x $proxy

    явно установить прокси-сервер для использования, требуется, если http_proxy не установлен, по умолчанию протокол http и порт 1080( ручной).

  • curl -H 'Cache-Control: no-cache'

    явное отключение кэширования, особенно при использовании в задании cron и / или за прокси-сервером.

Альтернативная форма, протестированная с RHEL 6, которая использует опцию '-u' до даты вместо добавления "Z" к выводу:

sudo date -u --set="$(curl -H 'Cache-Control: no-cache' -sD - http://google.com |grep '^Date:' |cut -d' ' -f3-6)"

КСТАТИ, google.com предпочтительнее www.google.comпотому что первое приводит к 301 перенаправить ответ, который намного меньше (569 против 20k+ символы), но все же хорошо использовать.

Служба NTP использует протокол UDP для синхронизации времени. Так что HTTP/TCP прокси может не работать для него. Альтернатива принятому ответу, есть хороший инструмент htpdate для синхронизации времени за прокси.

Пример работы cron:

* 3 * * * /usr/bin/htpdate -s -P <PROXY_HOST>:<PROXY__PORT> www.linux.org www.freebsd.org

Если это чисто HTTP-прокси, он использует порт 80, поэтому основной ответ - нет. NTP использует UDP-порт 123. Если это более общий прокси-сервер, обслуживающий все порты, то, возможно,.

Есть некоторые программы, которые делают NTP через HTTP. Я не использую Linux, но это может сделать это:

http://www.rkeene.org/oss/htp/ (все еще не уверен, будет ли это также выполнять аутентификацию).

Я не мог найти один для Windows, но я отправлю обратно, если я сделаю.

Быстрое и грязное решение для людей, использующих прокси-сервер http:

Мое местоположение - GMT+4, я могу узнать текущее время с сервера timeapi с помощью URL http://www.timeapi.org/utc/in+four+hours, для получения дополнительной информации просьба проверить сайт на предмет вашего местоположения.

Для установки даты и времени я делаю:

time sudo date $(wget -O - "http://www.timeapi.org/utc/in+four+hours" 2>/dev/null | sed s/[-T:+]/\ /g | awk '{print $2,$3,$4,$5,".",$6}' | tr -d " " )

Вы можете повторить команду, если начальная команда 'time' сообщает о высоком значении...

Хотя ntp over http уже упоминалось, я удивлен, что никто не упомянул про маленькую полезную утилиту htpdate как доступно на http://www.vervest.org/htp/. В отличие от альтернатив, htpdate является частью репозиториев по умолчанию Debian и Ubuntu и может быть установлен с помощью apt-get,

Его можно запускать как обычной командой, так и без вывода сообщений в режиме демона.

Предполагая, что http_proxy переменная окружения установлена:

wget -S --spider "http://www.google.com/" 2>&1 | grep -E '^[[:space:]]*[dD]ate:' | sed 's/^[[:space:]]*[dD]ate:[[:space:]]*//'

Или использовать curl -I --proxy="..." "http://www.google.com/"

В конце концов, если у сайта Google нет установленного времени, надежды нет.

Расширение на /questions/44205/kak-ispolzovat-ntpdate-za-proksi/44225#44225

Предположим, вы в Берлине (Германия).

Тогда используйте это:

sudo TZ=Europe/Berlin date -s "$(TZ=Europe/Berlin date --date='TZ="UTC" '"$(wget -S  "http://www.google.com/" 2>&1 | grep -E '^[[:space:]]*[dD]ate:' | sed 's/^[[:space:]]*[dD]ate:[[:space:]]*//' | head -1l | awk '{print $1, $3, $2,  $5 , $6, $4 }' | sed 's/,//')")"

Для полностью работающей предварительно запеченной реализации превосходного ответа @ryenus, проверьте set_system_clock_from_google.sh.

Я делаю это на raspi, который находится в частной локальной сети без доступа к сети, без настоящего прокси, но там, где у меня есть другое надежное подключение к Интернету в корпоративной сети, к которому я могу, по крайней мере, подключиться по ssh из raspi.

Есть три шага «настройки», а затем еще пара, чтобы установить время:

  1. У меня есть raspi, позволяющий временно получить доступ к Интернету (я использовал личную точку доступа на своем телефоне)

    • находясь онлайн:sudo apt install proxychains
    • после завершения этого процесса вы можете снова отключить его и снова подключить к изолированной сети.
  2. echo 'socks5 127.0.0.1 17471' | sudo tee -a /etc/proxychains.conf

  3. Сделайте себе удобный скрипт для ssh-подключения:

      cat << EOF > startproxy.sh
#!/bin/bash

F=~/.ssh/ssh_socket_for_proxyhains
if [ -f $F ]; then
        killall ssh
        rm $F
fi
ssh -f -NT -M -S ~/.ssh/ssh_socket_for_proxychains -D 17471 user@server
EOF
chmod +x startproxy.sh
  • если ты изменишься17471, измените его в обоих местах.
  • необходимо сделать вышеперечисленное только один раз, остальные шаги можно повторить
  1. Начни это:./startproxy.sh.

    • Должно показаться, что он тихо умер. Но теперь ssh должен появиться вps xили так.
  2. проверьте, работают ли проксичейны, например:sudo proxychains apt update(да, вы тоже можете обновлять и устанавливать подобные вещи).

Затем проверьте, можете ли вы получить чистую дату UTC с помощью:

sudo proxychains 2>/dev/null curl -H'Cache-Control:no-cache' -sI google.com | grep '^Date:' | cut -d' ' -f3 -6 | tail -n 1

Предполагая, что это выдает что-то разумное, установите дату с помощью:

      sudo date -s "$(sudo proxychains 2>/dev/null curl -H'Cache-Control:no-cache' -sI google.com | grep '^Date:' | cut -d' ' -f3-6 | tail -n 1 )Z"
  • Обратите внимание на дополнительныеZв конце: В противном случае ваша дата, вероятно, будет установлена ​​неправильно, поскольку это говоритdate -sчто это время UTC, в противном случае он будет считать, что это местное время.

  • Вероятно, вам следует завершить этот ssh-процесс, когда вы закончите, каждый раз, когда вы его используете.

  • Вам не нужноserverбыть запущенным прокси - просто иметь возможность достучаться по ssh и самому иметь доступ в интернет.

  • Все вышеперечисленное можно сделать подключившись к распи по ssh откуда-то еще, разницы нет. Возможно, вы даже подключились к серверу по ssh, а оттуда к raspi.

Другие вопросы по тегам