요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.
1. 요약·해설
원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.
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. 한국어 전문 번역
영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 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을 정리합니다.