리눅스 TC 모든 포트 미러링 하는법


리눅스 TC는 Traffic Control로 커널의 트래픽을 컨트롤 하는 기능을 제공하는 유틸리티입니다. 패킷 전송, 속도, 우선순위 등 패킷을 제어할 수 있습니다.

먼저 ifb0 이라는 가상 인터페이스 개념이 나옵니다. 여러 포트에서 나오는 트래픽을 하나로 묶어야 하기 때문에 나오는 개념입니다.

ingress 트래픽을 캡쳐하고 처리할 수 있게 도와주는 인터페이스입니다.

모든 인터페이스는 큐디스크(qdisc)를 가지고 있지만 리눅스에서는 ingress 큐디스크가 없기 때문에 ifb0 인터페이스르 사용하여 ingress 트래픽을 캡쳐하고 처리합니다.


1. ingress(입력) 트래픽을 캡처할 새로운 qdisc(큐 디스크)를 생성합니다.

tc qdis

sudo tc qdisc add dev ifb0 root handle 1: prio

위 명령어는 ifb0 인터페이스에 대한 새로운 qdisc를 생성하고, 해당 qdisc의 핸들을 1:로 지정합니다.


2. 모든 인터페이스의 ingress 트래픽을 ifb0 인터페이스의 egress(출력) 트래픽으로 복사하는 필터를 만듭니다.

sudo tc filter add dev eth0 parent ffff: protocol all u32 match u32 0 0 action mirred egress redirect dev ifb0

sudo tc filter add dev eth1 parent ffff: protocol all u32 match u32 0 0 action mirred egress redirect dev ifb0

위 명령어는 eth0와 eth1 인터페이스에 대해 새로운 필터를 생성하고, 해당 필터가 모든 프로토콜에 대한 ingress 트래픽을 캡처하도록 설정합니다. 이때, 캡처된 패킷은 mirred 명령어를 사용하여 egress(출력) 트래픽으로 복사되도록 지정합니다. 마지막으로, 복사된 패킷은 ifb0 인터페이스로 리디렉션됩니다.


3. ifb0 인터페이스의 ingress 트래픽을 미러링할 출력 캡처 포인트를 만듭니다.

sudo tc qdisc add dev eth2 handle 2: root htb default 1

위 명령어는 eth2 인터페이스에 대한 출력 캡처 포인트를 생성하고, 해당 캡처 포인트의 핸들을 2:로 지정합니다. 이때, 기본 클래스를 1로 설정합니다.


4. ifb0 인터페이스의 ingress 트래픽을 출력 캡처 포인트로 복사하는 필터를 만듭니다.

sudo tc filter add dev ifb0 parent 1: protocol all prio 1 u32 match u32 0 0 action mirred egress mirror dev eth2

위 명령어는 ifb0 인터페이스에서 모든 프로토콜에 대한 ingress 트래픽을 캡처하고, 해당 패킷을 mirror 명령어를 사용하여 eth2 인터페이스의 출력 캡처 포인트로 복사합니다.


tc show

tc qdic show

네트워크 인터페이스에 대한 현재 TC 구성된 리스트를 표시해 줍니다.

댓글 남기기