본문 바로가기
소프트웨어/서버관련

Packet Queue & Session Queue - pf.conf

by 씨디맨 2007. 10. 30.
320x100

Packet Queue & Session Queue


NPACI Rocks



PF:
패킷 큐잉과
우선 순위 붙어라

--------------------------------------------------------------------------------

목차
큐잉
스케쥴러
CBQ (Class Based Queueing)
PRIQ (Priority Queueing)
RED (Random Early Detection)
명시적 congestion 통지
큐잉의 설정
큐에의 트래픽의 할당
예 #1: 소규모 사무소 , 가정내 네트워크
예 #2: 기업 네트워크

--------------------------------------------------------------------------------

큐잉
무엇인가를 큐에 넣는다고 하는 것은 , 그것이 처리를 기다리는 동안 , 순서에 따라 , 그것을 축적한다고 하는 것입니다. 컴퓨터 네트워크에서는 , 데이터 패킷이 호스트로부터 송출될 때 그것들은 operating system에 의해 처리되는 것을 기다리는 동안 , 큐에 넣어집니다. 그리고 , operating system는 , 어느 큐에 넣어지고 있는 , 어느 패킷을 처리해야 해요인지를 결정합니다. operating system가 선택한 , 처리해야 할 패킷의 순서는 , 네트워크의 성능에 영향을 줍니다. 예를 들면 ,SSH 이라고 FTP 라고 하는 , 두 네트워크 어플리케이션을 실행하는 유저를 상상해 보세요. 이상적이게는 , 시간에 민감한 SSH 의 성질이기 때문에 , SSH의 패킷은 FTP 의 패킷보다 먼저 처리되어야 하는 것이지요. 예를 들면 ,SSH 클라이언트로 열쇠가 타입 되었을 경우에는, 즉시 반응하는 것이 기대됩니다만 , 몇 초의 불필요한 지연을 발생시키는 FTP 전송이 어떠한 메세지의 원인이 되는 것은 거의 없습니다. 그러나 , 이러한 접속의 핸들링을 실시하는 라우터가 , SSH 접속의 처리 전에 FTP 접속으로부터의 대량의 패킷의 덩어리를 처리하는 경우, 어떠한 일이 일어날까요 ? SSH 접속의 패킷은 큐에 남겨지므로 (혹은 , 라우터가 모든 패킷을 보관 유지하는데 충분히 큰 큐가 없는 경우에는 , 이러한 패킷은 폐기되어 버릴지도 모릅니다), SSH 의 접속은 지연 해 , 움직임이 나빠진 것처럼 보일지도 모릅니다. 그런데 , 사용되고 있는 큐잉의 전략을 변경하는 것에 의해 , 다른 어플리케이션 , 유저 , 그리고 컴퓨터의 사이로, 네트워크의 대역폭을 적정하게 공유할 수가 있게 됩니다.

큐잉은 ,송출방향의 패킷 에 대해서만 도움이 되기로 주의해 주세요. 일단, 착신 방향의 패킷이 인터페이스에 도착한 시점에서, 이 패킷의 큐잉 하는 것은 이제(벌써) 이미 너무 늦습니다. 왜냐하면 , 이 패킷은 , 이것을 수신하는 인터페이스에 도착하기까지, 이미 네트워크 대역을 소비해 버리고 있기 때문인 것입니다. 이것에 대한 해결책은 , 근린의 라우터의 큐잉을 유효화하는지 , 패킷을 라우터에 송출하는 내부 인터페이스의 큐잉을 유효화하는 것 뿐입니다.

스케쥴러
스케쥴러는 , 처리해야 할 큐와 그 중의 순서를 결정합니다. 디폴트에서는 ,OpenBSD 은 FIFO (First In First Out) 스케쥴러를 사용합니다. FIFO 큐는 , 슈퍼마켓이나 은행에 있어서의 사람의 행렬과 같이 움직입니다. 즉 , 큐에 넣어진 최초의 요소는 최초로 처리되게 됩니다. 새로운 패킷이 도착하면(자) , 그것은 큐의 마지막에 추가됩니다. 만약 , 큐가 가득하게 되면(자), 새롭게 도착한 패킷은 폐기됩니다. 이것은 테이르드롭으로서 알려져 있습니다.

OpenBSD 그럼 FIFO 이외로 이하의 두 스케쥴러를 서포트하고 있습니다.

CBQ (Class Based Queueing)
PRIQ (Priority Queueing)
CBQ (Class Based Queueing)
CBQ (Class Based Queueing) (은)는 , 복수의 큐나 클래스의 사이로 , 네트워크 접속의 대역폭의 분할을 실시하는 큐잉 알고리즘입니다. 각각의 큐는 , 송신원 혹은 송신지의 주소나 포토 번호 , 프로토콜 등에 기초를 두어 할당할 수 있는 트래픽을 가지고 있습니다. 하나의 큐는 , 옵션으로서 친큐의 사용율이 낮은 경우에 , 친큐로부터 대역폭을 빌리도록(듯이) 구성되어 있는 일지도 알려집니다. 큐는 그리고 ,SSH 와 같은 회화적인 트래픽을 포함한 경우에 , FTP 와 같이 거대한 트래픽을 포함한 큐에 앞서 그 패킷이 처리되는 우선권이 주어지고 있을지도 모릅니다.

