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 |
댓글