[ Network ] DNS 패킷 분석 (Wireshark)
Wireshark를 통해 DNS 패킷을 분석해보겠다.
맥북에 wireshark 설치하고 시작하려고 하니 오류부터 뜨는데 쫄지말고 OK 누르고 해결방법 찾으면 된다.
권한 문제니까 빠르게 권한 주고 시작하자.
sudo chown <사용자 이름> /dev/bpf*
Wireshark로 DNS 패킷 분석
현재 와이파이에 연결되어 있는 내 IP 주소: 192.168.0.253
패킷 필터링을 사용하여 dns 포트번호인 53 포트를 필터링하였다. (udp.port==53)
패킷 캡처를 시작하고 크롬에 접속해보았다.
첫 번째 패킷: 호스트 "lh3.google.com"의 IPv4 주소를 얻기 위한 DNS A 레코드 조회
두 번째 패킷: 호스트 "lh3.google.com"에 대한 HTTPS 연결을 설정하기 위해 DNS의 AAAA 레코드(또는 A 레코드)를 조회
AAAA 레코드는 도메인 이름에 대한 IPv6 주소를 제공하는 데 사용
세 번째 패킷: 첫 번째 요청 패킷에 대한 응답
네 번째 패킷: 두 번째 요청 패킷에 대한 응답
DNS 요청 패킷 ( =DNS 쿼리 패킷 )
IPv4를 사용하여 클라이언트(192.168.0.253)이 DNS 서버(61.41.153.2)로 쿼리를 보낸 것을 확인할 수 있다.
UDP 프로토콜을 사용하고 클라이언트는 임의의 포트(63160)를 사용하고 목적지엔 DNS 포트인 53을 사용한 것을 알 수 있다.
- Transaction ID
DNS 쿼리와 응답에 연관된다. 이 필드에서는 DNS에 관련된 모든 것을 보기 위한 값을 필터링할 수 있다. 필터링은 dns.id이다. - Flags
- Response: 패킷이 요청하는 패킷(0)인지 응답하는 패킷(1)인지 표시하는 비트
해당 비트에 대한 필터링 방법: dns.flags.response == 1 또는 dns.flags.response == 0
- Opcode: 쿼리의 유형을 지정
- Truncation: 응답이 길어서 잘렸는지에 대해 알려주는 비트. 거의 잘리는 경우가 없어서 0이다.
- Recurison Desired: 재귀를 사용하는지 안사용하는지를 알려주는 비트. 대부분은 DNS는 재귀 쿼리를 사용한다.
- Reseved: 예약된 비트. 0으로 설정되어 있다. - Questions: 몇 개의 질문인지 질문의 갯수를 표시한다. 보통 한 패킷당 한개의 질문을 가진다.
- Queries Section
- Name: DNS에 요청한 도메인의 네임, 호스트 네임이 들어간다.
- Type: 쿼리의 유형을 나타태는 필드. 여러가지 유형이 있다.
유형 | 설명 |
A | 호스트 주소 |
NS | Authoritative 네임 서버 |
CNAME | 별칭에 대한 표준 이름 |
SOA | 권한 영역의 시작 |
PTR | 포인터 레코드 |
HINFO | 호스트 정보 |
MX | 메일 교환 |
AAAA | IPv6 주소 |
- Class: 네트워크 클래스 타입을 표시한다. IN은 INternet을 의미한다.
DNS 응답 패킷
IPv4를 사용하여 DNS 서버(61.41.153.2)가 클라이언트(192.168.0.253)로 요청에 대한 응답 보낸 것을 확인할 수 있다.
응답 패킷의 flags 구조는 요청 패킷의 flags의 구조와는 다르다. 추가된 필드에 대해서만 알아보겠다.
- Flags
- Authoritative: 도메인 이름에 대해 믿을 수 있는 서버로 부터의 응답임을 표시한다. (공식 DNS서버로 부터의 응답인지 아닌지)
- Recurision Available: 응답에서 정의된 재귀가 사용가능한지를 표시한다.
- Reply Code or Response Code: 응답에서 오류가 존재하는지 표시한다. (0~5 범위의 숫자로 표시된다.)
숫자 (코드) | 의미 |
0 | 오류 없음 |
1 | 형식 오류 |
2 | 서버 실패 (네임서버 문제) |
3 | 네임 오류 (존재하지 않는 이름) |
4 | 실행되지 않음 |
5 | 거부 (네임서버 규정으로 수행하지 못함) |
- Questions
- Answer RRs: 응답 레코드. 응답이 왔기 때문에 1
- Authority RRs: 공식적인 네임 서버에서 응답을 주었을 때 1
- TTL (Time to Live) : DNS 서버가 데이터를 캐싱정보로 유지한 시간
- Data Length : Rdata의 길이
- Rdata : 해당 리소스에 대한 실제 정보