我有一个 Ubunutu 18.04 LTS 服务器,它正在接收从多个源发送的 ERSPAN 流量。
对于那些不熟悉 ERSPAN 的人来说,它使用 GRE 隧道来实现此目的,将原始 L3 数据包包装在另一个 L3 数据包中,保留原始数据包源/目标 IP、有效负载、L2 详细信息等...
服务器在专用接口(本例中为 ens192)上接收该流量,但在 IDS 处理该流量时不解封装该流量(删除 GRE 标头),所看到的只是源(ERSPAN 源)和目的地(ubuntu服务器)...因为一旦找到源/目标 IP,IDS 就会停止处理该信息。
为了解决这个问题,我尝试使用 RCDCAP,但它会在短时间内崩溃并出现内存损坏问题。我已将此问题转达给 RCDCAP 的开发人员,他们一直在尝试解决此问题,但尚未成功。
我现在正在研究内核完成这项工作的能力。我看到内核模块 ip_gre 包含对 ERSPAN Type I、Type II 和 Type III 的支持。
我在 Ubunutu 服务器上做了以下操作:
#load ip_gre module into kernel
modprobe ip_gre
#create tunnel in gre mode set local and remote ends of tunnel and turn link up
ip tunnel add tun0 mode gre local 10.10.1.20 remote 10.10.1.143 ttl 255
ip link set tun0 up
#assign IP address to tunnel interface
ip addr add 10.10.1.20/24 dev tun0
执行此操作成功创建了隧道,但它不处理 GRE 流量并保留附加的 GRE 标头。
当我创建 GRE 隧道时是否缺少开关或其他东西来告诉它期望的类型? GRE 类型之间存在细微差别,如果其期望类型为 I,则无法处理它......
答案1
我找到了解决办法!我使用的是 Suricata 5.0.3,它内置了 ERSPAN 处理功能,但默认情况下处于禁用状态。进入 suricata.yml (/etc/suricata/suricata.yml),我将下面的行更新为“true”
erspan:
typeI:
enabled: true
然后启动 suricata 并检查 fast.log 以确认这就是解决方案。