我有一个在两个终端系统之间有 Ipsec 隧道的设置。当我在传出接口(例如 eth0)上捕获数据包时,我只能看到加密的 ESP 数据包从我的系统中流出。我必须去查看接收端以查看实际传输的内容,即在接收端我可以看到解密后的数据包。接收方发送的 ack 也是如此。它是如何在 linux 内核中实际工作的?有没有办法在加密之前在 tcpdump 中查看发送方的数据包?
2 回答
您的问题中有三个问题:
- 如何在 tcpdump 中查看传出的 ESP 数据包,然后再进行加密?
- 它是如何在 linux 内核中实际工作的?
- 有没有办法在加密之前在 tcpdump 中查看发送方的数据包?
第三个问题的答案是
这取决于您的内核以及您使用的实现。如果您在 2.4 内核中使用 KLIPS 作为任何 *swan 解决方案的一部分,那么是的。
否则,如果您使用的是使用 KAME / *BSD 模型的 2.6 内核,那么
不,除非您更改 Ipssec 或 iptables 配置,以便将数据包发送到另一个未加密的接口,然后将未加密的数据包转发到将对其进行加密的接口。
第一个问题的答案是更改您的 iptables 配置和 IPSec 配置。
- 将数据从一个接口发送到同一主机上的另一个接口。
- 设置从第二个接口到目的地的数据转发
- 在安全策略中配置第二个接口的ip地址,在第二个接口上创建隧道。
这种方式可以在加密接口上进行 tcpdump,而无需更改任何内容,并且在数据被加密之前。
对于 KLIPS 和 2.4 内核,使用 -i 开关将 tcpdump 中的接口指定为 ipsec0 一样简单。
查看未加密数据的其他选项包括使用带有 -E 标志的 tcpdump 和相关参数(参见手册页),在数据加密后解密数据,或使用 tcpdump 捕获加密数据,然后在 Wireshark 中解密(有关 ESP 的更多信息Wireshark 中的 IPSec 解密位于此处)。
或者,您可以在xfrm或esp_input的源代码中使用 printk 或 printk_times 进行检测。
关于第二个问题,有几张图片从高层次上解释了它是如何工作的,包括解释作为Oracle 系统管理指南的一部分的 Solaris 实现的图片:IP 服务和Linux 的基础网络通过内核图流。
另请参阅以下参考。基本上,使用 setkey 手动配置或使用用户空间中的 IKE 守护程序自动配置将信息传递给 XFRM,然后在数据包到达 netfilter 预路由之前对其进行转换。
有关 KLIPS 和 KAME 历史的更多信息,请参见此处。