Назад в прошлое, или ntp сервер неточного времени

Всем известно, что для получения точного времени в ОС, необходимо, чтобы она синхронизировалась хотя бы с одним ntp сервером. А что делать, если точное время нужно, но не совсем. К примеру, отличающееся от текущего на какую-то дельту. В любую сторону. К примеру, на 10 лет назад, или вперед…

Ну и договоримся, что под точным временем не будем понимать не доли микросекунд,а хотя бы до секунды. Поехали!

Когда возникла такая задача у меня (иногда знаете-ли надо сетевку с фейковым маком сделать, или в прошлое слетать), я начал было смотреть описание протокола ntp и решал уже делать свой сервер, с возможностью задавать смещение. По сути — вроде как ничего сложного, берем локальное время, даем смещение, отдаем желающим. Но для начала не мешало бы поглядеть аналогичные исходники, и готовые модули. И почти сразу нашлась perl реализация в виде модуля Net::SNTP::Server.

Ну грех не воспользоваться данным решением. Форкнул, назвал Net::SNTP::BackToTheFutureServer, добавил дельту и готово 😉

Итак, вот пример подключения модуля (+ файл модуля внизу) и запуск сервера, теперь возвращается время с дельтой 5 лет назад от текущего. Смещение задается в секундах, отрицательное число назад, положительное вперед.

use strict;
use warnings;
use utf8;
use lib '/local/path/to/Net/SNTP/';
use Net::SNTP::BackToTheFutureServer qw(basicFakeSNTPSetup);

sub IsLeapYear {
my $year = shift;
return 365 if $year % 4;
return 366 if $year % 100;
return 365 if $year % 400;
return 366;
}

my $year = ( ( (localtime)[5] ) + 1900 );

my $delta = ( 60 * 60 * 24 * IsLeapYear($year) * 5 ) * (-1); # five years ago

my ( $error, $hashRefOutput ) =
basicFakeSNTPSetup( $delta, ( -ip => "192.168.111.111", -port => 12345 ) );

print "Error: $error\n" if ($error);

Исходник самого модуля BackToTheFutureServer.pm

Сервер поднимается на 192.168.111.111 и порту 12345, что отлично от стандартного 123.

Учтите, что если вы планируете пользоваться для синхронизации штатный ntpd или просто ntpdate, то там нельзя явно задать порт. Для этого вам надо поправить файл /etc/services , то место где указано соотношение портов для службы ntp.