CBQ 의 큐는 계층적인 방법으로 배치됩니다. 계층의 최상정도에는 , 이용 가능한 대역폭의 총량을 정의하는 루트 (root) 큐가 위치하고 있습니다. 아이 큐가 루트 큐아래에 생성되어 그 각각 , 루트 큐의 대역폭의 일부를 할당할 수 있고 있습니다. 예를 들면 , 큐가 이하와 같이 정의되고 있다고 합시다.

루트 큐 (2Mbps)
큐 A (1Mbps)
큐 B (500Kbps)
큐 C (500Kbps)
이 경우 , 이용 가능한 총 대역폭은 2Mbps 으로 설정되어 있습니다. 그리고 , 이 대역폭은 3 개의 아이 큐의 사이에 분할되고 있습니다.

이 계층은 , 큐안에 큐를 정의하는 것으로 , 한층 더 확장할 수가 있습니다. 다른 유저의 사이에 대역폭을 균등하게 분할해 그리고 어느 프로토콜이 다른 트래픽의 대역폭을 고갈시키는 것이 없게 그들의 트래픽을 클래스화하는 것으로 , 예를 들면 , 이하와 같은 큐잉 구조를 정의할 수가 있습니다.

루트 큐 (2Mbps)
유저 A (1Mbps)
ssh (50Kbps)
벌크 (950Kbps)
유저 B (1Mbps)
오디오 (250Kbps)
벌크 (750Kbps)
http (100Kbps)
그 외 (650Kbps)
각각의 큐에 할당할 수 있었던 대역폭의 합계가 , 친큐에 할당할 수 있었던 대역폭 이상은 되지 않는 것에 주의해 주세요.

다른 아이 큐에 이용되어 있지 않은 이용 가능한 대역폭을 , 친큐가 과잉에 가지고 있는 경우에 , 그 친큐로부터 대역폭을 빌리도록(듯이) 큐의 설정을 실시할 수가 있습니다. 예를 들면 , 이하와 같은 큐의 구성을 생각해 보겠습니다.

루트 큐 (2Mbps)
유저 A (1Mbps)
ssh (100Kbps)
ftp (900Kbps, 차용)
유저 B (1Mbps)
여기서 ,ftp 용무의 큐의 트래픽이 900Kbps 를 넘어유저 A 의 큐의 트래픽이 (ssh는, 그것용의 큐에 할당할 수 있었던 100Kbps 미만의 대역 밖에 사용하고 있지 않았기 때문에) 1Mbps 미만이라면 ,ftp 용무의 큐는 초과한 대역폭을유저 A 로부터 차용할 수가 있습니다. 이와 같이 ,ftp 용무의 큐는 , 그것이 과부하에 직면했을 경우에 , 그것용으로 할당할 수 있었던 대역폭 이상을 사용할 수가 있습니다. 만약 ,ssh 의 부하가 증가했을 경우에는 , 차용한 대역폭은 반환되게 됩니다.

CBQ (은)는 각각의 큐에 우선도를 할당합니다. 보다 높은 우선도를 가지는 큐는 , 보다 낮은 우선도를 가지는 큐와 같은 부모를 공유하는 한에 두어 (환언하면 , 양쪽 모두의 큐가 계층 구조안의 같은 가지에 위치하고 있는 한냄새나서는), congestion 시에보다 낮은 우선도를 가지는 큐에 우선합니다. 그리고 , 동일한 우선도를 가지는 큐는 , 라운드로빈 방식에서 처리되어 갑니다. 예를 들면 , 이하에 대해 ,

루트 큐 (2Mbps)
유저 A (1Mbps, 우선도 1)
ssh (100Kbps, 우선도 5)
ftp (900Kbps, 우선도 3)
유저 B (1Mbps, 우선도 1)
CBQ 는 ,유저 A 와유저 B 용의 큐를 라운드로빈 방식에서 처리합니다. 즉 , 어느 쪽의 큐도 한편에 우선할 것은 없습니다. 유저 A 용의 큐가 처리되고 있는 동안 ,CBQ 은 그 아이 큐의 처리도 실시합니다. 이 경우 ,ssh 용무의 큐는 보다 높은 우선도를 가져 , 네트워크가 congestion 하고 있는 경우에 , ftp 용무의 큐보다 우선적인 대우가 주어지게 됩니다. 유저 A 용과유저 B 용의 큐와 비교해 ,ssh 용무와 ftp 용무의 큐는 , 어떠한 우선도도 가지고 있지 않은 것에 주의해 주세요. 왜냐하면 , 이것들은 , 계층 구조 중(안)에서 모든 것이 같은 가지에 위치하고 있는 것은 아니기 때문입니다.

보다 상세한 CBQ 관련의 이론을 알고 싶은 경우에는 , CBQ 에 관한 레퍼런스를 참조해 주세요.

PRIQ (Priority Queueing)
PRIQ (Priority Queueing) (은)는 , 각각의 큐에 고유의 우선도가 주어진 복수의 큐를 , 네트워크 인터페이스에 할당합니다. 보다 높은 우선도를 가지는 큐는 ,항상보다 낮은 우선도의 큐보다 먼저 처리를 합니다.

PRIQ 의 큐잉 구조는 균일합니다. 즉 , 큐안에 큐를 정의할 수 없습니다. 이용 가능한 대역폭의 총량을 설정한 루트 큐가 정의되어 그 아래에 서브 큐가 정의됩니다. 이하의 예에 대해 생각해 봅시다.

