«

PVE 使用 tc 把 Panabit 流量镜像到 NTM

myluzh 发布于 阅读:30 Proxmox VE


0x01 前言

我这里使用的是 Panabit 免费版,不支持端口镜像,没办法直接把经过 Panabit 的流量复制到 NTM。

最后直接在 PVE 宿主机上使用 Linux tc,将经过 Panabit 虚拟网卡的流量复制一份,发送到 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_PORTDATA_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 重启时,脚本会自动重新添加镜像规则。

pve tc panabit NTM


正文到此结束
版权声明:若无特殊注明,本文皆为 Myluzh Blog 原创,转载请保留文章出处。
文章内容:https://itho.cn/pve/618.html
文章标题:《PVE 使用 tc 把 Panabit 流量镜像到 NTM