家里的电视盒子,使用的是 Google 的时间同步服务器,自然会有无法同步时间的问题。偏离当前时间太多时, HTTPS 的证书会被视为“尚未生效”或“已过期”,从而导致访问网络服务故障。
安卓无法直接在图形界面上设置 NTP 服务器,所以以前是靠 adb 设置成阿里云的 NTP(网络时间协议)服务器解决。但用了一段时间以后又出现了无法时间同步问题,于是干脆把 NTP 请求劫持到路由器的 NTP 服务上来解决问题。
以下步骤需要基于 nftables 的 fw4 防火墙,所以适用于 版本 22.03 以后的 OpenWRT。当然有些固件编译者为了兼容旧插件,给新版本 OpenWRT 缝合上了 fw3 防火墙,我的建议是别用这类固件。
详细步骤:
-
开启路由器 NTP 服务
登录到 OpenWRT 路由器的 LuCI Web 界面,导航到 系统 -> 系统 -> 时间同步。
勾选作为 NTP 服务器提供服务
,点击保存并应用
。 -
备份现有配置文件(可选但推荐)
在进行任何修改之前,建议备份防火墙配置文件,以防意外发生。通过 SSH 连接到 OpenWRT 路由器,然后执行以下命令:1
cp /etc/config/firewall /etc/config/firewall.bak
-
编辑防火墙配置文件
使用文本编辑器(如vi
或nano
)打开防火墙主配置文件:1
vi /etc/config/firewall
或者
1
nano /etc/config/firewall
-
添加
include
配置
在文件的结尾部分,添加一个include
配置,指向一个单独的 NTP 劫持规则文件。这样做可以使配置更清晰,便于管理。1 2 3 4 5 6
config include option type 'nftables' option path '/opt/etc/ntp_dnat.nft' option position 'chain-post' option chain 'dstnat' option enabled '1'
option type 'nftables'
: 指定规则类型为 nftables。option path '/opt/etc/ntp_dnat.nft'
: 指定包含具体 NTP 劫持规则的文件路径。可以根据需要修改此路径。option position 'chain-post'
: 指定规则的应用位置,chain-post
表示在数据包经过目标 NAT(DNAT)链后应用。option chain 'dstnat'
: 指定规则应用于dstnat
链。option enabled '1'
: 启用此 include 配置。
-
创建并编辑 NTP 劫持规则文件
根据上一步的option path
,创建并编辑/opt/etc/ntp_dnat.nft
文件:1
vi /opt/etc/ntp_dnat.nft
或者
1
nano /opt/etc/ntp_dnat.nft
在该文件中添加以下规则:
1
ip saddr 192.168.6.192 udp dport 123 iifname "br-lan" dnat to 192.168.6.1:123
ip saddr 192.168.6.192
: 指定源 IP 地址为电视盒子的 IP 地址(根据实际情况修改)。udp dport 123
: 指定协议为 UDP,目标端口为 123(NTP 默认端口)。iifname "br-lan"
: 指定数据包的入口接口为br-lan
(局域网接口,根据实际情况修改)。dnat to 192.168.6.1:123
: 将匹配的数据包的目标地址和端口重定向到指定的 NTP 服务器 IP 地址和端口(这里以 OpenWRT 路由器自身 IP192.168.6.1
为例)。
-
重启防火墙服务
为了使新的防火墙规则生效,需要重启防火墙服务:1
service firewall restart
通过以上步骤配置 OpenWRT 防火墙,就可以解决电视盒子因 NTP 请求不通导致的时间同步问题。