루트 큐 (2Mbps)
큐 A (우선도 1)
큐 B (우선도 2)
큐 C (우선도 3)
루트 큐는 ,2Mbps 의 이용 가능한 대역폭을 가지는 것으로서 정의되어 그 아래에 3 개의 서브 큐가 정의되고 있습니다. 가장 높은 우선도의 큐 (우선 순위의 번호가 최고의 것) 은 최초로 처리됩니다. 일단 , 큐 안의 모든 패킷이 처리되든가 , 혹은 큐가 비우면(자) PRIQ는 다음에 높은 우선도를 가지는 큐에 처리를 옮깁니다. 주어진 큐 중(안)에서는 , 패킷은 FIFO (First In First Out) 방식에서 처리를 합니다.

PRIQ (을)를 사용하는 경우 , 큐잉의 계획을 매우 신중하게 실시하지 않으면 안 되는 것에 주의하는 것이 매우 중요합니다. 이것은 PRIQ 이 ,항상보다 높은 우선도의 큐를 보다 낮은 우선도의 것보다 먼저 처리하기 때문에 보다 높은 우선도의 큐가 정상적인 시냇물의 패킷을 수신하고 있는 경우에는, 이보다 높은 우선도의 큐가 , 보다 낮은 우선도의 큐를 지연 시키거나 혹은 패킷이 폐기되는 원인이 되거나 하는 일이 있기 때문인 것입니다.

RED (Random Early Detection)
RED (Random Early Detection) (은)는 congestion 회피 알고리즘입니다. 그 일은 , 큐가 가득하게 안 되는 것을 확실히 하는 것으로 , 네트워크의 congestion를 회피하는 것입니다. 이것은 , 큐의 평균적인 길이 (사이즈) 를 연속적으로 계산해 , 그것을 두 반응을 일으키는 최소의 물리량 , 즉 하한의 반응을 일으키는 최소의 물리량 및 상한의 반응을 일으키는 최소의 물리량과 비교하는 것에 의해 행해집니다. 만약 , 평균적인 큐의 사이즈가 하한의 반응을 일으키는 최소의 물리량을 밑돌고 있는 경우에는 , 패킷이 폐기되는 일은 완전히 없습니다. 그러나 , 평균치가 상한의 반응을 일으키는 최소의 물리량을 웃돌고 있는 것 같은 경우에는 , 새롭게 착신하는모든패킷이 폐기되어 버립니다. 만약 , 평균치가 이것들 두 반응을 일으키는 최소의 물리량의 사이의 값이면 , 평균적인 큐의 사이즈로부터 계산된 확률에 근거해 , 패킷은 폐기되게 됩니다. 이것은 환언하면, 평균적인 큐의 사이즈가 상한의 반응을 일으키는 최소의 물리량에 가까워지면 가까워질수록 패킷은 보다 많이 폐기되게 된다고 하는 것입니다. 패킷을 폐기하는 경우에는 ,RED 은 패킷을 폐기하는 접속을 랜덤에 선택합니다. 이것은 , 보다 큰 대역폭의 총량을 사용하고 있는 접속(정도)만큼, 패킷이 폐기되는 확률이 보다 높다고 하는 것이 됩니다.

RED (은)는 ,global synchronization 문제로서 알려진 상황을 회피할 수가 있고 , 그리고 , 폭발적인 트래픽에 대응할 수도 있기 때문에 , 매우 도움이 되는 것입니다. global synchronization (은)는 , 몇개의 접속으로부터 동시에 패킷을 폐기해 버리기 (위해)때문에 , 전체적인 throughput의 저하를 불러 버리는 것 나오지 않고. 예를들면, 10 개의 FTP 접속을 중계하는 라우터로 congestion가 발생해 ,(FIFO 큐잉의 경우와 같이) 모든 (혹은 대부분의) 이러한 접속이 폐기되었을 경우에는 , 전체적인 throughput가 현저하게 저하해 버리게 됩니다. 물론 , 이것은 , 모든 FTP 접속이 그 throughput를 저하시켜 버리게 되고 그리고 , 네트워크는 이미 그 능력을 충분히 활용할 수 없는 상태가 되어 버리기 때문에 , 매우 이상적인 상태이다고는 말할 수 없게 되어 버립니다. RED (은)는 , 모든 접속을 선택하는 대신에 , 패킷을 폐기하는 접속을 랜덤에 선택하는 것에 의해 , 이러한 상황을 회피합니다. 보다 큰 대역폭의 총량을 사용하고 있는 접속은 , 그 패킷이 폐기될 가능성이 보다 높아집니다. 이와 같이 해 , 큰 대역폭을 소비하는 접속이 감속되는 것으로 congestion가 회피되어 전체적인 throughput의 현저한 저하는 발생하지 않게 됩니다. 게다가RED 는 , 큐가 가득하게 되기전에패킷의 폐기를 개시하기 위해(때문에) , 폭발적인 트래픽에도 대응할 수가 있습니다. 폭발적인 트래픽이 왔을 경우에도, 큐에는 새로운 패킷을 수신하는데 충분한 스페이스가 남아 있을 것입니다.

RED (은)는 , 네트워크로부터의 congestion 통지에 대해서 , 트랜스폴트 프로토콜을 응답할 수 있는 경우에게만 사용할 수가 있습니다. 대부분의 경우에 대해 , 이것은 UDP 이나 ICMP 의 트래픽이 아니고 ,TCP 트래픽을 큐잉 하는 경우에 RED 를 사용해야 한다라고 말하는 것을 의미합니다.

보다 상세한 RED 관련의 이론을 알고 싶은 경우에는 , RED 에 관한 레퍼런스를 참조해 주세요.

