PVE 使用 tc 把 Panabit 流量镜像到 NTM
myluzh 发布于 阅读:30 Proxmox VE
0x01 前言
我这里使用的是 Panabit 免费版,不支持端口镜像,没办法直接把经过 Panabit 的流量复制到 NTM。
最后直接在 PVE 宿主机上使用 Linux tc,将经过 Panabit 虚拟网卡的流量复制一份,发送到 NTM 的接收网卡。原始流量仍按原来的路径转发,不需要调整现有网络拓扑。
NTM 至少需要两个网口才能正常安装和使用:
- 第一个网口是管理口,用于访问 NTM 管理页面。
- 第二个网口是镜像接收口,用于接收需要分析的网络流量。
我这里使用 NTM VM 203 的第二个网口 net1 接收镜像流量,它在 PVE 宿主机上对应 tap203i1。
当前环境
Panabit VMID:200
NTM VMID:203
Panabit 镜像源:tap200i1
NTM 接收口:tap203i1
Web 管理页面无法访问
一开始 NTM 的 Web 页面访问不了,最后发现是管理口配置错了。Web 管理只能走第一个网口,第二个网口只接收镜像流量。
本环境的正确配置是:
NTM net0:管理口,连接 vmbr0
NTM net1:镜像接收口,连接 vmbr_ntm
ADMIN_PORT=eth0
DATA_PORTS="eth1|virtio2"
管理地址:172.17.200.202
如果 Web 页面无法访问,就在 NTM 控制台确认管理地址配置在 eth0,再检查 /etc/PG.conf 中的 ADMIN_PORT 和 DATA_PORTS。配置完成后使用 https://172.17.200.202 访问。
0x02 配置 tc 镜像
登录 PVE
ssh root@172.17.200.12
确认 tap 接口
PVE 为虚拟机网卡创建的接口通常按下面的格式命名:
tap<VMID>i<net序号>
例如:
Panabit VMID 200 的 net1 = tap200i1
NTM VMID 203 的 net1 = tap203i1
先查看两台虚拟机的网卡配置:
qm config 200 | grep '^net'
qm config 203 | grep '^net'
当前配置中:
Panabit 的 net1 是需要复制流量的数据口
NTM 的 net1 是接收镜像流量的数据口
确认对应的 tap 接口已经存在:
ip -br link show tap200i1
ip -br link show tap203i1
bridge link
如果 VMID 或网卡的 net 序号发生变化,下面 tc 命令中的接口名也要相应修改。
添加镜像规则
清除可能存在的旧规则:
tc qdisc del dev tap200i1 clsact 2>/dev/null || true
添加双向镜像:
tc qdisc add dev tap200i1 clsact
tc filter add dev tap200i1 ingress pref 10 protocol all \
matchall action mirred egress mirror dev tap203i1
tc filter add dev tap200i1 egress pref 10 protocol all \
matchall action mirred egress mirror dev tap203i1
查看和关闭镜像
查看状态:
tc -s filter show dev tap200i1 ingress
tc -s filter show dev tap200i1 egress
关闭镜像:
tc qdisc del dev tap200i1 clsact
0x03 持久化
启用 snippets
pvesm set local --content vztmpl,backup,import,iso,snippets
mkdir -p /var/lib/vz/snippets
创建 hookscript
创建 /var/lib/vz/snippets/panabit-ntm-tc.pl:
内容如下:
#!/usr/bin/perl
use strict;
use warnings;
my ($vmid, $phase) = @ARGV;
my $src = 'tap200i1';
my $dst = 'tap203i1';
sub remove_mirror {
system('tc', 'qdisc', 'del', 'dev', $src, 'clsact');
}
sub add_mirror {
remove_mirror();
system('tc', 'qdisc', 'add', 'dev', $src, 'clsact') == 0 or return;
system(
'tc', 'filter', 'add', 'dev', $src,
'ingress', 'pref', '10', 'protocol', 'all',
'matchall', 'action', 'mirred', 'egress',
'mirror', 'dev', $dst
);
system(
'tc', 'filter', 'add', 'dev', $src,
'egress', 'pref', '10', 'protocol', 'all',
'matchall', 'action', 'mirred', 'egress',
'mirror', 'dev', $dst
);
}
if ($phase eq 'post-start') {
for (1 .. 20) {
if (-d "/sys/class/net/$src" && -d "/sys/class/net/$dst") {
add_mirror();
last;
}
sleep 1;
}
} elsif ($phase eq 'pre-stop') {
remove_mirror();
}
exit 0;
关联虚拟机
添加执行权限并关联到两台虚拟机:
chmod 0755 /var/lib/vz/snippets/panabit-ntm-tc.pl
qm set 200 --hookscript local:snippets/panabit-ntm-tc.pl
qm set 203 --hookscript local:snippets/panabit-ntm-tc.pl
以后 Panabit 或 NTM 重启时,脚本会自动重新添加镜像规则。