9

我有一个在两个终端系统之间有 Ipsec 隧道的设置。当我在传出接口(例如 eth0)上捕获数据包时,我只能看到加密的 ESP 数据包从我的系统中流出。我必须去查看接收端以查看实际传输的内容,即在接收端我可以看到解密后的数据包。接收方发送的 ack 也是如此。它是如何在 linux 内核中实际工作的?有没有办法在加密之前在 tcpdump 中查看发送方的数据包?

4

2 回答 2

10

您的问题中有三个问题:

  1. 如何在 tcpdump 中查看传出的 ESP 数据包,然后再进行加密?
  2. 它是如何在 linux 内核中实际工作的?
  3. 有没有办法在加密之前在 tcpdump 中查看发送方的数据包?

第三个问题的答案是

这取决于您的内核以及您使用的实现。如果您在 2.4 内核中使用 KLIPS 作为任何 *swan 解决方案的一部分,那么是的。

否则,如果您使用的是使用 KAME / *BSD 模型的 2.6 内核,那么

不,除非您更改 Ipssec 或 iptables 配置,以便将数据包发送到另一个未加密的接口,然后将未加密的数据包转发到将对其进行加密的接口。

第一个问题的答案是更改您的 iptables 配置和 IPSec 配置。

  1. 将数据从一个接口发送到同一主机上的另一个接口。
  2. 设置从第二个接口到目的地的数据转发
  3. 在安全策略中配置第二个接口的ip地址,在第二个接口上创建隧道。

这种方式可以在加密接口上进行 tcpdump,而无需更改任何内容,并且在数据被加密之前。

对于 KLIPS 和 2.4 内核,使用 -i 开关将 tcpdump 中的接口指定为 ipsec0 一样简单。

查看未加密数据的其他选项包括使用带有 -E 标志的 tcpdump 和相关参数(参见手册页),在数据加密后解密数据,或使用 tcpdump 捕获加密数据,然后在 Wireshark 中解密(有关 ESP 的更多信息Wireshark 中的 IPSec 解密位于此处)。

或者,您可以在xfrmesp_input的源代码中使用 printk 或 printk_times 进行检测。

关于第二个问题,有几张图片从高层次上解释了它是如何工作的,包括解释作为Oracle 系统管理指南的一部分的 Solaris 实现的图片:IP 服务Linux 的基础网络通过内核图流

另请参阅以下参考。基本上,使用 setkey 手动配置或使用用户空间中的 IKE 守护程序自动配置将信息传递给 XFRM,然后在数据包到达 netfilter 预路由之前对其进行转换。

有关 KLIPS 和 KAME 历史的更多信息,请参见此处

于 2014-02-28T03:14:40.610 回答
0

假设你在 Linux 上:

我的方法是将带有NFQUEUE目标的 iptables 规则放在处理管道中的正确位置。然后使用tshark with-i nfqueue抓包。

于 2016-05-26T14:21:26.493 回答