명시적 congestion 통지
명시적 congestion 통지 (ECN: Explicit Congestion Notification) 는 , 통신 경로가 congestion 상태에 있는 네트워크상에서 통신중의 2 받침대의 호스트에게 그것을 통지하기 위해(때문에) ,RED 와 함께 동작합니다. 이것은 , 패킷을 폐기하는 것이 아니라, 패킷 헤더중의 플래그를 세트 하기 위해서 RED를 유효화하는 것에 의해 행해집니다. 송신중의 호스트가 ECN 를 서포트하고 있으면(자) 가정했을 경우 , 그 호스트가 이 플래그를 읽어 , 그 네트워크 트래픽을 거기에 따라서 감속하는 것으로 행해집니다.

ECN 에 대한 보다 자세한 정보는 , RFC 3168 을 참조해 주세요.

큐잉의 설정
OpenBSD 3.0 으로부터 ALTQ (Alternate Queueing) 의 큐잉의 실장이 기본 시스템의 일부로서 짜넣어졌습니다. 그리고 ,OpenBSD 3.3 로부터 는 ,ALTQ 은 PF 에 통합되었습니다. OpenBSD 의 ALTQ 의 실장은 ,CBQ (Class Based Queueing) 이라고 PRIQ (Priority Queueing) 스케쥴러를 서포트하고 있습니다. 그리고 ,OpenBSD 의 ALTQ는 RED (Random Early Detection) 이라고 명시적 congestion 통지 (ECN: Explicit Congestion Notification) 도 서포트하고 있습니다.

ALTQ (은)는 PF 에 머지 되었으므로 , 큐잉을 동작시키기 위해서(때문에)는 PF 을 유효화하지 않으면 안됩니다. PF (을)를 어떻게 해 유효화 시키는지에 관해서는 , 처음에 를 참조해 주세요.

큐잉은 pf.conf 그리고 설정됩니다. 큐잉의 설정에는 , 이하와 같은 두 타입의 지시문이 사용됩니다.

altq on - 인터페이스상에서 큐잉을 유효화해 , 어느 스케쥴러를 사용하는지를 정의해 , 그리고 루트 큐를 생성합니다.
queue - 아이 큐의 속성을 정의합니다.
altq on 지시문의 문맥은 다음과 같이 되어 있습니다.

altq on interface scheduler bandwidth bw qlimit qlim \
   tbrsize size queue { queue_list }
interface - 큐잉을 유효화하는 네트워크 인터페이스
scheduler - 사용하는 큐잉 스케쥴러. 지정 가능한 값은 , cbq 이라고 priq 입니다. 어떤 시점으로 , 하나의 인터페이스상에서 유효화 가능한 스케쥴러는 하나 뿐입니다.
bw - 스케쥴러가 이용 가능한 대역폭의 총량. 이 값에는 , 비트 매초 , 킬로비트 매초 , 메가 비트 매초 및 기가비트 매초를 표현하는데 , b,Kb,Mb 혹은 Gb 을 매긴 절대치인가 , 혹은인터페이스의 대역폭의 퍼센티지를 지정할 수가 있습니다.
qlim - 큐에 보관 유지되는 패킷수의 최대치. 이 파라미터는 옵션입니다. 그리고 , 디폴트는 50 입니다.
size - 토큰의 버킷의 조정 밸브의 사이즈를 아르바이트수로 나타낸 것. 이것이 지정되어 있지 않으면 ,인터페이스의 대역폭에 근거해 사이즈가 설정됩니다.
queue_list - 루트 큐아래에 생성하는 아이 큐의 리스트.
예를 들면 ,

altq on fxp0 cbq bandwidth 2Mb queue { std, ssh, ftp }
의 경우는 , 인터페이스 fxp0 상에서 CBQ 를 유효화하고 있습니다. 그리고 , 이용 가능한 전 대역폭은 2Mbps 으로 설정되어 있습니다. 그리고 ,std,ssh 및 ftp 이라고 하는 3 개의 아이 큐가 정의되고 있습니다.

queue 지시문의 문맥은 다음과 같이 되어 있습니다.

queue name [on interface] bandwidth bw [priority pri] [qlimit qlim] \
   scheduler ( sched_options ) { queue_list }
