我在 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
,但它需要打开 UDP 端口 123。由于 UDP 是无状态的,因此入站和出站端口都必须打开。
如何仅使用服务器发起的 TCP 连接自动更新系统时间?是否有像 NTP 这样的基于 TCP 的标准守护程序?我不在乎它是否不那么精确:即使偏差最多 10 分钟也是可以接受的。
编辑于 2017 年 6 月 2 日
这就是安全组设置如下:
入站
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
编辑 2017 年 6 月 2 日 #2
好吧,现在它无需任何特殊安全组就可以工作,正如@Tim所预测的那样。我想我只是没有正确测试它:
ntpdate
不使用中的服务器/etc/ntp.conf
,因此报告错误:没有可以使用的服务器,退出
ntpd
不会在启动时立即尝试更新时钟;它会等待一分钟左右。
进行测试ntpdate-debian
,并且不在安全组中打开端口 123,都可以正常工作;并且ntpd
如果我让它运行一段时间,就可以正确更新时间。
答案1
根据AWS 文档您只能在安全组中打开 UDP:123 出站。由于安全组是有状态的,因此回复将返回给您,但您的 VPC 之外的任何人都无法发起连接。
当然,您需要在该端口的两个方向上打开 NACL。
更新 你应该阅读AWS 安全,特别是安全组和 NACL。
NACL 是网络 ACL。这是一个位于实例外部的防火墙,仅当您打开端口时才允许流量到达您的实例。默认情况下,所有入站和出站端口都是打开的,但您可以按照自己喜欢的方式进行配置。NACL 是无状态的,因此您需要在每个方向打开端口。不要忘记临时端口。
另一方面,安全组在虚拟机管理程序级别强制执行网络规则。它们是有状态的,因此如果您允许传出端口,则响应将自动返回到实例。
理论上,NACL 可以稍微减少主机服务器负载,因为它们可以防止流量到达网络接口。由于您只控制服务器的一小部分,因此这可能没有太大区别。
2017 年 12 月 1 日更新
AWS 有宣布这AWS 时间同步服务。简而言之,他们在每个数据中心内提供服务器,以确保服务器时间的准确性。
AWS 文档说要使用 Chrony 软件,而不是 NTP,但两者都是 NTP 服务。我没有必要将 AWS 说明复制到这篇文章中,因为它们将来可能会发生变化,而且 AWS 文档非常出色。
使用 NTPD
我没有安装 Chrony,而是简单地将以下内容添加到我的 /etc/ntp.conf 中,以尝试让 NTP 使用新的 AWS NTP 服务器
server 169.254.169.123 prefer iburst
我还确保其他服务器语句都没有配置“首选”。
答案2
如果你不反对在另一台具有准确时间的机器上运行 cron 作业,那么你总是可以拥有一个通过 SSH 自动更新日期。如果您在另一台具有准确日期的服务器上拥有 SSH 权限,您也可以通过其他方式执行此操作。