dhcp-eval(5)

명칭
dhcp-eval - ISC DHCP 에 있어서의 조건부 평가

해설
Internet Software Consortium 의 DHCP 클라이언트와 서버는, 어느쪽이나 수신하는 패킷에 의존한 조건부 동작을 실시하는 능력을 가집니다. 조건부 동작의 문법을 여기에 나타냅니다.

참조: 조건부 동작
조건부 동작은, if, else, elsif 문을 사용해 지정합니다. 조건문은, 통상문 (option 문)이 등장 가능한 장소는 어디에라도 등장 가능하고, 또 이러한 문장을 괄일도 가능합니다. 서버에 있어서의 조건문은 다음과 같이 되는 것이 많을 것입니다:

if option dhcp-user-class = "accounting" {
  max-lease-time 17600;
  option domain-name "accounting.example.org";
  option domain-name-servers ns1.accounting.example.org,
			     ns2.accounting.example.org;
} elsif option dhcp-user-class = "sales" {
  max-lease-time 17600;
  option domain-name "sales.example.org";
  option domain-name-servers ns1.sales.example.org,
			     ns2.sales.example.org;
} elsif option dhcp-user-class = "engineering" {
  max-lease-time 17600;
  option domain-name "engineering.example.org";
  option domain-name-servers ns1.engineering.example.org,
			     ns2.engineering.example.org;
} else {
  max-lease-time 600;
  option domain-name "misc.example.org";
  option domain-name-servers ns1.misc.example.org,
			     ns2.misc.example.org;
}

클라이언트측에서는, 조건부 평가의 예는 다음과 같이 되겠지요:

# example.org 는 파이야워르로 DNS 를 필터 하므로,
# example.org 네트워크에 연결될 때 마셔, 그 DNS 서버를 사용합니다.
# example.org 에 연결되는 것은 아닌 경우, 자기의 DNS 서버를 우선 사용합니다.
if not option domain-name = "example.org" {
  prepend domain-name-servers 127.0. 0.1;
}

if 문장과 elsif 계속문은, 인수로서 불식을 취합니다. 즉, 이러한 문장은, 평가되면(자) 불리언 값의 결과를 생성하는 식을 취합니다. 식의 평가 결과가 실로 되면(자), if 문장의 직후의 brace로 괄문이 실행되어 후속 한다 elsif (와)과 else 시에는 스킵 됩니다. 그렇지 않은 경우, 평가 결과가 실로 되는 elsif 절을 만날 때까지, 후속 하는 각 elsif 마디의 식이 체크됩니다. 그러한 마디가 발견되면(자), 직후의 brace중의 문장이 실행되어 후속 한다 elsif (와)과 else 시에는 스킵 됩니다. 모든 if 및 elsif 시에가 체크되었지만 어느 식도 실로라면 없는 경우로, else 마디가 존재하는 경우, else 의 직후의 brace중의 문장이 평가됩니다. 조건에 대해서는, 평가 결과가 비우는 불식은 가짜로서 다루어집니다.

불식
이하는, DHCP 배포물로 현재 서포트되고 있는 불식의 일람입니다.

data-expression-1 = data-expression-2

    = 오퍼레이터는, 2 개의 데이터식을 비교해, 양자가 같은 경우는 진을 돌려주어, 동일하지 않은 경우는 가짜를 돌려줍니다. 좌변 혹은 우변중 한쪽이 하늘의 경우, 결과는 비웁니다.

boolean-expression-1 and boolean-expression-2

    and 오퍼레이터는, 좌변의 불식과 우변의 불식의 양쪽 모두의 평가 결과가 진정한 경우, 진이라고 평가됩니다. 그렇지 않은 경우, 가짜라고 평가됩니다. 좌변 혹은 우변중 한쪽이 하늘의 경우, 결과는 비웁니다.

