Linux의 DNS를 공부해보자.
동일한 네트워크에 속한 두 대의 컴퓨터 A, B는 각각 192.168.1.10
과 192.168.1.11
이라는 IP를 할당받았다.
컴퓨터의 IP 주소를 사용하여 다른 컴퓨터에서 한 컴퓨터에 ping을 던질 수 있다.
시스템 B에 데이터베이스 서비스가 있다는 것을 인지했으므로, 시스템 B의 IP 주소 대신 db라는 이름으로 시스템을 인식할 것이다.
이제 db
에 ping을 시도하면 호스트 A가 db라는 호스트를 인식하지 못하는 것을 확인할 수 있다.
기본적으로 시스템 A에게 IP 주소 192.168.1.11
의 시스템 B에 db
가 있음을 알려주어야 한다. 시스템 A에게 db
는 192.168.1.11
이라는 IP를 가리키고 있음을 알려주어야 한다.
시스템 A의 /etc/hosts
파일에 항목을 추가하여 이를 수행할 수 있다.
이제 시스템 A에게 db = 192.168.1.11
임을 알려주었으므로 db
에 대해 ping을 전송할 수 있게 될 것이다.
시스템 A는 /etc/hosts
파일에 db
가 192.168.1.11
이라고 적혀있기 때문에 실제 db
가 192.168.1.11
이라는 주소를 가리키지 않아도 그렇게 인식할 수 밖에 없다. (실제 이름을 확인하지 않는다.)
예를 들어 시스템 B에서 hostname
명령을 실행하면 host-2
라고 뜨므로 시스템 B의 hostname은 host-2
이지만 호스트 A는 신경쓰지 않는다.
시스템 B가 Google이라고 믿도록 시스템 A를 속일 수 있다.
www.google.com
에 대한 IP 매핑을 사용하여 호스트 파일에 항목을 추가하고, Google에 ping을 전송하면 시스템 B가 응답을 준다.
따라서 동일한 시스템을 가리키는 두 개의 이름(db
, Google
)이 존재하게 되는 것이다.
호스트 A에서 이름으로 다른 호스트를 참조할 때마다 (ping 커맨드나 SSH 커맨드, 애플리케이션이나 tool 이용) 호스트는 해당 호스트의 IP 주소를 찾기 위해 /etc/hosts
파일에서 검색하게 된다.
이러한 방식으로 호스트 이름을 IP 주소로 변환하는 것을 name resolution이라고 한다.
소수의 시스템으로 구성된 소규모 네트워크에서는 /etc/hosts
파일의 항목을 쉽게 사용할 수 있다. (각 시스템에서 모두 다른 시스템을 지정한다.)
과거에는 그렇게 했지만 환경이 커지면 이러한 파일과 항목을 관리하는 것이 어려워지게 된다.
서버 중 하나의 IP가 변경되면 모든 호스트에서 항목을 수정해야 한다. 따라서 이 모든 항목을 중앙에서 관리할 단일 서버를 두기로 했고, 이 서버를 DNS 서버
라고 부른다.
자체 /etc/hosts
파일 대신 호스트 이름을 IP 주소로 확인해야 하는 경우 모든 호스트가 해당 서버를 조회하도록 지정한다.
DNS 서버의 IP는 192.168.1.100
이다. 모든 호스트에는 /etc/resolv.conf
에 DNS resolution configuration 파일이 있다.
DNS 서버의 주소를 지정하여 항목을 추가한다. nameserver
라고 하고, 192.168.1.100
을 가리키면 된다.
이것이 모든 호스트에 configuration 되면 호스트가 알지 못하는 호스트 이름을 발견할 때마다 DNS 서버에서 조회한다.
호스트의 IP가 변경되는 경우, DNS 서버를 업데이트 하기만 하면 모든 호스트가 앞으로 새로운 IP 주소를 확인할 수 있다.
더이상 모든 호스트의 /etc/hosts
파일 항목이 필요하지 않다.
그러나 이것이 호스트 파일에 항목을 가질 수 없다는 의미는 아니다. 호스트 파일 내의 항목을 추가할 수 있다.