IT/통신프로토콜 실습&연습문제

통신프로토콜 DNS(2)

뚱늉 2016. 12. 20. 00:05

1. Hosts 파일을 이용한 이름과 IP address mapping 실습

 

(1)  vi /etc /hosts 명령어를 통해 hosts파일을 열어 ip+도메인주소의 정보가 없는 것을 확인한다.

 

(2) vi /etc /hosts 명령어를 통해 hosts파일을 열어  ip+도메인주소의  정보를 입력 한다.ex) 127.0.0.1 localhost localhost.localdomain localhost4 local host4. localdomain4

::1 localhost localhost. localdomain localhost6 localhost6. localdomain6

115.68.7.43 infocom.aaa.ac.kr

(3)  hosts파일에 ip+도메인주소의 정보를 입력한 후 ping명령어를 발생 시킨다. 그럼 위와 같이 패킷이 수집되지 않는데 패킷이 수집되지 않는 이유는 입력한  ip주소가 자신의 hosts파일에 있기 때문에 DNS 패킷이 수집되지 않는 것을 알 수 있다.

 

2. IP address를 응답받기 위한 DNS query (Type A) 절차 분석 실습

 

 ⦁ DNS query request 패킷의 내용을 hex값으로 적고 그 내용을 분석

 

 

ex)

 

 

 

 

 

 

 

 

 

 

 74

 fc

 01

 00

 00

 01

 00

 00

 00

 00

 00

 00

 07

 69

 6e

 66

 6f

63

6f

 6d

04 

 69

 6e

 6a

 65

 02

 61

 63

 02

 6b

 72

 00

 00

 01

 00

 01

 

 

 

- 74 fc : identification 값이다.

- 01 00 : flags의 값이다. Q/R영역은 0의 값으로 Request인 것을 나타내고 OPCode영역은 0000의 값으로 표준 query를 나타내고 TC영역은 Request이기 때문에 0이 들어가고 RD영역 단말이  recursive query방식을 원하기 때문에 1의 값이 들어가고 RA영역은 Request이기 때문에 위의 사진에는 나타나 있지 않지만 0의 값이 들어가 있을 것이고 예약필드는 0으로 0 0 0의 값이 들어가고 AA영역은 Request이기 때문에 0의 값이 들어가게 된다. 마지막으로 R code영역은 Request이기 때문에 값이 저장되어 있지 않는 것을 알 수 있다.

- 00 01 : number of questions의 값이다.

- 00 00 : number of answer RRs의 영역내며 Request이기 때문에 00 00이 들어가는 것을 알 수 있다.

- 00 00 : number of authority RRs의 영역내며 Request이기 때문에 00 00이 들어가는 것을 알 수 있다.

- 00 00 : number of additional RR의 영역내며 Request이기 때문에 00 00이 들어가는 것을 알 수 있다.

- 07 69 6e 66 6f 63 6f 6d 04 69 6e 6a 65 02 61 63 02 6b 72 00 00 01 00 01 : Questions을 나타낸다. 07은 뒤에 7byte는 각 name의 아스키 코드 값을 나타낸다.(02 02 도 마찬가지)따라서 각각 infoncom inje ac kr을 나타내며 마지막 00은 name의 끝을 알려준다. 00 01은 Query type(Type A)을 나타낸다. 00 01은 Query class(Internet)를 나타낸다.

 

⦁ DNS query response 패킷의 내용을 hex값으로 적고 그 내용을 분석

 

ex)

 

 

 

 

 

 

 

 

 

 

74

fc

85

80

00

01

00

01

00

01

00

01

07

69

6e

66

6f

63

6f

6d

04

69

6e

6a

65

02

61

63

02

6b

72

00

00

01

00

01

c0

0c

00

01

00

01

00

00

0e

10

00

04

73

44

07

2b

c0

14

00

02

00

01

00

00

0e

10

00

07

04

62

61

64

61

c0

14

c0

40

00

01

00

01

00

00

0e

10

00

04

cb

f1

fa

16

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

- 74 fc : identification의 값이다.

 

