네트워크_04 호스트명으로 IP 주소 취득하기

 
  • 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어

명령어: arp, awk
키워드: MAC 주소, IP 주소, ARP
사용처: 네트워크에서 IP 주소를 지정해서 대상의 물리 주소(MAC 주소)를 검색하고 싶을 때

실행 예제

$ ./hostip.sh
Address of www.google.com
==========================
173.194.120.81 IPv4
173.194.120.80 IPv4
173.194.120.83 IPv4
173.194.120.82 IPv4
173.194.120.84 IPv4
2404:6800:4004:80c::1012 IPv6

스크립트

#!/bin/sh

# IP 주소를 얻고 싶은 호스트명 정의
fqdn="www.google.com"

echo "Address if $fqdn"
echo "===================="


# host 명령어로 IP 주소 얻기, awk 가공해서 출력

host $fqdn | \  # ------------------------------ 1
awk '/has address/ {print $NF,"IPv4"} \ # =----- 2
/has IPv6 address/ {print $NF,"IPv6"}' # ------- 3

   

해설

이 스크립트는 host 명령어를 사용해서 지정한 호스트명을 해석해서 IP 주소를 표시합니다. 실행 예제에서는 www.google.com의 IP 주소를 표시합니다. 그런데 환경에 따라서는 host 명령어를 찾을 수 없어서 에러가 발생하기도 합니다. 그럴 때는 주의사항을 살펴보고 프로그램을 설치하기 바랍니다.

이름 해석은 네트워크에서 호스트명의 IP 주소를 얻습니다. 예를 들어 평소에 사용하는 웹 브라우저 주소창에 http://www.example.org/라고 입력하면 컴퓨터 내부에서는 우선 DNS 서버에 문의해서 www.example.org 이름을 해석하고 결과로 203.0.113.1 같은 IP 주소를 얻은 다음 그 주소로 통신합니다.

  • DNS 이름 해석

이런 이름 해석은 재미는 없지만 중요한 네트워크 통신 요소입니다. IP 주소로는 통신이 가능한데 호스트명을 지정했을 때 접속되지 않는다면 이름 해석이 제대로 되지 않았을 경우가 많습니다. 이런 문제를 해결하는 도구로 이 스크립트가 쓸모 있을 것입니다.

셸 스크립트에서 DNS 서버에 문의해서 이름 해석을 하려며 nslookup 명령어나 dig 명령어 등을 사용하는데 이번 예제에서는 표시가 간결한 host 명령어를 사용합니다. www.google.com의 host 명령어 출력 결과는 다음과 같습니다.

$ host www.google.com
www.google.com has address 173.194.120.81
www.google.com has address 173.194.120.80
www.google.com has address 173.194.120.83
www.google.com has address 173.194.120.82
www.google.com has address 173.194.120.84
www.google.com has IPv6 address 2404:6800:4004:813::2004

대규모 사이트라면 부하 분산을 위해 동일한 FQDN(전체 주소 도메인 이름 : Fully Qualified Domain Name)에 여러 IP 주소를 가질 때가 많으며 www.google.com에 대해서도 여러 IP 주소가 표시됩니다. 또한 host 명령어는 대상 FQDN에 IPv6 주소도 있다면 “www.example.org has IPv6 address…..” 처럼 IPv4 주소와 함께 IPv6 주소도 표시합니다.

대규모 사이트라면 부하 분산을 위해 동일한 FQDN(전체 주소 도메인 이름 : Fully Qualified Domain Name)에 여러 IP 주소를 가질 때가 많으며 www.google.com에 대해서도 여러 IP 주소가 표시됩니다. 또한 host 명령어는 대상 FQDN에 IPv6 주소도 있다면 “www.example.org has IPv6 address…..” 처럼 IPv4 주소와 함께 IPv6 주소도 표시합니다.

예제에서는 1에서 우선 셸 변수 fqdn에 지정된 호스트명을 해석을 하기 위해 host 명령어를 실행합니다. 이 결과를 awk로 파이프 처리하는데, 명령이 길어서 끝에 \를 붙여서 줄바꿈을 넣습니다.

2에서 awk 명령어로 패턴을 두 개 설정합니다. 첫번째 패턴은 /has address/로 IPv4주소를 취득합니다. 이 패턴에 일치하는 줄은 다음처럼 마지막에 IP주소가 들어갑니다.

www.example.org has address 203.0.113.1

awk로 마지막 컬럼을 추출하려면 마지막 컬럼을 표시하는 변수 NF를 써서 print $NF라고 작성합니다. 여기에서는 그 뒤에 “IPv4”와 스페이스를 표시합니다.

awk 명령어의 두 번째 패턴은 /has IPv6 address/로 IPv6 주소를 얻습니다. IPv6 주소 때와 마찬가지로 마지막 컬럼에 IP주소가 들어가 있으므로 이걸 awk 변수 NF로 추출해서 출력합니다.

   

주의사항

  • CentOS를 최소 구성으로 설치하면 host 명령어가 설치되지 않습니다. 따라서 다음처럼 yum 명령어로 bind-utils 패키지를 설치하기 바랍니다. 제대로 설치되었는지 which 명령어로 확인할 수 있습니다.

    • bind-utils 패키지에 포함된 host 명령어 설치(CentOS)
    $ su
    Password: 패스워드 입력
    # yum install bind-utils
    # exit
    $ which host
    /usr/bin/host
    
  • 우분투에서 host 명령어는 기본적으로 설치됩니다. 만약 설치되어 있지 않으면 apt-get 명령어로 bind9-utils 패키지를 설치합니다.

  • ost 명령어는 DNS 서버에 문의해서 이름을 해석하는 명령어입니다. 따라서 이 스크립트에서는 /etc/hosts에 적힌 설정 내용을 무시합니다.