요약·해설, 영어 원문, 전체 번역을 구분해 실었습니다. API 이름, 코드 심벌, 소스 경로는 원문 표기를 유지합니다.
1. 요약·해설
원문의 핵심 내용을 정리하고 커널 프로그래밍에 필요한 설명을 덧붙였습니다. 아래의 전체 번역과는 별도로 작성한 해설입니다.
Traffic-control example
net_cls.rst:21-44`net_cls`, HTB class, cgroup filter와 iptables를 잇는 예시입니다.
2. 영어 원문 전체
번역에 사용한 Linux v6.18.37 원문입니다. 줄 번호는 해당 버전의 소스 파일을 기준으로 합니다.
원문 전체 펼치기
=========================
Network classifier cgroup
=========================
The Network classifier cgroup provides an interface to
tag network packets with a class identifier (classid).
The Traffic Controller (tc) can be used to assign
different priorities to packets from different cgroups.
Also, Netfilter (iptables) can use this tag to perform
actions on such packets.
Creating a net_cls cgroups instance creates a net_cls.classid file.
This net_cls.classid value is initialized to 0.
You can write hexadecimal values to net_cls.classid; the format for these
values is 0xAAAABBBB; AAAA is the major handle number and BBBB
is the minor handle number.
Reading net_cls.classid yields a decimal result.
Example::
mkdir /sys/fs/cgroup/net_cls
mount -t cgroup -onet_cls net_cls /sys/fs/cgroup/net_cls
mkdir /sys/fs/cgroup/net_cls/0
echo 0x100001 > /sys/fs/cgroup/net_cls/0/net_cls.classid
- setting a 10:1 handle::
cat /sys/fs/cgroup/net_cls/0/net_cls.classid
1048577
- configuring tc::
tc qdisc add dev eth0 root handle 10: htb
tc class add dev eth0 parent 10: classid 10:1 htb rate 40mbit
- creating traffic class 10:1::
tc filter add dev eth0 parent 10: protocol ip prio 10 handle 1: cgroup
configuring iptables, basic example::
iptables -A OUTPUT -m cgroup ! --cgroup 0x100001 -j DROP
3. 한국어 전문 번역
영어 원문의 문단 순서와 의미에 맞춰 전체 내용을 번역했습니다. 코드, 함수명, 코드 심벌, URL은 원문 표기를 유지합니다.
Class identifier와 packet 분류
1-20Network classifier cgroup은 network packet에 class identifier인 `classid`를 붙이는 interface를 제공합니다.
Traffic Controller(`tc`)는 이 identifier를 사용해 서로 다른 cgroup의 packet에 서로 다른 priority를 할당할 수 있습니다. Netfilter(`iptables`) 역시 같은 tag를 보고 해당 packet에 action을 적용할 수 있습니다.
`net_cls` cgroup instance를 만들면 `net_cls.classid` file이 생기며 초기값은 `0`입니다. 이 file에는 `0xAAAABBBB` 형식의 hexadecimal 값을 씁니다. `AAAA`는 major handle number이고 `BBBB`는 minor handle number입니다. 값을 읽을 때에는 decimal 결과가 반환됩니다.
32-bit class identifier의 표기와 read-back 형식입니다.
net_cls, tc와 iptables 설정 예제
21-44먼저 `net_cls` filesystem을 mount하고 subgroup `0`을 만든 뒤 `net_cls.classid`에 `0x100001`을 씁니다.
mkdir /sys/fs/cgroup/net_cls
mount -t cgroup -onet_cls net_cls /sys/fs/cgroup/net_cls
mkdir /sys/fs/cgroup/net_cls/0
echo 0x100001 > /sys/fs/cgroup/net_cls/0/net_cls.classid
이 값은 traffic-control handle `10:1`에 해당하며, file을 읽으면 decimal 값 `1048577`이 나옵니다.
cat /sys/fs/cgroup/net_cls/0/net_cls.classid
1048577
다음 명령은 `eth0` root에 handle `10:`인 HTB qdisc를 만들고, parent `10:` 아래에 classid `10:1`과 rate `40mbit`인 class를 추가합니다.
tc qdisc add dev eth0 root handle 10: htb
tc class add dev eth0 parent 10: classid 10:1 htb rate 40mbit
그 뒤 cgroup classifier filter를 추가해 traffic class `10:1`을 사용합니다.
tc filter add dev eth0 parent 10: protocol ip prio 10 handle 1: cgroup
기본 `iptables` 예시는 cgroup classid가 `0x100001`이 아닌 OUTPUT packet을 drop합니다.
iptables -A OUTPUT -m cgroup ! --cgroup 0x100001 -j DROP
cgroup에 기록한 classid가 traffic-control과 Netfilter 정책으로 이어지는 흐름입니다.
Classid model
net_cls.rst:1-20`net_cls.classid`의 major·minor handle encoding과 packet tagging을 정리합니다.