- 85 80 : flags의 값이다. Q/R영역은 1로 Response를 나타내고 OPCode는 0000으로 표준 Query를 나타내고, AA는 1로 Authoritative DNS server가 보낸 것이 라는 것을 알 수 있고 TC는 0으로 Response의 길이가 512Byte이하 인 것을 알 수 있고, RD는 1로 단말이 Recursive query방식을 원했다는 것을 알 수 있고, RA는 1로 RD에 대한 응답으로 Recursive query방식을 지원하는 것을 알 수 있고, 예약필드는 기본 값으로 000 이 저장되어 있고, R code영역은 Error가 발생 하지 않아 0000의 값이 들어가 있는 것 알 수 있다.

- 00 01 : number of questions의 값이다. 이 패킷의 Question의 개수는 1개 인 것을 알 수 있다.

- 00 01 : number of answer RRs의 값이다. Response를 받았기에 1개로 나타난다.

- 00 01 : number of authority RRs의 값이다. infocom.inje.ac.kr에 해당하는 ip주소를 가지는 DNS server가 직접 응답해주었다는 것을 알 수 있다.

- 00 01 : number of additional RRs의 값이다. 추가적으로 다른 DNS server에서도 Response가 발생 한 것을 알 수 있다.

- 07 69 6e 66 6f 63 6f 6d 04 69 6e 6a 65 02 61 63 02 6b 72 00 00 01 00 01 : Question에 대한 정보이다. query request message에 있는 Question영역의 값과 같다.

- c0 0c 00 01 00 01 00 00 0e 10 00 04 73 44 07 2b : c0 0c는 DNS message시작 후 0x0c 뒤에 name이 있다는 것을 알려 준다. 00 01 00 01 은 type과 class를 나타내며 00 00 0e 10은 TTL을 나타낸다. 또, 00 04는 Resource data의 길이를 나타내며 73 44 07 2b 는 Resource data를 나타낸다. 73 44 07 2b는 115.68.7.43 으로 infocom.inje.ac.kr의 ip주소는 115.68.7.43인 것을 알 수 있다.

- c0 14 00 02 00 01 00 00 0e 10 00 07 04 62 61 64 61 c0 14 : c0 14는 DNS message시작 후 0x14 뒤에 name이 있다는 것을 알려 준다. 00 02은 type을 나타내며 authoritative DNS server가 응답 했다는 것을 알려주고, 00 01은 class를 나타내며 internet인 것을 알 수 있다. 00 00 0e 10은 TTL을 나타내며 00 07은 Response data의 길이를 나타내며 04 62 61 64 61 c0 14는 Response data를 나타낸다.

 

- c0 40 00 01 00 01 00 00 0e 10 00 04 cb f1 fa : c0 40은 DNS message시작 후 0x40뒤에 name이 있다는 것을 알려 준다. 00 01 00 01 은 type과 class를 나타내며 ip주소를 응답하고 internet이라는 것을 알 수 있다. 00 00 0e 10은 TTL을 나타내며 00 04는 Response data의 길이를 나타내며 나머지 cb f1 fa 16는 Response data를 나타내고 infocom.inje.ac.kr의 또다른 ip주소는 203.241.250.22인 것을 알 수 있다.

 

 

3. Domain name을 응답받기 위한 DNS query (Type PTR) 절차 분석 실습

 

DNS query request 패킷의 내용을 hex값으로 적고 그 내용을 분석

 

ex)

 

 

 

 

 

 

 

 

 

 

 46

 67

 01

 00

 00

 01

 00

00

 00

 00

 00

 00

 03

 32

 34

 36

 03

 31

33 

39 

02 

31 

30 

 03

 31

 30

 36

 07

 69

 6e

 2d

 61

 64

 64

 72

 04

 61

 72

70 

61 

 00

 00

 0c

 00

 01

 

 

 

 

 

 

 

 

 

 

 

- 46 67 : identification의 값이다.

