我在 Ubuntu 16.04 上运行 strongSwan (U5.3.5/K4.4.0-62-generic) VPN 服务器。
通常,当我想要检查服务器上的流量时,我只需运行以下命令:
tcpdump -ni eth0 "tcp port 80" -w log.pcap
不过,在 VPN 服务器上,它对我帮助不大。我只能捕获“常规”流量,而不能捕获 IPSEC 流量。我猜想这是因为 IPSEC 在 TCP 下一层运行。但我仍然想捕获一些数据包以便在 Wireshark 上进行检查。
我怎样才能做到这一点?
答案1
带有的过滤器tcp port 80
永远不会捕获ESP, 自从尤其是协议(IP 协议 50)不是 传输控制协议(IP 协议 6)并且永远不会匹配该过滤器。
对于 Linux,这示意图并且它的几个地方xfrm
(IPsec 及公司转换模块)有助于理解如何处理 IPsec 数据包。
在左侧(入口),每个接收到的数据包的副本被发送到 AF_PACKET 分接头(例如tcpdump)并到达协议层,在那里它被解码并作为纯文本返回,并带有新的副本发送到 AF_PACKET 分接头:tcpdump 将捕获到达接口并成功解密的每个传入 IPsec 数据包的两个数据包。因此,OP 的命令仍会将数据包的解密版本捕获为 TCP 流量,而不是什么都没有。
由于 ESP 可以封装为NAT转换,它可以作为纯 ESP 到达,也可以作为封装在 UDP 端口 4500 中的 ESP 到达(通常)。
在右侧(出口),由于数据包已经通过響鳴橋在到达 AF_PACKET 之前,tcpdump 只能看到加密结果,而看不到纯文本版本。在这里,OP 的命令将不会捕获任何内容。同样,它可以作为纯 ESP 发出或封装在 4500/UDP 中。
因此最后,这应该可以双向捕获加密的 IPsec 流量:
tcpdump -n -s0 -p -i eth0 -w log.pcap esp or udp port 4500
如下所述,在 4500/UDP 上还捕获了一些非 ESP IKE 流量那里,如果确实需要,可以轻松过滤掉(SPI 字段的值为 0),即使在捕获时也可以使用此过滤器:'esp or (udp port 4500 and udp[8:4] != 0)'
。
笔记:
- 在很少使用的 AH+ESP 传输模式中,传入的数据包将是 AH 数据包,而不是 ESP 数据包(
ah or
可以在tcpdump的过滤器也解决了这个问题) - 在 Linux 的 IPsec 主题中,当启用压缩并收到未压缩(通常很短)的数据包时,数据包有时会在路由堆栈中再次循环。对于防火墙来说,这会产生影响,那里描述. 不会影响tcpdump。
答案2
我能够使用以下方法捕获 IPSEC 内部的流量这个 strongswan 页面
简而言之:
iptables -I INPUT -m addrtype --dst-type LOCAL -m policy --pol ipsec --dir in -j NFLOG --nflog-group 5
iptables -I OUTPUT -m policy --pol ipsec --dir out -j NFLOG --nflog-group 5
tcpdump -s 0 -n -i nflog:5 -w ./ipsec.pcap