name - 큐명. 이것은 ,altq on 지시문의 것 queue_list 으로 지정된 큐의 하나의 이름과 일치하고 있지 않으면 안됩니다. cbq 그럼 , 그 전의 queue 지시문의 것 queue_list 의 큐명에 일치하는 것이라도 상관하지 않습니다. 큐명은 15 문자보다 긴 것으로 있어서는 안됩니다.
interface - 큐가 유효가 되는 네트워크 인터페이스. 이 값은 옵셔널인 물건이며 , 지정되어 있지 않은 경우에는 , 큐는 모든 인터페이스상에서 유효하게 됩니다.
bw - 큐가 이용 가능한 대역폭의 총량. 이 값에는 , 비트 매초 , 킬로비트 매초 , 메가 비트 매초 및 기가비트 매초를 표현하는데 , b,Kb,Mb 혹은 Gb 을 매긴 절대치인가 , 혹은 친큐의 대역폭의 퍼센티지를 지정할 수가 있습니다. 이 파라미터는 ,cbq 스케쥴러를 사용했을 경우에게만 적용할 수 있습니다.
pri - 큐의 우선도. cbq 그럼 , 우선도의 범위는 0 ~ 7 의 사이이며 ,priq 의 범위는 0 ~ 15 의 사이입니다. 여기서 , 우선도 0 는 , 가장 낮은 우선도입니다. 그리고 , 이것이 지정되어 있지 않은 경우에는 , 1 이 디폴트치로서 사용됩니다.
qlim - 큐에 보관 유지되는 패킷의 최대치. 그리고 , 이것이 지정되어 있지 않은 경우에는 ,50 이 디폴트치로서 사용됩니다.
scheduler - 사용되는 스케쥴러로 ,cbq 인가 priq 의 언젠가. 루트 큐와 같은 것 나오지 않으면 안됩니다.
sched_options - 스케쥴러의 거동을 제어하기 위해서 건네는 것의 가능한 옵션.
default - 다른 어느 큐에도 성냥 하지 않는 패킷을 큐잉하기 위한 디폴트의 큐의 정의. 디폴트 큐는 , 정확하게 하나 밖에 정의할 수 없습니다.
red - 이 큐로 RED (Random Early Detection) 를 유효화.
rio - 입출력 모두 RED 를 유효화. 이 모드에서는 ,RED 복수의 평균 큐장 , 복수의 반응을 일으키는 최소의 물리량 , 그리고 각각의 IP 의 서비스 품질 (QoS) 중 하나를 보수합니다.
ecn - 이 큐로 명시적 congestion 통지 (ECN: Explicit Congestion Notification) 유효화. ECN (은)는 암묵중에 red 를 유효화합니다.
borrow - 부모로부터 대역폭을 차용할 수 있는 큐. 이것은 , cbq 스케쥴러를 사용하고 있는 경우에게만 지정 가능합니다.
queue_list - 이 큐아래에 생성되는 아이 큐의 리스트. queue_list (은)는 ,cbq 스케쥴러를 사용하고 있는 경우에게만 지정 가능합니다.
상기의 예의 계속을 이하에 나타냅니다.

queue std bandwidth 50% cbq(default)
queue ssh { ssh_login, ssh_bulk }
  queue ssh_login priority 4 cbq(ecn)
  queue ssh_bulk cbq(ecn)
queue ftp bandwidth 500Kb priority 3 cbq(borrow red)

여기에서는 , 이전에 정의된 아이 큐의 파라미터를 설정해 있습니다. std 큐는 , 루트 큐의 대역폭 (또는 1Mbps) 의 50% 의 대역폭을 할당할 수 있어 디폴트 큐로서 설정되어 있습니다. ssh 큐에는 ,ssh_login 이라고 ssh_bulk 라고 하는 , 두 아이 큐가 정의되고 있습니다. ssh_login 에는 ssh_bulk 보다 높은 우선도가 주어지고 있어 어느쪽이나 ECN 가 유효화 되고 있습니다. 그리고 ,ftp 큐에는 500Kbps 의 대역폭을 할당할 수 있어 우선도 3 가 주어지고 있습니다. 그리고 이것은 , 여력이 있는 경우에는 대역폭의 차용도 가능해지고 있어 ,RED 도 유효화 되고 있습니다.

큐에의 트래픽의 할당
큐에 트래픽을 할당하기 위해서(때문에)는 ,PF 의 필터 룰 과 함께 queue 키워드를 사용합니다. 예를 들면 , 이하와 같은 행을 포함한 필터 룰의 설정을 생각해 봅시다.

pass out on fxp0 from any to any port 22
패킷은 ,queue 키워드를 사용해 , 특정의 큐에 할당할 수 있었던 룰에 성냥 합니다.

pass out on fxp0 from any to any port 22 queue ssh
queue 키워드가 block 지시문과 함께 사용되었을 경우 , 그 결과적으로 ,TCP RST 나 ICMP Unreachable 패킷이 지정된 큐에 할당할 수 있습니다.

altq on 지시문으로 정의된 인터페이스 이외의 , 인터페이스상에서 큐의 지정을 할 가능성이 있는 것에 주의해 주세요.

altq on fxp0 cbq bandwidth 2Mb queue { std, ftp }
queue std cbq(default)
queue ftp bandwidth 1.5Mb

pass in on dc0 from any to any port 21 queue ftp

큐잉은 fxp0 위에서 유효화 되고 있습니다만 , 태그 붙이고는 dc0 위에서 행해집니다. 만약 , 인터페이스 fxp0 로부터 나온 ,pass 룰에 패킷이 성냥 하는 경우 , 이러한 패킷은 ,ftp 큐에 큐잉 될 것입니다. 이 방식의 큐잉은 , 라우터에 취해 매우 도움이 되는 것입니다.

통상은 , 하나의 큐명만이 queue 키워드에게 줄 수 있습니다만 , 만약 , 둘눈의 이름이 지정되어 있는 경우에는 , 그 큐는 , 저지연을 위한 ToS (Type of Service) 패킷인가 , 데이터의 유료 하중이 없는 TCP ACK 패킷을 위해서(때문에) 사용됩니다. 이 좋은 예가 ,SSH 를 사용하고 있는 경우가 됩니다. SSH 의 로그인 세션은 , 저지연을 위해서(때문에) ToS 를 설정해 있습니다만 ,SCP 이나 SFTP 의 세션에는 이것이 설정되어 있지 않습니다. PF (은)는 , 비로그인 접속 이외가 다른 큐안의 로그인 접속에 속하는 패킷을 큐잉 하기 위해서 , 이 정보를 사용할 수가 있습니다. 이것은 , 파일 전송의 패킷보다 로그인 접속의 패킷을 우선시키는데 도움이 됩니다.