- 01 00 : flags의 값이다. Q/R영역은 0의 값으로 Request인 것을 나타내고 OPCode영역은 0000의 값으로 표준 query를 나타내고 TC영역은 Request이기 때문에 0이 들어가고 RD영역 단말이 recursive query방식을 원하기 때문에 1의 값이 들어가고 RA영역은 Request이기 때문에 위의 사진에는 나타나 있지 않지만 0의 값이 들어가 있을 것이고 예약필드는 0으로 0 0 0의 값이 들어가고 AA영역은 Request이기 때문에 0의 값이 들어가게 된다. 마지막으로 R code영역은 Request이기 때문에 값이 저장되어 있지 않는 것을 알 수 있다.

 

- 00 01 00 00 00 00 00 00 : Request message이기 때문에 Questions의 영역에만 1이 들어가게 되고 다른 number of Answer RRs, number of Authority RRs, number ofAdditional RRs의 영역에는 0이 들어간다.

 

- 03 32 34 36 03 31 33 39 02 31 30 03 31 30 36 07 69 6e 2d 61 64 64 72 04 61 72 70 61 00 00 0c 00 01 : 03 32 34 36 03 31 33 39 02 31 30 03 31 30 36은 ip주소 106.10.139.246에 해당하는 아스키 코드의 값이다. 앞의 Type A와 마찬가지로 길이를 먼저 나타낸 후 그다음 각 ip자리에 대한 아스키 코드 값이 적힌다. 여기서 눈여겨 볼 점은 nslookup 106.10.139.246의 명령어를 통해 PTR DNS packet들을 수집하였다. 하지만 여기서 name string영역에 해당하는 값을 보면 246 139 10 106이 저장되어있는데 이것을 보아 앞에서 이론 설명한 부분에서 말했듯 뒤에서부터 거꾸로 검색하는 것을 알 수 있다. 07 69 6e 2d 61 64 64 72는 in-addr를 나타낸다. 07은 길이고 나머지 부분이 in-addr을 나타낸다. 04 61 72 70 61은 arpa를 나타낸다. 04는 길이고 나머지 부분이 arpa를 나타낸다. 00은 name string이 끝나는 것을 알려준다. 00 0c 00 01은 query type과 query class를 나타내는데 ip주소에 대한 name을 알기위한 RTP Type이기 때문에 type에는 00 0c가 들어가고 internet을 의미하는 00 01이 들어간다.

 

DNS query response

 

 

 

 

 

 

 

 

 

 

 

 46

 67

 81

 80

 00

 01

 00

01 

 00

 05

 00

06 

 03

 32

 34

 36

 03

31 

 33

 39

02

31 

30

03

31

30

36

07

69

6e

2d

61

64

64

72

04

61

72

70

61

00

00

0c

00

01

c0

0c

00

0c

00

01

00

00

04

54

00

1a

03

69

72

31

02

66

70

03

76

69

70

03

73

67

33

05

79

61

68

6f

6f

03

63

6f

6d

00

c0

10

00

02

00

01

00

00

a6

4c

00

06

03

6e

73

32

c0

48

c0

10

00

02

00

01

00

00

a6

4c

00

06

03

6e

73

33

c0

48

c0

10

00

02

00

01

00

00

a6

4c

00

06

03

6e

73

34

c0

48

c0

10

00

02

00

01

00

00

a6

4c

00

06

03

6e

73

35

c0

48

c0

10

00

02

00

01

00

00

a6

4c

00

06

03

6e

73

31

c0

48

c0

95

00

01

00

01

00

01

7d

53

00

04

77

a0

f7

7c

c0

5f

00

01

00

01

00

01

7d

53

00

04

44

8e

ff

10

c0

71

00

01

00

01

00

01

7d

53

00

04

cb

54

dd

35

c0

71

00

1c

00

01

00

01

ae

f6

00

10

24

06

86

00

00

b8

fe

03

00

00

00

00

00

00

10

03

c0

a7

00

01

00

01

00

01

7d

53

00

04

44

b4

83

10

c0

83

00

01

00

01

00

01

7d

53

00

04

62

8a

0b

9d

 

 

 

 

 

 

 

 

 

 

 

 

 

 

- 46 67 : identification의 값이다

 