boolean-expression-1 or boolean-expression-2

    or 오퍼레이터는, 좌변의 불식과 우변의 불식의 몇개의 평가 결과가 진정한 경우, 진이라고 평가됩니다. 그렇지 않은 경우, 가짜라고 평가됩니다. 좌변 혹은 우변중 한쪽이 하늘의 경우, 결과는 비웁니다.

not boolean-expression

    not 오퍼레이터는, boolean-expression 의 평가 결과가 가짜의 경우, 진이라고 평가됩니다. 또, boolean-expression 의 평가 결과가 진정한 경우, 가짜라고 평가됩니다. boolean-expression 의 평가 결과가 하늘의 경우, 결과도 또 비웁니다.

exists option-name

    exists 식은, 처리 대상의 입력 DCHP 패킷중에, 지정된 옵션이 존재하는 경우, 진을 돌려줍니다.
known

    known 식은, 요구 대응중의 클라이언트가 기존의 경우, 즉 호스트 선언이 있는 경우, 진을 돌려줍니다.
static

    static 식은, 요구 대응중의 클라이언트에의 리스 할당이, 정적 주소 할당에 의하는 것이었을 경우, 진을 돌려줍니다.

데이터식
전술의 불식은, 데이터식의 평가 결과에 의존합니다. 데이터식을 여기에 나타냅니다.

substring (data-expr, offset, length)

    substring 오퍼레이터는, 데이터식을 평가해, 평가 결과중의 offset 바이트로부터 개시해 length 아르바이트 계속한다 substring를 돌려줍니다. offset 와 length 는 모두 수치식입니다. data-expr, offset, length 중 한쪽이 하늘이라고 평가되는 경우, 결과도 또 비웁니다. offset 가, 평가된 데이터의 길이 이상인 경우, 길이 0 의 데이터 캐릭터 라인이 돌려주어집니다. length 가, 평가된 데이터의 offset 보다 후의 길이보다 큰 경우, 평가된 데이터의 offset 로부터 종단까지의 전데이터를 포함한다 데이터 캐릭터 라인이 돌려주어집니다.

suffix (data-expr, length)

    suffix 오퍼레이터는, data-expr 를 평가해, 평가 결과의 마지막 length 바이트를 돌려줍니다. length 는 수치식입니다. data-expr 또는 length 의 평가 결과가 하늘의 경우, 결과도 또 비웁니다. suffix (역주: length 가 올바르다고 생각됩니다) 의 평가 결과가 평가된 데이터의 길이보다 큰 경우, 평가된 데이터가 돌려주어집니다.

option option-name

    option 오퍼레이터는, 서버가 응답 처리중의 패킷안의, 지정한 옵션의 내용을 돌려줍니다.

config-option option-name

    config-option 오퍼레이터는, 지정한 옵션에 대해, DHCP 클라이언트 또는 서버가 송출하도록(듯이) 설정된 값을 돌려줍니다.

hardware

    hardware 오퍼레이터는, 데이터 string를 돌려줍니다. 데이터 string의 최초의 요소는, 대상 패킷이 가리키는 네트워크 인터페이스의 타입이며, 후속 하는 요소는, 클라이언트의 링크층 주소입니다. 패킷이 존재하지 않는 경우 혹은 RFC2131 hlen 필드가 무효인 경우, 결과는 비웁니다. 하드웨어 타입에는, 이더넷(ethernet) (1), 토큰링 (6), FDDI (8)가 포함됩니다. 하드웨어 타입은 IETF 에 의해 규정되어 어떻게 타입의 수치가 정의될까의 자세한 것은 RFC2131 (ISC DHCP 배포물에서는, doc/ 서브 디렉토리에 있습니다)(을)를 참조해 주세요.

packet (offset, length)

    packet 오퍼레이터는, 대상 패킷의 지정 부분을 돌려주는지, 대상 패킷이 없는 문맥에서는 하늘을 돌려줍니다. offset 와 length 는, substring 오퍼레이터와 같게, 패킷의 내용에 적용됩니다.

