生产日期2023-06-09,有效期不确定
本次任务的小目标是在CentOS 7服务器上搭建一个NTP服务器,并且增加访问限制。
NTP版本是4.2,划重点,4.2,如下:
[root@ir44x8fy272g ~]# ntpdate -v
7 Jun 16:11:35 ntpdate[24588]: ntpdate 4.2.6p5@1.2349-o Tue Jun 23 15:38:19 UTC 2020 (1)
7 Jun 16:11:35 ntpdate[24588]: no servers can be used, exiting
问题1 – how to install ntpd server on centos
这个简单,我应该能行。我直接root用户登录的,所以指令前面都没有加sudo
yum update
yum install ntp
systemctl start ntpd
systemctl enable ntpd
systemctl status ntpd
用ntpdate,验收一下阶段性成果。成功!!!
[root@ir44x8fy272g ~]# ntpdate -u ntp1.aliyun.com
7 Jun 18:24:57 ntpdate[25092]: adjust time server 120.25.115.20 offset 0.000846 sec
[root@ir44x8fy272g ~]# ntpdate -u 127.0.0.1
7 Jun 18:25:09 ntpdate[25106]: adjust time server 127.0.0.1 offset -0.000001 sec
别高兴太早,试一下外网IP能不能访问???
[root@ir44x8fy272g ~]# ntpdate -u server_public_ip
7 Jun 18:27:16 ntpdate[25150]: no server suitable for synchronization found
当然不行,第2个问题来了
问题2 – which port does ntpd use
123,看起来靠谱,又好像不那么靠谱,这么随意的吗???还有个有用的信息,UDP和TCP都要用。
vim /etc/sysconfig/iptables
# 添加如下2行
-A INPUT -p tcp -m state --state NEW -m tcp --dport 123 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 123 -j ACCEPT
保存退出,systemctl restart iptables。云服务器ECS的安全组里要添加规则放行123端口。我这里是阿里云,截图如下
再来一次,可以外网访问了
[root@ir44x8fy272g ~]# ntpdate -u server_public_ip
7 Jun 18:51:00 ntpdate[25226]: adjust time server 127.0.0.1 offset 0.000004 sec
问题3 – add password for ntpd
提问有点随意,但她是懂我的,不是她,是它!!!划重点,是它!!!
答案有点长,虽然问题很简单,慢慢消化吧。vim /etc/ntp.conf,很长,似懂又非懂。求知欲爆棚的我,把配置文件内容粘给了ChatGPT,它竟然来了一招斗转星移。
略去一万字,把上个问题的答案重复了一遍,好一招转移话题。不过只有一行的话,它倒是解释的很清楚。
ntp-keygen的冒险
执行ntp-keygen,报错了。
[root@ir44x8fy272g ~]# ntp-keygen
Using OpenSSL version OpenSSL 1.0.2k-fips 26 Jan 2017
Using host ir44x8fy272g group ir44x8fy272g
Generating RSA keys (512 bits)...
RSA 0 6 14 1 11 24 3 1 2
Generating new host file and link
ntpkey_host_ir44x8fy272g->ntpkey_RSAhost_ir44x8fy272g.3895132229
Using host key as sign key
Generating new certificate ir44x8fy272g RSA-MD5
X509v3 Basic Constraints: critical,CA:TRUE
X509v3 Key Usage: digitalSignature,keyCertSign
Verify RSA-MD5 certificate fails
error:0D0C50A1:asn1 encoding routines:ASN1_item_verify:unknown message digest algorithm
错误信息粘给ChatGPT,看来它不太擅长这些太具体的错误信息,接下来的对话就都是废话了,又臭又长,并没有什么卵用。
外事不决问Google
搜索并打开数个链接开始逐一查阅,试错,折腾。直到发现我好像渐渐能确认我的操作都没有问题啊,但是访问限制还是没有生效啊。
关于NTP Authentication
贴一个有用的链接,大概的意思就是:
- Symmetric Keys不安全,要交换密钥
- autokey也没有想的那么安全啦,已经被人给diss啦
- 大家快来用NTS(Network Time Security)吧
NTP Authentication
https://kb.meinbergglobal.com/kb/time_sync/ntp/configuration/ntp_authentication
我绝对,不会被PUA。我的要求并不高,有个密码就很好。不要再折腾NTS了。
关于ntp-keygen
直到我用ntp-keygen -M
生成了密钥文件,cat一下,这不就是我手工编辑的/etc/ntp/keys吗?
1 M f294fa0
我一直纠结这个ntp-keygen失败的问题,干嘛呢!!!用不到嘛,至少配置MD5类型的Symmetric Key用不到,我手工编一下就完事了。最终,从ChatGPT又臭又长的答案,和Google的茫茫链接中,确定了如下的配置
vim /etc/ntp.conf
# add the lines
keys /etc/ntp/keys
trustedkey 1
controlkey 1
requestkey 1
vim /etc/ntp/keys
# add the lines
1 M f294fa0
但是,访问限制还是没有生效。无数的试错和折腾之后,最终,受ChatGPT第1个答案的启发,怀疑到了restrict这个参数上,是不是这个参数auth没有生效。
https://support.ntp.org/Support/AccessRestrictions
# `notrust`
The behavior of `notrust` changed between versions 4.1 and 4.2.
- In 4.1 (and earlier) `notrust` meant "Don't trust this host/subnet for time".
- In 4.2 (and later) `notrust` means "Ignore all NTP packets that are not cryptographically authenticated." This forces remote time servers to authenticate themselves to your (client) `ntpd`. See [ConfiguringAutokey](https://support.ntp.org/Support/ConfiguringAutokey) for information about configuring NTP Authentication.
好吧,notrust
才是最终的答案。
vim /etc/ntp.conf
restrict default kod nomodify notrap nopeer noquery notrust
restrict -6 default kod nomodify notrap nopeer noquery notrust
systemctl restart ntpd
访问限制终于生效了,服务器的配置至此结束
服务端配置小结
- ChatGPT的思路自始至终是对的,细节也是大部分对的,就是限于不同的操作系统啊,NTP版本啊,还有多种的认证方式,还有ChatGPT-3.5只知道2021.9以前的事情,在解决这类逻辑性不强的具体问题上,实操性不强。这么复杂又具体的问题,只能当ChatGPT是个搜索引擎了吧。
- Google搜到的关于NTP Authentication的文章,都是只字不提要加restrict的参数notrust,直到去了解restrict的时候,看到了notrust才会去试一下。
- 搜索引擎的结果,再加一个ChatGPT式的总结,会极大的提升解决问题的效率
- ChatGPT是真的会编,之前问它查找些开源项目啊,连github仓库地址它都能编出来,全是些子虚乌有的项目!!!
数据不是最新最及时的,以及太能编,ChatGPT-4.0我还没有用过,有可能解决吗?
试错,折腾,苦日子什么时候才能到头
讲真,给NTP服务加个密码这样的事情,在2023年的现在,还要这样折腾才能有个答案吗?操作系统环境繁杂多样,版本有新有旧。轮子的版本和功能也在不断的迭代和更新,学着使用轮子,然后确认轮子是不是在以我们预期的方式工作,已然变的十分复杂。在互联网这个黑暗森林里,我们不得不小心翼翼,如履薄冰。
客户端使用ntpdate同步系统时间
出于各种各样的原因,我禁用了系统的NTP服务, 然后在我的脚本中手工调用ntpdate来同步系统时间。ntpdate同步的最终指令如下: “`
ntpdate -a 1 -k /etc/ntp/keys -u server_public_ip
得到这条指令的过程又是不断的试错,遇到问题,解决问题。把过程中有用的东西,简述如下:
- 既然是直接调用ntpdate,那密钥肯定要直接传给它才行,先看ntpdate有哪些参数吧,参考这个链接ntpdate(8) – Linux man page。不得不说,知道正确答案之后这几个参数确实很简单,试错的时候确实也很茫然
- 这中间有个小坑,MD5密钥的长度不能超过20,否则提示
ntpdate[5387]: authreadkeys: invalid hex digit for key 1
。这个是翻阅libntp/authreadkeys.c源代码之后才找到的解决方法。If it is longer than 20 characters, it is a binary string encoded in hex; otherwise, it is a text string of printable ASCII characters.
- 确认来,确认去,觉得没问题了呀,也没报错,就是同步失败。
ntpdate[16026]: no server suitable for synchronization found
。继续看ntpdate参数,看能不能打印一些debug信息,发现-d -v
。debug信息显示receive: authentication failed
,那问题难道在服务端 journalctl -u ntpd -f
,看一下服务器的日志,好吧,我把密钥文件的位置写错了,密钥文件实际是/etc/ntp/keys,我写成了/etc/ntp.keys
至此,大功告成。
轮子够强,我不够强
轮子够强,够好,就是我不会用。用轮子的过程就是4个字,小心翼翼。小心翼翼的测试好不好用,稳不稳定,怎么修改配置以满足需求,怎么确认配置有没有生效,漫长的试错之路。最怕就是不起眼的小问题,藏在某个晦暗的小角落里,不得不小心翼翼。不是轮子的错,那一定是我的错。
- 为啥一定要把系统NTP服务给禁掉,一言难尽;
- 为啥一定要部署自己的NTP服务器,一言难尽;
- 为啥一定要加个哪怕不太安全的Symmetric key authentication,一言难尽。
有兴趣的朋友,欢迎私信交流!!!