- 81 80 : flags의 값이다. Q/R영역은 1로 Response를 나타내고OPCode는 0000으로 표준 Query를 나타내고, AA는 0로Authoritative DNS server가 아닌 다른 DNS server에서 보낸 것이 라는 것을 알 수 있고 TC는 0으로 Response의 길이가 512Byte이하 인 것을 알 수 있고, RD는 1로 단말이 Recursive query방식을 원했다는 것을 알 수 있고, RA는 1로 RD에 대한 응답으로 Recursive query방식을 지원하는 것을 알 수 있고, 예약필드는 기본 값으로 000 이 저장되어 있고, R code영역은 Error가 발생 하지 않아 0000의 값이 들어가 있는 것 알 수 있다.

 

- 00 01 00 01 00 05 00 06 : Query의 Question의 개수가 1개이고 Response가 발생하여 1이 들어 가 있고 Authority RR이 5개 발생하고 Additional RR의 개수가 6개 인 것을 알수 있다.

 

- 03 32 34 36 03 31 33 39 02 31 30 03 31 30 36 07 69 6ㄷ 2ㅇ 61 64 64 72 04 61 72 70 61 00 00 0c 00 01 : Question에 대한 정보이다. query request message에 있는 Question영역의 값과 같다.

 

- c0 0c 00 0c 00 01 00 00 04 54 00 1a 03 69 72 31 02 66 70 03 76 69 70 03 73 67 33 05 79 61 68 6f 6f 03 63 6f 6d 00 : Answer에 대한 정보이다. 이 값을 보면 c0 0c 가 나오는데 name string의 부분이 DNS message의 시작 부분부터 0x0c 뒤에 있다는 것을 나타내며 00 0c 00 01은 type과 class로 PTR Type이므로 00 0c가 들어가고 internet을 의미하는 00 01이 저장되어 있다. 00 00 04 54는 TTL을 나타내며 00 1a은 Resource data의 길이를 나타낸다.마지막으로 03 69 72 31 02 66 70 03 76 69 70 03 73 67 33 05 76 61 68 6f 6f 03 63 6f 6d 00은 Resource data의 값이다. 앞의 빨간색의 숫자는 자리수를 나타내며 파란색의 숫자는 name에 대한 정보가 아스키 코드 값으로 저장이 되어 있다. 마지막 빨간 00은 Resource data의 끝을 의미한다.

* 여기서 주의해서 볼 점은 Type A의 answer부분에는 ip주소가 Hex값으로 나타난다. RTP request 할 때처럼 ip를 아스키 코드로 바꿔서 저장이 되지 않는다. 하지만 Type RTP의 answer부분에는 name이 Type A 할 때처럼 name을 아스키 코드로 바꿔서 저장이 된다.

 

- c0 10 00 02 00 01 00 00 a6 4c 00 06 03 6e 73 32 c0 48 c0 10 00 02 00 01 00 00 a6 4c 00 06 03 6e 73 32 c0 48 c0 10 00 02 00 01 00 00 a6 4c 00 06 03 6e 73 33 c0 48 c0 10 00 02 00 01 00 00 a6 4c 00 06 03 6e 73 34 c0 48 c0 10 00 02 00 01 00 00 a6 4c 00 06 03 6e 73 35 c0 48 c0 10 00 02 00 01 00 00 a6 4c 00 06 03 6e 73 31 c0 48 : Authoritative에 대한 정보이다. number of answer RRs의 값이 00 05이였기 때문에 많은 양의 정보가 저장되어 있다. 각각의 RR에 대한 정보의 시작은 c0이 나타내어주고 name string의 위치는 c0 뒤에 있는 hex값으로 표기한다.

 

- c0 95 00 01 00 01 00 01 7d 53 00 04 77 a0 f7 7c c0 5f 00 01 00 01 00 01 7d 53 00 04 44 8e ff 10 c0 71 00 01 00 01 00 01 7d 53 00 04 cb 54 dd 35 c0 71 00 1c 00 01 00 01 ae f6 00 10 24 06 86 00 00 b8 fe 03 00 00 00 00 00 00 10 03 c0 a7 00 01 00 01 00 01 7d 53 00 04 44 b4 83 10 c0 83 00 01 00 01 00 01 7d 53 00 04 62 8a 0b 9d : Additional information의 값이다. number of additional RRs의 값이 00 06으로 RR이 6개가 발생하였기 때문에 Additional information이 가지는 정보의 양은 많다. 마찬가지로 c0이 각각의 RR의 정보가 시작하는 것을 알려주고 뒤에 있는 hex값이 name string의 위치를 알려 준다.

 

