为什么 iptables NAT 在 mininet 中可以工作,而 iptables 日志记录却不能?
Why does iptables NAT work in mininet, but iptables logging does not?
我查了NATclass在mininet.nodelib
,是通过iptables实现的:
self.cmd( 'iptables -I FORWARD',
'-i', self.localIntf, '-d', self.subnet, '-j DROP' )
self.cmd( 'iptables -A FORWARD',
'-i', self.localIntf, '-s', self.subnet, '-j ACCEPT' )
self.cmd( 'iptables -A FORWARD',
'-o', self.localIntf, '-d', self.subnet,'-j ACCEPT' )
self.cmd( 'iptables -t nat -A POSTROUTING',
'-s', self.subnet, "'!'", '-d', self.subnet, '-j MASQUERADE' )
然而,当我安装日志记录规则时:
iptables -A INPUT -j LOG --log-prefix "IPT log: " --log-level 4
/var/log/kern.log
文件中没有一个 /related/ 条目出现(它有效,如果我 运行 没有 mininet
的相同规则)。
提前致谢!
编辑:
更准确地说,这是我尝试做的事情:
mininet>h2 iptables -A OUTPUT -j LOG --log-prefix "IPT log: " --log-level 3
mininet>h2 iptables -I OUTPUT -j LOG --log-prefix "IPT log: " --log-level 3
mininet>h2 ping h0
.... normal ping output ....
mininet>h2 wget h0
.... index.html being saved on disk ....
mininet>h2 grep "IPT log" /var/log -R
如 grep
所示,尽管 wget
执行的 ping 和 TCP 通信发送了多个 ICMP 消息,但日志中没有任何相关行。
编辑2:
这是我的 iptables 规则,经过实验(抱歉文字图片):
INPUT 链将只包含目的地为本地机器的数据包,而不包含正在转发的数据包。
节点(在这种情况下,包含 iptables 规则的机器)路由(转发)的数据包将通过以下链:
PREROUTING -> FORWARD -> POSTROUTING
如果你想记录所有被转发的数据包,你需要将INPUT链更改为FORWARD链你的日志规则。
如果你想只记录正在 NATd 的数据包,你需要使用 POSTROUTING 链和 nat table 在你的日志规则中。
编辑
由于针对 LOG 的 iptables 规则(在您实验的 OUTPUT 链中)被触发(根据您的屏幕截图),我们可以排除任何 iptables
[日志规则]问题。
问题一定出在其他地方,例如日志记录工具服务(例如,syslog
)。
我查了NATclass在mininet.nodelib
,是通过iptables实现的:
self.cmd( 'iptables -I FORWARD',
'-i', self.localIntf, '-d', self.subnet, '-j DROP' )
self.cmd( 'iptables -A FORWARD',
'-i', self.localIntf, '-s', self.subnet, '-j ACCEPT' )
self.cmd( 'iptables -A FORWARD',
'-o', self.localIntf, '-d', self.subnet,'-j ACCEPT' )
self.cmd( 'iptables -t nat -A POSTROUTING',
'-s', self.subnet, "'!'", '-d', self.subnet, '-j MASQUERADE' )
然而,当我安装日志记录规则时:
iptables -A INPUT -j LOG --log-prefix "IPT log: " --log-level 4
/var/log/kern.log
文件中没有一个 /related/ 条目出现(它有效,如果我 运行 没有 mininet
的相同规则)。
提前致谢!
编辑:
更准确地说,这是我尝试做的事情:
mininet>h2 iptables -A OUTPUT -j LOG --log-prefix "IPT log: " --log-level 3
mininet>h2 iptables -I OUTPUT -j LOG --log-prefix "IPT log: " --log-level 3
mininet>h2 ping h0
.... normal ping output ....
mininet>h2 wget h0
.... index.html being saved on disk ....
mininet>h2 grep "IPT log" /var/log -R
如 grep
所示,尽管 wget
执行的 ping 和 TCP 通信发送了多个 ICMP 消息,但日志中没有任何相关行。
编辑2:
这是我的 iptables 规则,经过实验(抱歉文字图片):
INPUT 链将只包含目的地为本地机器的数据包,而不包含正在转发的数据包。
节点(在这种情况下,包含 iptables 规则的机器)路由(转发)的数据包将通过以下链:
PREROUTING -> FORWARD -> POSTROUTING
如果你想记录所有被转发的数据包,你需要将INPUT链更改为FORWARD链你的日志规则。
如果你想只记录正在 NATd 的数据包,你需要使用 POSTROUTING 链和 nat table 在你的日志规则中。
编辑
由于针对 LOG 的 iptables 规则(在您实验的 OUTPUT 链中)被触发(根据您的屏幕截图),我们可以排除任何 iptables
[日志规则]问题。
问题一定出在其他地方,例如日志记录工具服务(例如,syslog
)。