编辑

编辑

我有以下设置:

    NTP
  10.21.3.169
    |
    |
  10.21.3.160 (eth1)
   Linux
  10.0.0.67 (eth0)
    |
    |
  10.0.0.65 (pcn1)
   OpenBSD

这个想法是允许 OpenBSD 机器上的 NTPD 客户端(不是 OpenNTP)通过使用 OpenBSD 机器上的端口转发和 Linux 机器上的 iptables 从 NTP 服务器获取时间。

我目前处于以下情况的阶段:

  • OpenBSD 机器的 pf.conf 已正确设置,因此tcpdump udp在 Linux 机器上运行会显示正确的流量当我运行时ntpd -d -s
  • Linux 机器的 iptables 配置已正确设置,以便ntpd -d -s在 OpenBSD 机器上运行,流量显示tcpdump udp在 NTP 服务器上

但什么也没有返回——另一方向的任何一台机器上都没有任何流量。

我在 Linux 机器上使用的 iptables 规则是:

iptables -A PREROUTING -t nat -i eth0 -p udp --dport 123 -j DNAT --to-destination 10.21.3.169:123
iptables -A FORWARD -t filter -p udp -d 10.21.3.169 --dport 123 -j ACCEPT

在我看来这似乎是正确的。在我开始这项工作之前,IPTables 配置中还有一个“接受状态 RELATED/ESTABLISHED”规则。

我做错了什么? 是不是少了什么? 也许回复需要一些额外的规则?

编辑

我已遵循@gromit 的回答和@MadHatter 的评论中的建议,并添加以下信息:

在 Linux 机器上,运行cat /proc/sys/net/ipv4/ip_forward将得到1。在具有监控功能ntpd -d -s的 OpenBSD 机器上和在 Linux 机器上(同时在不同的终端中)运行将得到以下输出。tcpdumpeth0"eth1

OpenBSD

[root@OpenBSDBox ~]# ntpd -d -s
ntp engine ready
no reply received in time, skipping initial time setting
no reply from 10.0.0.67 received in time, next query 3227s

Linux 盒

tcpdump -n -n -i eth0 port 123

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
10:05:26.448943 IP 10.0.0.65.63822 > 10.0.0.67.123: NTPv4, Client, length 48

tcpdump -n -n -i eth1 port 123

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes
10:05:26.449220 IP 10.21.3.160.63822 > 10.21.3.169.123: NTPv4, Client, length 48
10:05:26.449148 IP 10.21.3.169.123 > 10.21.3.160.63822: NTPv4, Server, length 48

因此看起来 Linux 机器上的路由仍然不正确 —— 回复是从 NTP 机器返回的,但并未发送到 OpenBSD。

为了清楚起见,我现在添加的 iptables 路由如下所示:

iptables -t nat -A PREROUTING -i eth0 -p udp --dport 123 -j DNAT --to-destination 10.21.3.169:123
iptables -t filter -A FORWARD -p udp -d 10.21.3.169 --dport 123 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth1 -p udp --dport 123 -j MASQUERADE
//for the final line, I changed @gromit's suggestion slightly, as the --from option wasn't recognised
iptables -t nat -A POSTROUTING -p udp --sport 123 -j SNAT --to-source 10.21.3.169

省略最后iptables一行似乎对tcpdump输出没有影响。

编辑2

我现在已获得以下 IPtables 条目,并且能够更新 OpenBSD 框上的时钟:

iptables -t nat -A PREROUTING -i eth0 -p udp --dport 123 -j DNAT --to-destination 10.21.3.169:123
iptables -t nat -A PREROUTING -i eth1 -p udp --sport 123 -j DNAT --to-destination 10.0.0.65:123
iptables -t filter -A FORWARD -p udp -d 10.21.3.169 --dport 123 -j ACCEPT
iptables -t filter -A FORWARD -p udp -d 10.0.0.65 --sport 123 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth1 -p udp --dport 123 -j MASQUERADE
iptables -t nat -A POSTROUTING -p udp --sport 123 -j SNAT --to-source 10.21.3.169

但是第二个预路由和第二个过滤命令对我来说似乎有点过头了,因为据我所知,它们会转发 NTP 服务器上端口 123 上的所有 UDP 数据包。我感觉这意味着所有发往 Linux 机器的 NTP 回复(即包括 Linux 机器本身询问时间的情况)都将转发到 OpenBSD 机器。

答案1

看起来您遇到了路由问题。

服务于该时间(3.169)的系统是否知道如何连接到请求系统?

如果没有,请将以下内容添加到 Linux 机器的 iptables 中:

// this rule, redirects the packets for NTP to the NTP server on the host
iptables -t nat -A PREROUTING -i eth0 -p udp --dport 123 -j DNAT --to 10.21.3.169

// this rule make it look for the ntp server as if the linux box is requesting the packets, which
// makes routing not necessary and lets the packet flow back to the linux box
iptables -t nat -A POSTROUTING -o eth1 -p udp --dport 123 -j MASQUERADE

// now the linux box has to check, that the packets coming back are looking like they are from the
// main source
iptables -t nat -A POSTROUTING -i eth1 -p udp --sport 123 -j SNAT --from $ip_the_client_requested_the_time_from

现在看起来 ntp 包正在恢复并且时间已同步。

如果 ntp 守护进程和重定向在同一系统上运行,那么会更容易。然后您可以使用 iptables 的“-j REDIRECT”功能,它可以为您完成所有神奇的事情,但它只在本地主机上起作用。

韩国,

格罗米特

答案2

查找是否是 iptables 规则阻止了请求的最快方法:在右侧表上运行“watch iptables -L -n -v”(使用 -t nat / 任意选项),然后在客户端上重复运行 ntpdate 命令。如果确实是 iptables BLOCK 问题或类似问题,您应该会看到阻止数据包的行上的 iptables 计数器增加。

相关内容