4. DNS Query 종류

① Recursive queries

 

- host가 자신의 hosts file에 자신이 알고 싶어 하는 name에 대한 ip의 정보가 없으면 host는 자신의 local DNS server에 request한다. 이때 local DNS server도 request에 대한 정보가 없으면 root DNS server(TLD(Top Level Domain)에 따른 DNS server의 정보를 가지고 있는 DNS server)에 request하고 이 root DNS server도 request에 대한 정보가 없으면 TLD를 보고 그에 맞는 TLD DNS server에 request한다. 또, TLD DNS server도 request에 대한 정보가 없으면 TLD하위에 있는 부분을 관리하는 DNS인 authoritative DNS server로 request한다. 그럼 이 authoritative DNS server는 request에 대한 정보을 reply한다. reply할 때에는 authoritative DNS server가 TLD DNS server에게 reply하고 TLD DNS server는 root DNS server에게 reply하고 root DNS server는 local DNS server에게 reply하고 마지막으로 local DNS server는 물어 보았던 host에게 알려준다. 모든 DNS가 request에 대한 정보를 모른다고 하면 request는 host → local → root → TLD → authoritative(물어보는 정보를 가지고 있는 DNS) 순으로 보내지게 되고 reply는 authoritative → TLD → root → local → host(정보를 알기 위해 request를 최초 발생시킨 단말) 순으로 보내지게 되어 마지막으로 host가 알게 되는 것이다. 만약 request를 받은 DNS들이 request에 대한 정보가 있으면 그 DNS는 다음 DNS로 request하는 것이 아니라 자신에게 request를 보낸 곳에 reply한다. 예를 들면 host가 물어보는 정보가 root DNS server에 있다고 하면 host는 request를 local DNS server에게 발생시키고 local DNS server는 정보가 없기에 root DNS server에 request를 보낸다. 그럼 root는 정보를 가지고 있기 때문에 TLD DNS server에 request하는 것이 아니라 local DNS server에 reply를 보낸다. 그럼 local DNS server는 reply를 host로 보내는 것이다.

 

- reply를 받은 DNS들은 request에 대한 정보를 버리지 않고 자신도 저장하게 된다.

 

② Iterative queries

 

- Iterative queries방식은 Recursive queries방식과 차이가 있다. Recursive queries 방식은 DNS가 해당 DNS 에 request를 보내고 reply가 올 때까지 기다리는 방면 Iterative queries방식은 local DNS server가 각 DNS에게 계속 해서 request를 한다.

 

- Iterative queries방식은 일단 host가 local DNS server에게 request하면 local DNS server는 root  DNS server에게 request한다. root DNS server는 정보가 없으면 자신이 TLD DNS server에 request하는 것이 아니라 TLD DNS server의 정보를 local DNS server에게 알려준다. 그럼 local DNS server는 TLD DNS server로 request보내고 TLD DNS server는 정보를 가지고 있지 않으면 authoritative DNS server의 정보를 local DNS server에게 알려준다. 그럼 local DNS server는 authoritative DNS server에게 request를 보내게 되고 authoritative DNS server는 request에 대한 정보를 local DNS server에게 reply하고 local DNS server는 host에게 reply하는 방식이다. 만약 정보를 가지고 있는 DNS가 있으면 다음 DNS의 정보를 알려 주는 것이 아니라 request에 대한 정보를 reply한다.

 

③ Recursive and Iterative queries

 

- Recursive and Iterative queries방식은 Recurs queries와 Iterative queries를 합쳐진 방식이다. 이 방식은 local DNS server가 root DNS server에게 request하면 root DNS server는 request에 대한 정보를 가지고 있는 DNS의 정보를 local DNS server에게 알려준다.(Iterative queries방식과 같음) 그 후 local DNS server는 root DNS server에게 받은 DNS에게 request를 하고 reply가 올 때까지 기다린다.(Recursive queries방식과 같음)