pass out on fxp0 from any to any port 22 queue(ssh_bulk, ssh_login)
이것은 ,SSH 의 로그인 접속에 속하는 패킷을 ssh_login 큐에 할당해SCP 나 SFTP 접속에 속하는 패킷을 ssh_bulk 큐에 할당하고 있습니다. ssh_login 큐는 , 보다 높은 우선도를 가지고 있으므로 ,SSH 로그인 접속의 패킷은 , SCP 이나 SFTP 접속에 우선해 처리되게 됩니다.

TCP ACK 패킷을 보다 높은 우선도를 가지는 큐에 할당하는 것은 , 예를 들어 ADSL 회선과 같이 , 업 로드와 다운로드의 대역폭이 차이가 나는 것 같은 , 비대칭의 접속에 대해 편리한 것입니다. ADSL 회선에서는 , 업 로드의 채널이 매우 혼잡하고 있는 경우에 다운로드가 시작되면(자) , 업 로드 채널을 통해 TCP ACK 패킷을 송신하려고 할 때에 , congestion 하고 있는 중에 그것을 송신해야 하기 때문에 , 다운로드도 영향을 받게 되어 버립니다. 최선의 결과를 얻기 위해서(때문에) 테스트를 실시해 , 업 로드의 큐의 대역폭을 , 그 능력보다 작은 값으로 설정해야 합니다. 실제로는 , 업 로드의 최대치가 640Kb 의 ADSL 회선의 경우이라면 , 루트 큐의대역폭을 600Kb 과 같은 값으로 설정하는 것으로 , 보다 좋은 성능을 얻을 수 있게 됩니다. 그리고 시행 착오를 실시하는 것으로 , 최선의대역폭의 설정을 얻을 수 있을 것입니다.

이하와 같이 ,keep state 가 지정된 룰에 대해서 queue 키워드를 사용하는 경우 ,

pass in on fxp0 proto tcp from any to any port 22 flags S/SA \
   keep state queue ssh
PF 는 , 상태를 가지는 접속에 성냥 한 ,fxp0 으로부터 나가는 패킷이 , 마지막에 ssh 큐에 들어가도록 , 그 상태 테이블의 엔트리에 큐를 등록합니다. queue 키워드가 착신 트래픽을 필터링 하는 룰에 대해서 사용되고 있는 것에도 불구하고 , 그 목적이 관계하는 송출 트래픽을 위한 큐를 지정하기 위해(때문에)이기로 주의해 주세요. 상기의 룰은 , 착신 패킷을 큐잉하기 위한 의 것은 아닙니다.

예 #1: 소규모 사무소 , 가정내 네트워크
 
    [ Alice ]    [ Charlie ]
        |             |                              ADSL
     ---+-----+-------+------ dc0 [ OpenBSD ] fxp0 -------- ( Internet )
              |
           [ Bob ]


이 예에서는 ,OpenBSD 은 3 받침대의 워크스테이션이 접속된 , 소규모의 가정내 네트워크의 인터넷 게이트웨이로서 사용되고 있습니다. 이 게이트웨이는 , 패킷 필터링과 NAT 의 일을 실시하고 있습니다. ADSL 회선을 사용한 인터넷 접속은 , 나오고가 2Mbps 로 오름이 640Kbps 되고 있습니다.

이 네트워크의 큐잉의 폴리시는 이하대로입니다.

Alice (이)나 Charlie 의 다운로드에 방해받는 일 없이 ,Bob 가 온라인 게임을 즐길 수 있도록 , 나오고의 대역폭 중의 것 80Kbps 을 그를 위해서(때문에) 예약합니다. 가능한 경우에는 , Bob 은 80Kbps 이상의 대역폭을 이용할 수도 있습니다.
회화적인 SSH 의 트래픽이나 인스턴트 메세지의 트래픽은 , 통상의 트래픽보다 높은 우선도를 가지도록(듯이) 합니다.
DNS (이)가 문의하고와 그 응답은 , 그 다음에 높은 우선도를 가지도록(듯이) 합니다.
송출되는 TCP ACK 패킷은 , 그 외의 모든 송출 트래픽보다 높은 우선도를 가지도록(듯이) 합니다.
이하는 , 이 네트워크 폴리시에 적합하는 룰 세트입니다. 상기의 폴리시에 직접적으로 적용되는 pf.conf 의 지시문만이 존재하고 있는 것에 주의해 주세요. nat, rdr (이)라고 옵션등은 , 이것에는 포함되어 있지 않습니다.

# enable queueing on the external interface to control traffic going to
# the Internet. use the priq scheduler to control only priorities. set
# the bandwidth to 610Kbps to get the best performance out of the TCP
# ACK queue.

altq on fxp0 priq bandwidth 610Kb queue { std_out, ssh_im_out, dns_out, \
 tcp_ack_out }

# define the parameters for the child queues.
# std_out      - the standard queue. any filter rule below that does not
#                explicitly specify a queue will have its traffic added
#                to this queue.
# ssh_im_out   - interactive SSH and various instant message traffic.
# dns_out      - DNS queries.
# tcp_ack_out  - TCP ACK packets with no data payload.

queue std_out     priq(default)
queue ssh_im_out  priority 4 priq(red)
queue dns_out     priority 5
queue tcp_ack_out priority 6

# enable queueing on the internal interface to control traffic coming in
# from the Internet. use the cbq scheduler to control bandwidth. max
# bandwidth is 2Mbps.

altq on dc0 cbq bandwidth 2Mb queue { std_in, ssh_im_in, dns_in, bob_in }

