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