![编辑](https://linux22.com/image/531960/%E7%BC%96%E8%BE%91.png)
我有以下设置:
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 机器上(同时在不同的终端中)运行将得到以下输出。tcpdump
eth0
"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 计数器增加。