string

    쿼트로 괄string는 데이터식으로서 지정 가능하고, 쿼트의 사이를 ASCII encode 한 것 텍스트를 돌려줍니다. backslash ('\') 캐릭터는 C 프로그램과 같이 특별 취급 됩니다: 즉 '\t'는 탭을, '\r'는 복개를, '\n'는 개행을, '\b'는 벨을 의미합니다. 8 진수치는 '\nnn'로 지정 가능하고, nnn 는 0 이상 0377 이하의 8 진수치입니다. 16 진수치는 '\xnn'로 지정 가능하고, nn 는 0 이상 0xff 이하의 16 진수치입니다.

colon-seperated hexadecimal list

    코론으로 단락지어진 16 진수의 8중창치의 리스트를, 데이터식으로서 지정 가능합니다.

concat (data-expr1, ..., data-exprN)
    식이 평가되어 각 평가 결과가 서브식의 차례로 연결됩니다. 서브식의 몇개의 평가 결과가 비우는 경우, 연결의 결과는 비웁니다.

reverse (numeric-expr1, data-expr2)
    2 개의 식이 평가되어 데이터식의 평가 결과가 그 자리에서 반전됩니다. 반전은, 수치식에서 지정되는 크기의 단위로 행해집니다. 예를 들면, 수치식의 평가 결과가 4 의 경우로, 데이터식의 평가 결과가 12 바이트가 되는 경우, reverse 식의 평가 결과는, 다음과 같은 12 바이트의 데이터가 됩니다. 즉, 입력의 마지막 4 바이트, 한가운데의 4바이트, 최초의 4 바이트의 순서가 됩니다.

leased-address
    어떠한 문맥에 대해도, 요구 처리 대상이 되고 있는 클라이언트에 IP 주소가 할당제의 경우, 그 IP 주소가 돌려주어집니다.

binary-to-ascii (numeric-expr1, numeric-expr2, data-expr1, data-expr2)
    data-expr2 의 평가 결과를 텍스트 string로 변환합니다. 이 텍스트 string중에서는, data-expr2 의 평가 결과의 각 요소가, 1 개의 수치가 됩니다. 각 수치는, 각각, data-expr1 의 평가 결과에 의해 단락지어집니다. numeric-expr1 의 평가 결과는, 기수 (2 에서 16)이며, 이 기수에 수치가 변환됩니다. numeric-expr2 의 평가 결과는, 각 수치의 비트폭이며, 8, 16, 32 의 머지않아인가입니다.

    최초의 3 개의 타입의 식의 예로서 클라이언트에 할당할 수 있었던 IP 주소용의 PTR 레코드의 이름을 생성하기 위해서 사용 가능한 식을 나타냅니다

        concat (binary-to-ascii (10, 8, ". ",
                                 reverse (1, leased-address)),
                ".in-addr.arpa. ");

encode-int (numeric-expr, width)
    수치식이 평가되어 지정된 폭의 데이터 string에 네트워크 바이트순서 (최상정도 아르바이트가 최초)로 encode 됩니다. 수치식의 평가 결과가 하늘의 값이 되는 경우, 결과도 또 하늘입니다.

pick-first-value (data-expr1 [ ... exprn ] )
    pick-first-value 함수는, 임의개의 데이터식을 취할 수 있습니다. 리스트의 선두로부터 각 식이 평가되어 평가 결과가 하늘이 아닌 식이 발견될 때까지 이것이 계속됩니다. 이 식이 돌려주어져 이 식에 후속 하는 식은 평가되지 않습니다. 모든 식의 평가 결과가 하늘의 경우, 하늘의 값이 돌려주어집니다.

host-decl-name
    host-decl-name 함수는, 현재 요구 처리 대상이 되고 있는 클라이언트에 매치 하는, 호스트 선언의 이름을 돌려줍니다. 어느 호스트 선언도 매치 하지 않는 경우, 결과는 비웁니다.

수치식
수치식은, 평가 결과가 정수가 되는 식입니다. 일반적으로, 정수의 최대 사이즈가 32 비트 미만이라고 가정해야 하지는 않습니다만, 정수의 정밀도가 32 비트를 넘는 것은 있습니다.

extract-int (data-expr, width)

    extract-int 오퍼레이터는, 네트워크 바이트순서의 정수를, 지정한 데이터식의 평가 결과로부터 꺼냅니다. 폭은, 꺼내는 정수의 비트폭입니다. 현재, 서포트되고 있는 폭은 8, 16, 32 의 머지않아인가입니다. 데이터식의 평가 결과가, 지정한 크기의 정수로 꺼내는데 충분한 비트를 제공하지 않는 경우, 하늘의 값이 돌려주어집니다.

lease-time

    현재의 리스의 기간입니다. 즉, 현재의 시각과 리스의 기한이 지날 때 각과의 차이입니다.

number

    0 으로부터 표현 가능한 최대 사이즈의 범위의 임의의 수치를, 수치식으로서 지정 가능합니다.

client-state

    처리 대상의 클라이언트의 현재 상태입니다. DHCP 클라이언트 설정 파일에 대해서만 유용합니다. 취할 수 있는 값은 다음과 같습니다:

    •   Booting - DHCP 클라이언트는 INIT 상태이며, IP 주소를 아직 가지지 않습니다. 다음에 송신되는 메세지는 DHCPDISCOVER 이며, 이것은 브로드캐스트 됩니다.

    •   Reboot - DHCP 클라이언트는 INIT-REBOOT 상태입니다. IP 주소를 가집니다만 아직 사용하고 있지 않습니다. 다음에 송신되는 메세지는 DHCPREQUEST 이며, 이것은 브로드캐스트 됩니다. 응답이 아무것도 들리지 않으면 클라이언트는 이 주소에 바인드 해, BOUND 상태에 천이 합니다.

    •   Select - DHCP 클라이언트는 SELECTING 상태입니다. 적어도 1 개의 DHCPOFFER 메세지는 수신했습니다만, 다른 DHCPOFFER 메세지를 다른 서버로부터 받는지 어떤지 기다리고 있습니다. SELECTING 상태에서는 메세지는 송신되지 않습니다.

    •   Request - DHCP 클라이언트는 REQUESTING 상태입니다. 적어도 1 개의 DHCPOFFER 메세지를 수신해, 그 중의 어떤 것을 요구하는지 선택했습니다. 다음에 송신되는 메세지는 DHCPREQUEST 메세지이며, 이것은 브로드캐스트 됩니다.

    •   Bound - DHCP 클라이언트는 BOUND 상태입니다. IP 주소를 소유하고 있습니다. 이 상태에서는 메세지는 송신되지 않습니다.

    •   Renew - DHCP 클라이언트는 RENEWING 상태입니다. IP 주소를 소유하고 있어, 이것을 갱신하기 위해서 서버에 접속을 시도하고 있습니다. 다음에 송신되는 메세지는 DHCPREQUEST 메세지이며, 이것은 서버에 직접 uni-cast 됩니다.

    •   Rebind - DHCP 클라이언트는 REBINDING 상태입니다. IP 주소를 소유하고 있어, 이것을 갱신하기 위해서 임의의 서버에 접속을 시도하고 있습니다. 다음에 송신되는 메세지는 DHCPREQUEST 메세지이며, 이것은 브로드캐스트 됩니다.

참조: 로그
로그문을 사용해, 표준 로그 채널에 정보를 송신 가능합니다. 로그문은, 생략 가능한 priority (fatal, error, info, debug 의 어느쪽이든)(와)과 데이터식을 취합니다.

log (priority, data-expr)

로그문은, 단일의 데이터식 인수만 취합니다. 복수의 데이터치를 출력하고 싶은 경우, concat 오퍼레이터를 사용해 그것들을 연결할 필요가 있습니다.

참조: 동적인 DNS 갱신

DHCP 클라이언트와 서버는, 동적으로 도메인 네임 시스템을 갱신하는 능력이 있습니다. 설정 파일중에, 어떻게 도메인 네임 시스템을 갱신해 주었으면 한지, 정의 가능합니다. 갱신은 RFC 2136 에 따르고 있기 (위해)때문에, RFC 2136 을 서포트하는 DNS 서버는, DHCP 서버로부터의 갱신을 접수 가능이라고 생각됩니다.

보안
TSIG 및 DNSSEC 는 아직 서포트되고 있지 않습니다. DHCP 서버 또는 클라이언트로부터의 갱신을 받아들이도록(듯이) DNS 서버를 설정하는 경우, 권한이 없는 갱신에 대해서 DNS 서버를 쬐게 될지도 모릅니다. 이것을 피하기 위해서(때문에) 금방 할 수 있는 최선의 방법은, IP 주소 베이스의 패킷 필터를 사용해, 권한이 없는 호스트로부터의 갱신 요구 발행을 억제하는 것입니다. 분명하게, 현재 상태로서는 클라이언트의 갱신에 대한 보안를 제공하는 방법은 없습니다. 이 때문에는 TSIG 나 DNSSEC 가 필요합니다만, 이 DHCP 배포물에게는 아직 포함되어 있지 않습니다.

동적 DNS (DDNS) 갱신은, dns-update 식을 사용하는 것으로 실행됩니다. dns-update 식은, 불식이며, 4 개의 파라미터를 취합니다. 갱신에 성공하면(자), 결과는 실로 됩니다. 실패하면(자), 결과는 가짜가 됩니다. 4 개의 파라미터는, 리소스 레코드 타입 (RR), RR 의 좌변, RR 의 우변, 레코드에 적용되어야 할 ttl 입니다. 이 함수의 가장 간단한 사용예는, dhcpd.conf 파일의 참조절에 있어, 뭐가 일어나든가 기술되고 있습니다. 이 예에서는, 복수의 식이 사용되어, dns-update 용의 인수가 작성되고 있습니다.

예의 안에서는, 최초의 dns-update 식에의 1 번째의 인수는, A RR 타입에 평가되는 데이터식입니다. 2 번째의 인수는, DHCP host-name 옵션과 로컬 도메인, 이 경우 "ssd.example.net", (을)를 포함한 텍스트 string를 연결하는 것으로, 구축됩니다. 3 번째의 인수는, 클라이언트에 할당할 수 있었던 주소를, 32 비트의 수치로부터 각 바이트를 ". " 그리고 단락지은 ASCII 캐릭터 라인으로 변환하는 것으로, 구축됩니다. 4 번째의 인수 TTL 는, 리스의 남은 시간입니다 (이것은 사실은 올바르지는 않습니다. 왜냐하면 DNS 서버는, 요구에 대해서 언제나 이 TTL 치를 출력해 버리기 때문입니다. 이것은, 리스 기한 마감의 몇 초전이어도입니다).

최초의 dns-update 문이 성공하면(자), 계속해 2 번째의 갱신에 의해 PTR RR 가 인스톨 됩니다. PTR 레코드의 인스톨은, A RR 의 인스톨과 같습니다만, 레코드의 좌변은 리스 된 주소를 반대로 해 ".in-addr.arpa" 와 결합된 것입니다. 우변은, 주소의 리스 제공처 클라이언트의, 완전한 형태에서의 도메인명입니다.

관련 항목
dhcpd.conf(5), dhcpd.leases(5), dhclient.conf(5), dhcp-eval(5), dhcpd(8), dhclient(8), RFC2132, RFC2131

저자
Internet Software Consortium DHCP Distribution (은)는, Vixie Labs 와의 계약 아래에서, Ted Lemon 가 기술했습니다. 본프로젝트의 자금은, Internet Software Consortium 가 제공했습니다. Internet Software Consortium 에 관한 정보는, http://www.isc.org 에 있습니다.