У меня есть частный сервер на AWS, на котором нет публично открытых входящих портов. Единственный открытый порт - это SSH, и он доступен только с других компьютеров в той же подсети.
Эта машина читает файлы с S3 по сети. Недавно он перестал работать, потому что время сервера сдвинулось более чем на 15 минут и запросы к S3 были отклонены:
<Code>RequestTimeTooSkewed</Code>
<Message>
The difference between the request time and the current time
is too large.
</Message>
<MaxAllowedSkewMilliseconds>900000</MaxAllowedSkewMilliseconds>
Простое решение - установить ntp
, но для этого необходимо открыть порт 123 UDP. Поскольку UDP не имеет состояния, входящие и исходящие порты должны быть открыты.
Как я могу автоматически обновлять системное время, используя только TCP-соединения, инициированные моим сервером? Есть ли стандартный демон на основе TCP, такой как NTP? Меня не волнует, что это не так точно: допустим даже перекос до 10 минут.
Вот как группы безопасности настроены:
Входящий
Type Protocol Port Range Source
SSH TCP 22 172.31.0.0/16
Исходящий
Type Protocol Port range Destination
All traffic All All 0.0.0.0/0
Это сетевой ACL для подсети - просто ACL по умолчанию:
Входящий
Rule # Type Protocol Port Range Source Allow / Deny
100 ALL Traffic ALL ALL 0.0.0.0/0 ALLOW
* ALL Traffic ALL ALL 0.0.0.0/0 DENY
Исходящий
Rule # Type Protocol Port Range Destination Allow / Deny
100 ALL Traffic ALL ALL 0.0.0.0/0 ALLOW
* ALL Traffic ALL ALL 0.0.0.0/0 DENY
Хорошо, теперь он работает без каких-либо специальных групп безопасности, как и предсказал @Tim. Думаю, я просто не тестировал как следует:
ntpdate
не использует серверы в /etc/ntp.conf
, значит, он сообщал об ошибке:
нельзя использовать серверы, закрытие
ntpd
не пытается обновить часы сразу после запуска; он ждет минуту или около того.
Вместо этого тестирование с ntpdate-debian
, и без открытого порта 123 в группе безопасности работает нормально; и ntpd
обновляет время правильно, если я позволяю ему работать некоторое время.
Согласно Документация AWS вы можете открыть UDP: 123 только в исходящей группе безопасности. Поскольку группы безопасности являются ответами с отслеживанием состояния, они будут возвращаться вам, но никто за пределами вашего VPC не сможет инициировать соединение.
Вы, конечно, потребуете, чтобы NACL были открыты в обоих направлениях для этого порта.
Обновить Вы должны прочитать о AWS Безопасность, особенно группы безопасности и NACL.
NACL - это сетевой ACL. Это брандмауэр, который находится за пределами вашего экземпляра и позволяет трафику достигать вашего экземпляра, только если у вас открыты порты. По умолчанию все входящие и исходящие порты открыты, но вы можете настроить их так, как вам нравится. NACL не имеют состояния, поэтому вам нужно открывать порты в каждом направлении. Не забывайте об эфемерных портах.
С другой стороны, группы безопасности обеспечивают соблюдение сетевых правил на уровне гипервизора. Они сохраняют состояние, поэтому, если вы разрешаете исходящий порт, ответ автоматически возвращается в экземпляр.
Теоретически NACL немного снижают нагрузку на хост-сервер, поскольку предотвращают попадание трафика на сетевой интерфейс. Поскольку вы контролируете только небольшую часть сервера, это, вероятно, не имеет большого значения.
Обновление 1 декабря 2017 г.
AWS имеют объявил то Сервис AWS Time Sync. Короче говоря, они предоставляют серверы в каждом центре обработки данных, чтобы гарантировать точное время сервера.
В документации AWS говорится, что нужно использовать программное обеспечение Chrony, а не NTP, но оба сервиса - NTP. Нет смысла копировать инструкции AWS в этот пост, поскольку они могут измениться в будущем, а документация AWS превосходна.
Использование NTPD
Вместо установки Chrony я просто добавил следующее в свой /etc/ntp.conf, чтобы попытаться заставить NTP использовать новый сервер AWS NTP
server 169.254.169.123 prefer iburst
Я также удостоверился, что ни один из других операторов сервера не был настроен как «предпочитают».
Если вы не против запуска задания cron на другом компьютере с точным временем, вы всегда можете его автоматически обновлять дату через SSH. Если у вас есть разрешения SSH на другом сервере с точной датой, вы можете сделать это и другим способом.