TC 명령어로 네트워크 인터페이스의 트래픽을 조절하기 > LINUX 자료실

본문 바로가기
사이트 내 전체검색

LINUX 자료실

TC 명령어로 네트워크 인터페이스의 트래픽을 조절하기

페이지 정보

profile_image
작성자 YongJin
댓글 0건 조회 817회 작성일 25-09-05 09:43

본문

안녕하세요. 


시스템 운영환경에서 네트워크 인터페이스의 트래픽 조절이 필요할 때가 있습니다.


치솟는 트래픽을 관리하거나, 프로세스, 포트, IP별 대역폭을 조절하여 자원을 효율적 분배하기 위해서 입니다. 


tc는 리눅스 커널에서 네트워크 트래픽을 조절할 수 있는 도구입니다.


외부 프로그램이 아닌 커널에서 동작하기 때문에 오버헤드가 굉장히 작고 가볍습니다.


네트워크 모니터, 상세필터 같은 심화 기능도 있으나 이 글에선 기본 대역폭 조절만 다루겠습니다.


예제를 풀어가며, 뒷편에 이론에 대해 설명드리도록 하겠습니다.


---


이 글에서 다룰 예제는 다음과 같습니다.


1. 프로세스별 네트워크 트래픽 조절 방법

2. 포트별 트래픽 조절 방법

3. 목적지 IP별 트래픽 조절 방법


---


 **예제**


*- Rocky Linux 8을 기준으로 tc를 사용하기 위해서 "iproute-tc" 패키지가 필요합니다. -*



1. 프로세스별(cgroup이용) 네트워크 트래픽 조절 방법


    **[실험 환경 및 작업순서]**

    

    **case. 서버의 특정 프로세스로 송신 트래픽을 조절하는 상황**

    

    1) Rocky Linux 8.10 서버

      A - 192.168.10.30 (설치 패키지:iproute-tc, iftop, iperf3) - 세션 2개 필요

      B - 192.168.10.10 (설치 패키지:iperf3, iftop) - 세션 2개 필요

    

    2) B 서버 - iperf3 -s

    3) B 서버 세션 2- iftop -s ens160 

    3) A 서버 - cd /sys/fs/cgroup/net_cls; mkdir test

    4) A 서버 - cd test; echo 0x10002 > net_cls.classid  (net_cls.classid에서 16진수 상위 2자리를 부모클래스 하위 2자리를 자식클래스로 사용합니다, 즉 1:2의 classid를 갖습니다.)

    5) A 서버 세션 2- iperf3 -c 192.168.10.10 -b 1G -t 600 ( B 서버 전송량이 늘어났는지 확인 )

    6) A 서버 - ps -ef |grep iperf3

    6) A 서버 - echo (iperf3 PID) > tasks

    7) A 서버 - tc qdisc add dev ens160 root handle 1: htb ( 송신 트래픽 셰이핑 )

    8) A 서버 - tc class add dev ens160 parent 1: classid 1:1 htb rate 10Gbit

    9) A 서버 - tc class add dev ens160 parent 1:1 classid 1:2 htb rate 50Mbit

    10) B 서버 - iftop에서 수신 트래픽 전송폭이 줄었나 확인

    11) A 서버 - tc -s -g class show dev ens160 - 1:2 클래스가 잘 작동하는지 확인

    

    *참고 - htb는 Hierarchical Token Bucket의 약자로 계층적 네트워크를 토큰형식으로 나누어 관리합니다.

    

    ---

    수신 트래픽을 프로세스 번호로 관리하는 것은 cgroup2에서만 가능합니다. 패킷이 네트워크 인터페이스로 도착하면 커널의 네트워크 스택에서 패킷이 처리되기 전까지는 해당 패킷이 어떤 프로세스와 연결될지 알 수 없습니다. 수신 패킷은 네트워크 스택을 통과하며 소켓 레벨에서 프로세스와 연결됩니다. 따라서 수신 트래픽은 물리적 인터페이스에서 처리될 때까지 Cgroup과 연관될 수 없습니다. cgroup2에서 가능한 이유는 커널 레벨에서 패킷 필터링할 수 있도록 eBPF와 cgroup_skb를 사용하여 수신 트래픽을 PID나 Cgroup 단위로 처리해주기 때문입니다. cgroup1은 기본적으로 네트워크 송신트래픽만 관리합니다. tc의 ebpf 필터를 사용해서 프로세스 단위로 조절할 수 있으나 c로 오브젝트 파일도 만들어야 하기에 과한 것 같아 넘겼습니다. 포트번호로 수신 트래픽을 제어하면 훨씬 간단합니다. 또, cgroup2를 사용하면 tc명령어 없이도 수신트래픽을 조절할 수 있기에 이번 포스트에선 제외했습니다. 

    