# define the parameters for the child queues.
# std_in      - the standard queue. any filter rule below that does not
#               explicitly specify a queue will have its traffic added
#               to this queue.
# ssh_im_in   - interactive SSH and various instant message traffic.
# dns_in      - DNS replies.
# bob_in      - bandwidth reserved for Bob's workstation. allow him to
#               borrow.

queue std_in    cbq(default)
queue ssh_im_in priority 4
queue dns_in    priority 5
queue bob_in    bandwidth 80Kb cbq(borrow)


# ... in the filtering section of pf.conf ...

alice         = "192.168.0.2"
bob           = "192.168.0.3"
charlie       = "192.168.0.4"
local_net     = "192.168.0.0/24"
ssh_ports     = "{ 22 2022 }"
im_ports      = "{ 1863 5190 5222 }"

# filter rules for fxp0 inbound
block in on fxp0 all

# filter rules for fxp0 outbound
block out on fxp0 all
pass  out on fxp0 inet proto tcp from (fxp0) to any flags S/SA \
 keep state queue(std_out, tcp_ack_out)
pass  out on fxp0 inet proto { udp icmp } from (fxp0) to any keep state
pass  out on fxp0 inet proto { tcp udp } from (fxp0) to any port domain \
 keep state queue dns_out
pass  out on fxp0 inet proto tcp from (fxp0) to any port $ssh_ports \
 flags S/SA keep state queue(std_out, ssh_im_out)
pass  out on fxp0 inet proto tcp from (fxp0) to any port $im_ports \
 flags S/SA keep state queue(ssh_im_out, tcp_ack_out)

# filter rules for dc0 inbound
block in on dc0 all
pass  in on dc0 from $local_net

# filter rules for dc0 outbound
block out on dc0 all
pass  out on dc0 from any to $local_net
pass  out on dc0 proto { tcp udp } from any port domain to $local_net \
 queue dns_in
pass  out on dc0 proto tcp from any port $ssh_ports to $local_net \
 queue(std_in, ssh_im_in)
pass  out on dc0 proto tcp from any port $im_ports to $local_net \
 queue ssh_im_in
pass  out on dc0 from any to $bob queue bob_in



