我在两个终端系统之间安装了Ipsec Tunnel。当我在传出接口上捕获数据包时,例如eth0,我只能看到加密的ESP数据包从我的系统中出来。我必须去看看接收端看看实际传输的是什么,即在接收端我可以在解密后看到数据包。类似地,接收者发送的确认。它在linux内核中是如何工作的?有没有办法在加密之前在tcpdump中查看发送方的数据包?
答案 0 :(得分:10)
您的问题中有三个问题:
第三个问题的答案是
这取决于您的内核以及您正在使用的实现。 如果你在2.4内核中使用KLIPS作为任何*天鹅解决方案的一部分,那么是。
否则,如果您使用的是使用KAME / * BSD模型的2.6内核,那么
不,除非您更改Ipssec或iptables配置,以便将数据包发送到未加密的另一个接口,然后将未加密的数据包转发到将加密的接口。
第一个问题的答案是更改您的iptables配置和IPSec配置。
这种方式可以在加密接口上进行tcpdump,而无需更改任何内容,并且在数据加密之前。
对于KLIPS和2.4内核,使用-i开关就像在tcpdump中特定的接口一样简单,就像ipsec0一样。
查看未加密数据的其他选项涉及使用带有-E标志的tcpdump和相关参数(see man page),这些参数在加密后解密数据或使用tcpdump捕获加密数据然后在Wireshark中解密(有关Wireshark中IPSec的ESP解密的更多信息位于here)。
或者,您可以使用源代码中的printk或printk_times将检测设置为xfrm或esp_input。
关于第二个问题,有几张图片解释了它如何在高层工作,包括解释Solaris实现作为Oracle's System Administration Guide: IP Services和Linux's Foundation Network Flow through the kernel diagram的一部分的那些。
另请参阅以下reference。基本上,使用setkey进行手动配置或在用户空间使用IKE守护进程进行自动配置会将信息传递给XFRM,XFRM会在数据包到达netfilter prerouting之前对其进行转换。
有关KLIPS和KAME历史的更多信息,请参阅here。
答案 1 :(得分:0)