---


2. 포트별 네트워크 트래픽 조절 방법


    **[실험 환경 및 작업순서]**

    

    **case. 서버의 특정 포트로 송신 트래픽을 조절하는 상황**

    

    1) Rocky Linux 8.10 서버

      A - 192.168.10.30 (설치 패키지:iproute-tc, iftop, iperf3) - 세션 2개 필요

      B - 192.168.10.10 (설치 패키지:iperf3, iftop) - 세션 2개 필요

      

    2) B 서버 - iperf3 -s

    3) B 서버 세션 2 - iftop -s ens160

    4) A 서버 세션 2 - iperf3 -c 192.168.10.10 -b 1G -t 600 ( B 서버 전송량이 늘어났는지 확인 )

    5) A 서버 - tc qdisc add dev ens160 root handle 1: htb

    6) A 서버 - tc class add dev ens160 parent 1: classid 1:1 htb rate 10Gbit

    7) A 서버 - tc class add dev ens160 parent 1:1 classid 1:2 htb rate 50Mbit

    8) A 서버 - tc filter add dev ens160 protocol ip parent 1:0 prio 1 u32 match ip dport 5201 0xffff flowid 1:2

    9) B 서버 세션 2 - iftop에서 수신 트래픽 전송폭이 줄었나 확인

    10) A 서버 - tc -s -g class show dev ens160 - 1:2 클래스가 잘 작동하는지 확인


    **case. 서버의 특정 포트로 수신 트래픽을 조절하는 상황**

    

    1) Rocky Linux 8.10 서버

      A - 192.168.10.30 (설치 패키지:iproute-tc, iftop, iperf3) - 세션 3개 필요

      B - 192.168.10.10 (설치 패키지:iperf3) - 세션 1개 필요

      

    2) A 서버 세션 2 - iftop -s ens160

    3) A 서버 세션 3- iperf3 -s 

    4) B 서버 - iperf3 -c 192.168.10.30 -b 1G -t 600 ( A 서버 전송량이 늘어났는지 확인 )

    5) A 서버 - tc qdisc add dev ens160 ingress

    6) A 서버 - tc filter add dev ens160 parent ffff: protocol ip prio 1 \

    u32 match ip dport 5201 0xffff \

    police rate 50mbit burst 5mb drop

    7) A 서버 - tc filter show dev ens160 ingress

    8) A 서버 - iftop을 통해 전송폭이 줄어드는지 확인

    