예 #2: 기업 네트워크
  ( IT Dept )  [ Boss's PC ]
       |          |                                   T1
     --+----+-----+---------- dc0 [ OpenBSD ] fxp0 -------- ( Internet )
            |                         fxp1
         [ COMP1 ]    [ WWW ]         /
                         |           /
                       --+----------'


이 예에서는 ,OpenBSD 의 호스트를 , 기업 네트워크의 파이어 월(fire wall)로서 가동시키고 있습니다. 이 회사에서는 , 그 고객이 FTP 로 고객의 web 사이트를 업 로드하기 위해(때문에) , 이 회사의 네트워크의 것 DMZ 으로 WWW 서버를 운용하고 있습니다. IT 부문에서는 , 자신의 네트워크를 기간 네트워크에 접속해 사용하고 있습니다. 그리고 , 사장은 , 전자 메일이나 web 서핑에 사용하기 위한 PC 을 , 자신의 책상에 가지고 있습니다. 인터넷에는 , 상하 방향 모두 1.5Mbps 의 T1 회선을 사용해 접속하고 있습니다. 그 외의 모든 네크워크 세그먼트는 ,Fast Ethernet (100Mbps) 을 사용하고 있습니다.

네트워크 관리자는 이하와 같은 폴리시를 결정했습니다.

인터넷과 WWW 서버와의 사이의 트래픽은 , 쌍방향과도 500Kbps 에 제한합니다.
WWW 서버와 내부 네트워크와의 사이의 트래픽에는 , 모두의 대역폭의 제한을 마련하지 않습니다.
WWW 서버와 인터넷과의 사이의 HTTP 의 트래픽에는 , (FTP 의 업 로드와 같은) 다른 WWW 서버와 인터넷과의 사이의 트래픽보다 높은 우선도를 줍니다.
IT 부문의 네트워크에는 , 그들이 최신의 소프트웨어의 업데이트를 적절한 시기에 다운로드할 수 있도록(듯이) 500Kbps 를 예약합니다. 그리고 , 가능한 때로는 , 그들은 500Kbps 이상의 대역폭을 이용할 수 있도록(듯이) 하고 있습니다.
사장의 것 PC 과 인터넷동안의 트래픽에는 , 인터넷과의 사이의 다른 트래픽보다 높은 우선도를 줍니다.
이하는 , 이 네트워크 폴리시에 적합하는 룰 세트입니다. 상기의 폴리시에 직접적으로 적용되는 pf.conf 의 지시문만이 존재하고 있는 것에 주의해 주세요. nat, rdr (이)라고 옵션등은 , 이것에는 포함되어 있지 않습니다.

# enable queueing on the external interface to queue packets going out
# to the Internet. use the cbq scheduler so that the bandwidth use of
# each queue can be controlled. the max outgoing bandwidth is 1.5Mbps.

altq on fxp0 cbq bandwidth 1.5Mb queue { std_ext, www_ext, boss_ext }

# define the parameters for the child queues.
# std_ext        - the standard queue. also the default queue for
#                  outgoing traffic on fxp0.
# www_ext        - container queue for WWW server queues. limit to
#                  500Kbps.
#   www_ext_http - http traffic from the WWW server
#   www_ext_misc - all non-http traffic from the WWW server
# boss_ext       - traffic coming from the boss's computer

queue std_ext        cbq(default)
queue www_ext        bandwidth 500Kb { www_ext_http, www_ext_misc }
  queue www_ext_http priority 3 cbq(red)
  queue www_ext_misc priority 1
queue boss_ext       priority 3

# enable queueing on the internal interface to control traffic coming
# from the Internet or the DMZ. use the cbq scheduler to control the
# bandwidth of each queue. bandwidth on this interface is set to the
# maximum. traffic coming from the DMZ will be able to use all of this
# bandwidth while traffic coming from the Internet will be limited to
# 1.0Mbps (because 0.5Mbps (500Kbps) is being allocated to fxp1).

altq on dc0 cbq bandwidth 100% queue { net_int, www_int }

# define the parameters for the child queues.
# net_int    - container queue for traffic from the Internet. bandwidth
#              is 1.0Mbps.
#   std_int  - the standard queue. also the default queue for outgoing
#              traffic on dc0.
#   it_int   - traffic to the IT Dept network.
#   boss_int - traffic to the boss's PC.
# www_int    - traffic from the WWW server in the DMZ.

queue net_int    bandwidth 1.0Mb { std_int, it_int, boss_int }
  queue std_int  cbq(default)
  queue it_int   bandwidth 500Kb cbq(borrow)
  queue boss_int priority 3
queue www_int    cbq(red)

# enable queueing on the DMZ interface to control traffic destined for
# the WWW server. cbq will be used on this interface since detailed
# control of bandwidth is necessary. bandwidth on this interface is set
# to the maximum. traffic from the internal network will be able to use
# all of this bandwidth while traffic from the Internet will be limited
# to 500Kbps.

altq on fxp1 cbq bandwidth 100% queue { internal_dmz, net_dmz }

# define the parameters for the child queues.
# internal_dmz   - traffic from the internal network.
# net_dmz        - container queue for traffic from the Internet.
#   net_dmz_http - http traffic.
#   net_dmz_misc - all non-http traffic. this is also the default queue.

queue internal_dmz      # no special settings needed
queue net_dmz        bandwidth 500Kb { net_dmz_http, net_dmz_misc }
  queue net_dmz_http priority 3 cbq(red)
  queue net_dmz_misc priority 1 cbq(default)


# ... in the filtering section of pf.conf ...

main_net  = "192.168.0.0/24"
it_net    = "192.168.1.0/24"
int_nets  = "{ 192.168.0.0/24, 192.168.1.0/24 }"
dmz_net   = "10.0.0.0/24"

boss      = "192.168.0.200"
wwwserv   = "10.0.0.100"

# default deny
block on { fxp0, fxp1, dc0 } all

# filter rules for fxp0 inbound
pass in on fxp0 proto tcp from any to $wwwserv port { 21, \
 > 49151 } flags S/SA keep state queue www_ext_misc
pass in on fxp0 proto tcp from any to $wwwserv port 80 \
 flags S/SA keep state queue www_ext_http

# filter rules for fxp0 outbound
pass out on fxp0 from $int_nets to any keep state
pass out on fxp0 from $boss to any keep state queue boss_ext

# filter rules for dc0 inbound
pass in on dc0 from $int_nets to any keep state
pass in on dc0 from $it_net to any queue it_int
pass in on dc0 from $boss to any queue boss_int
pass in on dc0 proto tcp from $int_nets to $wwwserv port { 21, 80, \
 > 49151 } flags S/SA keep state queue www_int

# filter rules for dc0 outbound
pass out on dc0 from dc0 to $int_nets

# filter rules for fxp1 inbound
pass in on fxp1 proto { tcp, udp } from $wwwserv to any port 53 \
 keep state

# filter rules for fxp1 outbound
pass out on fxp1 proto tcp from any to $wwwserv port { 21, \
 > 49151 } flags S/SA keep state queue net_dmz_misc
pass out on fxp1 proto tcp from any to $wwwserv port 80 \
 flags S/SA keep state queue net_dmz_http
pass out on fxp1 proto tcp from $int_nets to $wwwserv port { 80, \
 21, > 49151 } flags S/SA keep state queue internal_dmz



[앞으로 돌아오는: 엥커와 이름 첨부 (서브) 룰 세트] [목차] [다음에 진행되는: 주소 풀과 load sharing (Load Balancing)]


============================================================================

PF: OpenBSD 패킷 필터

--------------------------------------------------------------------------------


목차
기본 설정
처음에
리스트와 매크로
테이블
패킷 필터링
네트워크 어드레스 변환 (NAT)
트래픽 리디렉션 (포토 forwarding)
룰 세트 작성의 지름길
고도의 설정
실행시 옵션
스크러브 (scrub: 패킷의 정규화)
엥커와 이름 첨부 (서브) 룰 세트
패킷의 큐잉과 우선 순위 붙어라
주소 풀과 load sharing (Load Balancing)
패킷의 태그 붙어라
보충 사항
로그의 취득
성능
FTP 에 있어서의 문제
authpf: 인증 게이트웨이용 유저 쉘
룰 세트의 례
례 #1: 자택이나 소규모 사무소용 파이어 월(fire wall)

'소프트웨어 > 서버관련' 카테고리의 다른 글

MRTG 설치부터 활용 까지  (22) 2007.11.01
FreeBSD PDF 메뉴얼 전체  (0) 2007.10.30
FreeBSD 6.2 pf.conf Default File  (0) 2007.10.30
MRTG 윈도우에 설치하기  (9) 2007.10.24
Mercury SMTP Server 설정창  (1) 2007.10.23

댓글