Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

dhcp client 설정

dhcp는 L7 프로토콜이다. 운영체제의 네트워크 설정을 위해서 dhcp를 사용하기로 했다면, 운영체가 올라오면서 dhcp client를 실행한다. dhcp client는 dhcp 요청을 해당 서브네트워크에 브로드캐스팅을 한다. 만약 브로드캐스팅 영역에 dhcp 서버가 올라와 있다면, dhcp 서버가 요청을 받아서 응답을 전송할 것이다.

dhcp로 설정할 수 있는 것들은 다음과 같다.
  1. IP Address : client pc의 IP 주소
  2. BOOTP 정보
  3. subnet mask
  4. router : default gateway
  5. IP lease time : IP 유효시간
  6. DNS : dns 서버 주소
이 정보들은 dhcp 서버 설정파일에서 찾을 수 있다.

이제 dhcp client 측에서 이 정보들을 이용하기 위해서 어떤 파일들을 수정해야 하는지 알아볼 것이다. 리눅스 운영체제 마다 약간씩 차이가 있는데, 우분투 리눅스와 CentOS를 대상으로 정했다.

일반적인 네트워크 설정

일반적인 네트워크 설정 방법은 네트워크 설정문서를 참고한다.

Ubuntu

  • 운영체제 버전 : Ubuntu Linux 12.04
  • dhcp client 버전 : isc-dhclient-4.1-ESV-R4
네트워크 인터페이스 설정파일은 /etc/network/interfaces 다. 설정은 다음과 같다.
auto lo
iface lo inet loopback

## static network 설정
iface eth0 inet static 
address 192.168.57.99 
netmask 255.255.255.0
gateway 102.168.57.1

## dhcp 설정
auto eth1
iface eth1 inet dhcp

host name 설정

이제 운영체제가 올라오면 dhcp client가 실행 되고, 자신이 속해 있는 subnet에 dhcp 요청을 브로드캐스팅한후 응답을 받아서 그대로 적용하면 그걸로 끝이다. 간단하다.

dhcp의 일차 용도는 관리 네트워크에 접속하려는 노드가 쉽게 네트워크 환경을 설정을 할 수 있도록 도와주기 위함이다. 또 다른 용도는 내부 네트워크 자원을 관리하기 위함이다. 이 경우 할당할 ip range에서 남는 ip를 선택해서 할당하는 방식 대신 MAC을 검사해서 ip를 할당하는 방식을 사용할 것이다. host name도 함께 관리할 것이다.

다른 네트워크 정보는 더 이상 손볼게 없는데 host name(이하 호스트 이름)쪽은 좀 봐야 한다.

기본적으로 호스트 이름은 운영체제 설정을 따르기 때문에, 운영체제의 호스트 이름 설정하는 부분에 대한 수정이 필요하다. /etc/hostname/etc/hosts다.

예를 들어 dhcp server에서 호스트 이름을 node01.yundream.com 으로 설정했다면, 예컨데 설정이 아래와 같다면
## ... 생략
host ubuntu {
        option host-name "node01.yundream.com";
        hardware ethernet 08:00:27:21:6f:cc;
        fixed-address 192.168.57.10;
}
## ... 생략

네트워크 설정이 적용되는 "타겟 호스트"의 hostname과 hosts를 변경해야 한다. 이건 파일을 수정하는 작업이기 때문에, 각 파일을 수정하는 스크립트를 만들어야 한다. dhcp client는 네트워크 설정이 적용된 후에 실행될 스크립트 파일을 설치할 수 있다.

스크립트의 위치는 /etc/dhcp/dhclient-exit-hooks.d가 되겠다. 나는 아래와 같은 스크립트를 만들었다.
# cat hostname 
#!/bin/bash

# $reson : dhcp client의 종료 상태정보를 가지고 있다. BOUND는 새로운 주소로 설정됐음을 의미한다.
# new_host_name 변수가 설정돼 있는지 검사한다. new_host_name 변수는 호스트 이름을 가지고 있다. 
# /etc/hostname.lock 파일이 있는지 검사한다. 이 파일은 hostname을 변경할지를 검사하기 위해서 사용한다. 
# 현재 hostname 과 $new_host_name을 비교하는 방법도 있을 것이다. 
if [ "$reason" == BOUND ] && [ -v new_host_name ] && [ ! -e /etc/hostname.lock ]
then
        echo $new_host_name > /etc/hostname
        echo $new_host_name > /etc/hostname.lock
        echo "127.0.0.1" $new_host_name > /tmp/hosts
        cat /etc/hosts >> /tmp/hosts
        cp -f /tmp/hosts /etc/hosts 
fi

CentOS

/etc/sysconfig/network-scripts 밑에 인터페이스 별로 설정파일이 위치한다. 개인적으로 centos의 설정관리법이 맘에 든다. ifcfg-eth0 의 내용은 다음과 같다.
[root@centos network-scripts]# cat ifcfg-eth0 
DEVICE="eth0"
BOOTPROTO="dhcp"
NM_CONTROLLED="yes"
ONBOOT="yes"
TYPE="Ethernet"
UUID="a7989039-b913-4456-9f90-b378bc9bcc2c"
BOOTPROTO를 dhcp로 하면 된다.

Ubuntu 리눅스에서와 마찬가지로 hostname을 변경하려면, 스크립트를 만들어야 한다. 다행히 우분투 리눅스와 완전히 동일하다.

dhcp와 resolv.conf

CentOS, Ubuntu 모두 /etc/resolv.conf에 도메인 서버를 등록할 수 있다.

dhcp로 부터 dns name server 설정하기

CentOS와 Ubuntu 모두 별다른 설정을 하지 않으면, dhcp server가 전달해준 dns server 값으로 /etc/resolv.conf 를 만든다. /etc/resolv.conf가 이미 있다면, 덮어써 버린다.

dns name server 변경을 허용하지 않기

dhcp client가 알아서 /etc/resolv.conf를 수정해주면 편하긴 하지만, 때로 문제가 될 수도 있다. 개발이나 시스템 관리등의 이유로 resolv.conf를 수정해서 사용해야 할 때가 있는데, dhcp client가 재 시작할 때 마다 resolv.conf를 덮어써 버리기 때문이다.

/etc/resolv.conf를 보호하는 방법을 살펴보자.

chattr 이용하기

가장 간단한 방법이다. chattr을 이용하면 파일의 속성을 변경할 수 있는데, -i 옵션을 이용해서 "수정불가"로 만들 수 있다. 아래와 같이 하면 된다.
# chattr +i /etc/resolv.conf
"-i" 옵션으로 수정가능하게 만들 수 있다.

리눅스 파일시스템에서 지원하는 기능이기 때문에 간단하게 사용할 수 있는데, chef 등에서 사용 할 때 사소한 문제가 있다. 왠일인지 chef에서 bash resource로 chattr을 실행했는데, -i 속성이 먹히지(+i 속성은 먹힌다) 않는다.

네트워크 설정 파일 수정

CentOS의 경우 네트워크 스크립트파일을 수정해서 resolv.conf 파일을 보호할 수 있다.
# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eht0
BOOTPROTO=dhcp
ONBOOT=yes
PEERDNS=no
PEERDNS
  • yes : dhcp client가 /etc/resolv.conf를 수정하도록 허용한다.
  • no : /etc/resolv.conf를 수정하지 못하게 한다.

히스토리

  1. 작성일 :