3. 목적지 IP별 트래픽 조절 방법

    

    **case. 서버의 특정 목적지 IP로 송신 트래픽을 조절하는 상황**

    

    1) Rocky Linux 8.10 서버

      A - 192.168.10.30 (설치 패키지:iproute-tc, iftop, iperf3) - 세션 2개 필요

      B - 192.168.10.10 (설치 패키지:iperf3) - 세션 2개 필요


    2) B 서버 - iperf3 -s

    3) B 서버 세션 2 - iftop -s ens160

    4) A 서버 세션 2 - iperf3 -c 192.168.10.10 -b 1G -t 600 ( B 서버 전송량이 늘어났는지 확인 )

    5) A 서버 - tc qdisc add dev ens160 root handle 1: htb

    6) A 서버 - tc class add dev ens160 parent 1: classid 1:1 htb rate 10Gbit

    7) A 서버 - tc class add dev ens160 parent 1:1 classid 1:2 htb rate 50Mbit

    8) A 서버 - tc filter add dev ens160 protocol ip parent 1: prio 1 u32 match ip dst 192.168.10.10 flowid 1:2

    9) B 서버 세션 2 - iftop에서 전송폭이 줄어드는지 확인

    10) A 서버 - tc -s -g class show dev ens160 - 1:2 클래스가 잘 작동하는지 확인


      **case. 서버의 특정 목적지 IP로 수신 트래픽을 조절하는 상황**

    1)Rocky Linux 8.10 서버

      A - 192.168.10.30 (설치 패키지: iproute-tc, iftop, iperf3) - 세션 3개 필요

      B - 192.168.10.10 (설치 패키지: iperf3) - 세션 1개 필요


    2) A 서버 - iftop -s ens160

    3) A 서버 - iperf3 -s 

    3) B 서버 - iperf3 -c 192.168.10.30 -b 1G -t 600 ( A 서버 수신량이 늘어났는지 확인 )

    4) A 서버 - tc qdisc add dev ens160 ingress

    5) A 서버 - tc filter add dev ens160 parent ffff: protocol ip prio 1 \

    u32 match ip src 192.168.10.10 \

    police rate 50mbit burst 5m drop

    6) A 서버 - tc filter show dev ens160 ingress

    7) A 서버 - iftop에서 수신 트래픽 전송폭이 줄어드는지 확인







---


 **tc 사용법**


tc를 사용할 때 명령어 뒤에 나오는 인수들에 명확한 구분명은 없습니다. 하지만, 더 쉽게 설명하기 위해 우리말로 간단히 이름지어 말씀드리겠습니다.


사용 형식 - tc (옵션) (포맷) (요소) (동작,command) (동작 대상) (대상 이름) (그외 인수)


옵션과 형식에 앞서 첫번째 인수로 쓰이는 "요소"에 대해 알아보겠습니다. 요소는 세 가지 입니다. 각 요소는 서로 배타적인 상황에 쓰이는 것이 아니고 필요에 따라 보완하여 사용합니다.


예시 - tc -s(statistic 포맷) -g(grphic 포맷) filter(요소) show(동작) dev(동작대상) ens160(대상 이름) ingress(그외 인수)


---


 요소


**(1)QDISCS (Queueing Discipline - 정렬 규칙)**

커널이 인터페이스로 패킷을 보낼 때 마다, QDISCS로 설정한 정렬 규칙에 맞춰 패킷을 송신합니다. 즉각적으로 실행되고, 정렬 규칙안에서 네트워크 어댑터 드라이버가 사용하기 위한 최대치까지 패킷을 송신합니다. 기본적으로 QISCS는 별다른 설정이 없다면 선입선출 방식으로 정렬됩니다. 


**(2)CLASSES (계층)**

QDISCS는 계층을 갖을 수 있습니다. 더 먼저 들어온 패킷이 있더라도 중요성이 높은 계층의 패킷이 들어온다면, 실제 실행되는 패킷의 정렬은 우선순위가 높은 패킷이 먼저 전송됩니다. 그리고 우선순위가 높은 패킷이 모두 전송이 완료되면, 그 다음에 원래 패킷이 전송됩니다. 계층을 갖게되면 (부모클래스):(자식클래스)를 갖고 나누어 사용합니다.


**(3)FILTERS (필터)**

필터는 계층이 있는 QDISC가 결정되면 트래픽이 도달할 때, 하위 계층과 구분되는 분류가 필요할 것입니다. 필터는 다양한 방식으로 분류를 돕는 요소입니다. 필터에서는 흐름제어에 필요한 내용들을 명시하고, flowid라는 이름으로 classid와 매칭시켜 흐름제어를 부착할 수 있습닌다. 필터의 분류 방법은 다음과 같이 여러 방식이 존재합니다. 자주 쓰이는 필터만 소개토록 하겠습니다.


- **basic**: basic은 ematch 메커니즘에서 사용하는 방식 중 하나입니다. 트래픽 패킷의 특정 필드를 검사합니다. 그리고 결과에 따라 적절한 클래스나 정렬로 라우팅할 수 있습니다. 가장 기본이 되는 트래픽 분류 방법으로 조건을 뒤에 명시하여 분류할 수 있습니다.

 

  예시) tc filter add dev ens160 parent 1: protocol ip prio 1 basic match "cmp(u8 at 0 layer transport eq 17)" flowid 1:10

  

  명령문 설명 - tc 명령어로 ens160 장치에 필터를 추가한다. 부모 정렬규칙은 1번(루트 정렬규칙)이고, 프로토콜은 ip, 필터의 우선순위는 1번이다. basic 분류를 사용할 것이고 일치해야 하는 표현식은 "cmp(u8 at 0 layer transport eq 17)"다.

  

  표현식 설명 - cmp(compare - 단순 산수식 패킷 데이터 비교방법)비교 방식을 사용한다. u8(unsigned int 8bit, 8비트 양의 정수)로 전송 계층에서 0바이트부터 검사한다. 검사 값이 17(UDP 프로토콜 번호가 17임)과 같아야한다. 조건에 부합하는 패킷은 1:10 클래스로 라우팅한다.

  

  결론 - 네트워크 인터페이스 ens160에서 UDP 프로토콜을 특정 클래스로 라우팅한다.



- **bpf**: Berkely Packet Filter의 약자. 유닉스 기반 OS에서 많이 쓰이는 패킷 필터, 고성능 네트워크 패킷 분석 필터.


- **cgroup**: linux의 cgroup을 기반으로 작동하는 필터

- **u32**: 산술적 패킷데이터를 이용한 기본적인 필터 ( 예제에서 사용했던 필터 ) 


  

 





 더 알아보기 - 트래픽 조절에 쓰이는 용어

 **[1] SHAPING ( 셰이핑 )**

Shape는 한글로 형태, 모양이라는 의미를 갖습니다. 네트워크 전송폭을 원하는 모양, 형태로 깎아낸다고 이해하면 좋습니다. 할당 가능한 전송폭보다 비트전송률을 낮출 수 있습니다. 또한 단순히 대역폭만 줄일 뿐 아니라, 짧은 순간 급격히 사용량이 늘어날 때 부하를 완화해주는 역할도 수행합니다. 셰이핑은 네트워크를 수신할 때가 아닌, 송신할 때 작동합니다.

 **[2] SCHEDULING ( 스케줄링 )**

스케줄링은 운영자가 네트워크 사용량에 맞추어 우선순위에 맞춰 대역폭 할당의 순서를 정할 수 있게 해줍니다. 스케줄링 또한 네트워크를 수신할 때가 아닌, 송신할 때 작동합니다.

 

**[3] POLICING ( 폴리싱 )**

폴리싱은 셰이핑과 같이 대역폭을 원하는 만큼 제한할 수 있습니다. 그러나 폴리싱은 셰이핑과 달리 네트워크를 수신할 때 작동합니다.

 **[4] Dropping ( 드로핑 )**

드로핑은 네트워크 트래픽이 초과하였을 때 초과분을 버립니다. 드로핑은 네트워크 송신과 수신 모두 관여할 수 있습니다.

 

감사합니다.









댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : (주)리눅스데이타시스템
대표이사 : 정정모
본사 : 강남구 봉은사로 114길 40 홍선빌딩 2층
- tel : 02-6207-1160
대전지사 : 유성구 노은로174 도원프라자 5층
- tel : 042-331-1161

접속자집계

오늘
2,109
어제
2,585
최대
8,445
전체
2,034,319
Copyright © www.linuxdata.org All rights reserved.