HSTS란

  • 사이트가 오직 HTTPS 통신만 할 수 있음을 접속하고자 하는 Browser에게 알려 주는 기능
  • 보안을 강화시킬 목적으로 Browser에게 HTTPS만 사용하도록 강제하는 기능
  • Browser에서도 HSTS 기능을 지원해야 HSTS 기능이 제대로 동작

 

  • 2010년 이후에 출시된 대부분의 Browser 버전에서는 HSTS 기능을 지원
  • HSTS (HTTP Strict Transport Security)는 HTTPS를 클라이언트의 브라우저에서 강제화하여 최초 접속 시부터 HTTPS로 접속할 수 있도록 유도하기 위해 만들어짐 → HTTPS를 이용한 웹사이트를 운영 중이라면 HSTS를 필수로 설정하여 운영해야 함
  • SSL Stripping 공격(SSL/TLS Hijacking)을 방지하기 위하여 HSTS 기능을 사용
  • 사용자가 실수로 HTTPS를 지원하는 Site를 HTTP접속 했을 때 중간자 공격에 의해 통신 정보가 공격자에게 노출이 되는 것을 방지하기 위해 강제로 HTTPS로 접속하기 위한 목적으로 사용
  • HSTS는 cookie hijacking을 방지하는 용도로도 사용됨
  • Browser에서 HSTS기능을 지원한다고 해도, SSL stripping 공격에 완전히 안전한 것은 아님

 

  • 공격자가 특정인을 대상으로 표적공격을 한다면 아래와 같은 방법을 취하여 HSTS를 무력화
    1. 특정인의 PC에 침투해서, Browser에 설정된 HSTS기능을 disable시킴
    2. HSTS List에서 특정 사이트에 대한 정보를 초기화

 

 

HSTS 기능의 동작

  1. Browser로 접속 시, 주소창에 “https://” 또는 “http://” 와 같은 프로토콜 이름을 입력하지 않고, 단지 도메인 이름(예를 들면, www.naver.com)만 입력
  2. Browser는 먼저 HTTP(“http://” 사용)로 해당 도메인에 접속을 시도
  3. 도메인 이름만 추출하여, HSTS List와 비교하여 존재하면(도메인 이름에 HSTS가 설정 O), HTTPS을 사용하여 접속
  4. 해당 도메인이 HTTPS만을 지원하는 사이트(HSTS)라면, ”301 Redirect” 또는 ”302 Redirect” response를 보내어 사이트가 HTTPS로 다시 접속하라고 지시
    • Browser가 이전에 접속한 적인 없는 HTTPS 지원 사이트에 HTTP로 접속하면, “301 Redirect” Reply Message로 다시 HTTPS로 접속
    • Server는 HTTPS Reply Message에 "HSTS Policy"를 넣어서 전송 → 암호화 되기 전 packet인, HTTP response header field에 "Strict-Transport-Security" 필드 정보 삽입
    • Browser는 위 정보를 받아서 내부 HSTS List를 구성
    • Server는 "Max Age 값", "Subdomain 적용여부 값", "Preloaded List에 추가여부 값"을 HTTP response header field에 담아 "Strict-Transport-Security" 함께 client에 전달
    • 만약, Web Browser가 HTTP Protocol로 Web Server에 접속하고, HTTP Reply Message에 HSTS Policy 정보가 들어 있는 경우는 무시
  5. 사이트는 status code로 HTTPS로 redirect를 인식한다면, 사용자는 주소창 옆에 있는 자물쇠 아이콘 또는 접속된 URL주소 앞에 “https://”를 보고, 해당 사이트가 HTTPS 지원함을 인식

 

 

HSTS response header의 Syntax

  • HSTS header example
    Strict-Transport-Security: max-age=<expire-time>
    Strict-Transport-Security: max-age=<expire-time>; includeSubDomains
    Strict-Transport-Security: max-age=<expire-time>; preload

 

1. Max Age 값

  • HSTS List 에 존속하는 시간
  • Age 값이 0(zero)인 경우는 HSTS Policy를 삭제하라는 명령

 

2. Subdomain 적용 여부 값

  • subdomain에 HSTS를 적용할지 여부를 알려줌

 

3. Preloaded HSTS Lists

  • 이미 만들어져 있는 HSTS Lists를 Browser에 제공하는 기능도 지원 → "Preloaded HSTS Lists"
  • Preloaded HSTS Lists는 Browser 설치 또는 Update 할 때 Browser Vendor에 의해 제공
  • Preloaded HSTS Lists를 사용하는 목적은 SSL Stripping 공격을 방지하기 위한 목적
  • 사이트를 "Preloaded HSTS Lists"에 포함시키려면 "hstspreload.org" 사이트에 신청 → 요구하는 기능을 충족한 다음에 양식에 맞추어 신청
  • 사이트가 "Preloaded HSTS Lists"에 포함되어 있는 지 확인도 "hstspreload.org" 사이트에서 가능
  • HTTP만 지원하는 사이트를 HSTS List에 추가하거나, 공격자에 의해 HTTP을 지원하는 사이트로 Redirect 된 경우는, "Your connection is not private" 경고 메시지가 출력 → 접속 X
  • DNS Spoofing에 의한 Redirection은 IP 주소 자체가 변경되는 경우는 여기에 해당 X
  • "HSTS Lists""Preloaded HSTS List"가 각각 존재하는 것이 아니고, 개념상 미리 만들어져 있는 "HSTS Lists""Preloaded HSTS Lists"라고 칭함

 

 

HSTS 응답을 받는 웹 사이트에 대해서 https 접속을 강제화

  • max-age가 63072000초로써 rsec.kr은 최초 접속 후 2년 동안 브라우저에서 HTTPS 접속 강제화

 

  • 설정된 HSTS 내역은 클라이언트의 브라우저에서 확인할 수 있는데, 크롬 브라우저의 경우는 아래와 같은 명령어로 확인 가능 (크롬 브라우저 주소창에 입력)
    1. 브라우저 사용자가 직접 특정 사이트를 HSTS List에 추가하는기능 제공
    2. Chrome Browser 인 경우는, 주소창에 “chrome://net-internals/#hsts” 입력하여 설정
    3. 설정된 값을 확인 및 삭제도 가능
    4. HSTS 접속 URL : chrome://net-internals/#hsts

 

  • 위 명령을 통하여 HSTS 를 적용할 도메인을 직접 추가/삭제하거나 쿼리하여 내용을 조회 가능
  • HSTS는 서버 측 응답을 신뢰하여 브라우저에 일정시간 (max-age)동안 등록이 되기도 하지만 google, twitter 등의 웹사이트는 구글 크롬 브라우저에 하드코딩 되어 HSTS가 Preload되어 강제화 되도록 되어 있음
  • 관련 내용은 아래 링크를 통해 조회 가능 (https://www.chromium.org/hsts)
 

HTTP Strict Transport Security

HTTP Strict Transport Security HTTP Strict Transport Security allows a site to request that it always be contacted over HTTPS. HSTS is supported in Google Chrome, Firefox, Safari, Opera, Edge and IE (caniuse.com has a compatibility matrix). The issue that

www.chromium.org

 

 

HSTS (HTTP Strict Transport Security)의 설정 방법

  • HSTS는 웹서버에서 응답해주는 헤더에 최초 포함되어 있는 만큼 웹서버에서 설정 필요
  • Nginx의 경우는 아래와 같이 add_header를 추가한 후 재시작하면 HSTS를 적용 가능
    add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";

 

  • HSTS 설정에 대한 옵션
    1. max-age=63072000
      • HSTS가 브라우저에 설정될 시간이며 초단위로 설정
      • 63072000은 2년을 의미
      • 63072000 = 2 * 365 * 24 * 60 * 60

    2. includeSubdomains
      • HSTS가 적용될 도메인의 subdomain (www.rsec.kr 또는 mail.rsec.kr 따위)까지 HSTS를 확장 적용함을 의미

    3. preload
      • HSTS 적용이 클라이언트 측에서 preload로 이루어짐을 의미

 

 

HSTS (HTTP Strict Transport Security)의 설정 안정성 테스트 방법

  • https://hstspreload.org 웹사이트에서 HSTS 적용이 잘 되어있는지 확인 가능
  • rsec.kr 을 검색한 결과 아래와 같은 결괏값을 추출

 

  • rsec.kr의 인증서가 subdomain까지 지원할 수 없음을 경고하였는데, 이것은 rsec.kr에서 사용하고 있는 Let’s encrypt 인증서가 아직 wildcard 인증서를 지원하고 있지 않아 생긴 문제
  • 향후 wildcard 인증서로 적용하면 해결될 문제 가능
  • https://hstspreload.org 웹사이트 HSTS 확인
 

HSTS Preload List Submission

<!-- We un-hide the form using inline JS so that (when JS is enabled) it shows in the normal rendering order as if it was never hidden. --> Submitting entries to the HSTS preload list via this site requires JavaScript. This form is used to submit domains f

hstspreload.org

 

 

HSTS (HTTP Strict Transport Security)를 이용하여 SSL Strip 방어

  • MITM (Man in the Middle) 공격 방어
  • TLS/SSL로 암호화된 세션은 중간에서 공격자가 그 내용을 감청하더라도 암호화 되어 있기 때문에 데이터가 보호 가능
  • 그렇다면 SSL/TLS 로 암호화 된 세션을 강제로 암호화하지 않은 HTTP 세션으로 유도한다면 어떨까요?
  • 공격자는 중간에서 암호화 되지 않은 데이터를 감청함으로써 그 내용을 알 수 있을 겁니다.
  • 아래의 SSL Strip 공격을 HSTS로 적용하게 되면 클라이언트(브라우저)에서 HTTPS 접속만 강제화 됨으로써 SSL Strip 공격을 방어 가능
  • HSTS는 Sub Domain 을 통한 우회 방법 등 일부 설정이 누락되었을 경우 SSL Strip 공격이 가능

    ※ SSL Strip
    • SSL/TLS로 암호화 된 세션을 강제로 암호화하지 않은 HTTP 세션으로 유도한다면 공격자는 중간에서 암호화되지 않은 데이터를 감청함으로써 내용을 알 수 있음
    • sslstrip이라 불리는 tool을 사용하면, SSL Stripping을 구현 가능
    • sslstrip은 중간자(Man-In-The-Middle) 위치에 있으면서 양쪽(Browser와 Server)을 모두 속이면서 동작
    • HSTS 기능이 없다면, sslstrip은 공격자가 운영하는 Proxy Server 역할

  • SSL Strip 공격하는 과정
    • sslstrip이 중간에서 traffic을 가로챌 수 있도록 하려면, 먼저 ARP poisoning(또는 ARP spoofing) 공격을 수행 → server로 향하는 트래픽을 sslstrip으로 가게 함
    • 사용자는 http://bank 로 연결 시도. 공격자는 그 연결을 그대로 웹서버에 전달
    • 웹서버는 https를 이용하여 연결하도록 응답
    • 공격자는 웹서버의 응답을 조작하여 http로 연결하는 것처럼 사용자에게 응답
    • 사용자는 응답받은 내용을 근거로 http로 연결. 공격자는 내용을 조회한 후 https로 전환하여 웹서버에 연결을 전달
    • 최종적으로 공격자는 ssl 을 strip 하여 중간에서 내용을 감청할 수 있음

 

  • ARP poisoning (ARP spoofing)
    • 동일한 subnet상에서 이루어지는 것
    • ARP poisoning은 ARP cache 값, 즉 IP 주소에 대응되는 MAC 주소 값을 조작하는 공격
    • SSL Strip은 HTTP로 통신하는 모든 내용을 sslstrip.log 파일에 기록해 두는 기능을 제공
    • SSL Strip.log 파일을 통해 Server 접속자의 개인 정보를 추출 가능
    • 실제 환경에서는 공격자가 SSL Strip과 유사한 기능을 가진 악성코드를 설치하여 민감한 정보를 탈취

 

 

  • 오늘날 스마트폰, PC와 같이 인터넷에 연결된 디바이스만 있으면 원하는 실시간 인터넷 방송을 언제 어디서든 시청하고 마음만 먹으면 직접 방송까지 할 수 있는 시대에 도달하였습니다.
  • 최근에는 인터넷 방송 플랫폼의 발전과 네트워크 품질의 개선으로 인터넷 방송을 진행하는 BJ(Broadcasting Jockey)와 시청자들 간의 소통이 방송 중 거의 실시간으로 가능한 수준까지 되었습니다.
  • 실시간으로 인터넷 라이브 방송을 하기 위해서는 인터넷 라이브 방송 뒷단에서 방송을 가능하게 하는 다양한 기술들이 사용되고 있습니다.

 

원본 영상이 시청자들의 동영상 플레이어 까지 전달되는 과정

  • 구현에 따라 조금 달라질 수는 있지만 각 구성 요소들이 수행하는 기능은 반드시 필요
    원본 영상 → 라이브 인코더 → 미디어 서버 → 전송 서버(CDN) → 동영상 플레이어 → 시청자

  • 구성 요소가 어떤 역할
    1. 영상 송출 : 원본 영상 → 라이브 인코더
    2. 영상 변환 및 전송 : 미디어 서버 → 전송 서버(CDN)
    3. 영상 재생 : 동영상 플레이어→ 시청자

 

 

라이브 인코더

  • 라이브 인코더는 원본 영상을 정해진 방식으로 압축(인코딩) 하고, 압축한 콘텐츠를 미디어 서버로 전송
  • 인코더에서 미디어 서버로 컨텐츠를 전송하는 것을 송출이라고 함

 

1. 인코더의 종류

  1. PC에 설치해서 사용할 수 있는 소프트웨어 인코더
  2. 박스 형태의 하드웨어 인코더
  3. 촬영하면서 송출까지 할 수 있는 모바일 앱 인코더
  4. 오픈소스인 ffmpeg을 이용하여 구현한 인코더

 

2. 압축(인코딩)

  • 카메라로 촬영한 원본 영상을 그대로 미디어 서버에 전송하기에는 데이터 용량이 너무 크기 때문에 압축하는 과정이 반드시 필요
  • 미디어 서버에서 해석할 수 있는 압축 방식(코덱, Codec)을 사용
  • 인터넷 방송에는 H.264/AAC 코덱이 주로 사용, 최근에는 더욱 압축 효율이 좋은 H.265 코덱을 사용하는 경우 늘어남
  • 인코딩은 CPU를 많이 쓰는 작업 → 인코딩 작업에 평균 CPU 사용률이 80% 를 넘을 경우 출력 영상의 품질이 나빠짐
  • CPU 부하로 인해 송출 중인 영상이 계속 끊기거나 버벅거린다면 출력 해상도나 비트레이트를 줄여야 함
  • 소프트웨어 인코더를 사용할 경우 안정적인 방송을 위해서 쿼드코어 CPU 가 탑재된 PC 사용을 권장

 

3. 송출

  • 미디어 서버로 영상을 보낼 때는 인터넷 스트리밍에 최적화된 RTMP 프로토콜을 이용
  • 과거에는 UDP 기반의 RTSP 프로토콜을 많이 사용했으나 최근에는 RTMP 프로토콜이 거의 표준처럼 사용
  • 안정적인 송출을 위해서는 충분한 인터넷 업로드 대역폭이 확보 필요
  • 가정이나 일반 사업장에서 사용하는 인터넷 품질은 상황에 따라 변하게 됨 → 중요한 방송이라면 별도 전용 회선을 설치하여 송출 권장
  • 인터넷 업로드 대역폭은 출력 비트레이트의 두 배 이상 확보되는 것이 안정적
  • 송출 중인 영상이 계속 끊기거나 버벅거릴 경우 출력 해상도와 비트레이트를 낮춰주면 출력 품질 개선에 도움이 됨

 

 

미디어 서버

  • 미디어 서버는 인터넷 라이브 방송의 핵심적인 역할
  • 인코더가 보내준 영상을 여러 가지 화질 및 비트레이트로 변환(트랜스 코딩)
  • 화질별로 변환된 영상을 다시 HLS 형식으로 변환 (트랜스먹싱 혹은 패킷타이징이라고 함)

 

1. 화질 및 비트레이트 변환

  • 인터넷 방송 서비스는 사용자의 다양한 디바이스 크기, 네트워크 환경에 맞는 영상을 시청하도록 하는 것이 중요 → 불필요한 데이터 사용과 - - 배터리 소모를 방지하고 최적의 화질을 보장할 수 있어야 함
  • 미디어 서버에서 원본 영상을 여러 화질로 변환해 주어야 함
  • 화질 및 비드레이트 변환은 라이브 인코더와 동일하게 CPU를 많이 사용 → 라이브 인코더가 압축해서 보내준 영상을 압축 해제(디코딩) 하고 화질 변환 후 다시 압축(인코딩) 함
  • 인코딩 작업에 GPU 가속을 이용하면 CPU의 인코딩 부하를 상당 부분 줄일 수 있음

 

2. HLS 변환

  • HLS(HTTP Live Streaming)는 전 세계에서 가장 널리 사용하고 있는 실질적인 표준 HTTP 스트리밍 프로토콜
  • M3U8 확장자의 재생목록 파일과 영상을 잘게 쪼갠 TS 청크 파일들을 전송 → 모바일과 PC 등 다양한 디바이스에서 영상을 재생 가능

    ※ HLS 지연(latency)
    • 카메라가 촬영하는 시간과 그 영상이 시청자에게 표시되는 시간의 차이를 지연(latency)이라고 함
    • 시청자와 실시간 소통이 필요할수록 짧은 지연(low latency) 이 필요
    • 과거에는 10초 ~ 15초 분량의 TS 청크를 재생 목록에 3개씩 담아 사용 → 미디어 서버 입장에서 30초~45초 정도 분량을 버퍼에 담아두었다가 전달
    • 위 경우 사용자 입장에서는 전송에 소요되는 시간까지 포함하여 최소 30초, 최대 1분에 가까운 지연이 발생
    • 버퍼가 클수록 재생이 안정적이지만 지연 시간은 길어짐
    • 버퍼를 짧게 가져가면 지연은 적지만 네트워크 상황에 민감해져 재생 품질이 불안정해짐
    • 최근에는 네트워크 환경이 좋아져 보다 공격적으로 튜닝하여 사용
    • 1~2초 정도의 TS 청크를 사용 → 지연 시간을 10초 미만으로 줄일 수 있어 low latency를 구현 가능

 

3. 미디어 서버 솔루션

  • 3.1. Wowza Media Server (유료)
    • 유료이지만 다양한 기능과 우수한 인코딩 성능으로 널리 사용
    • 안정적인 운영을 위해 평균 CPU 사용률이 60% 를 초과하지 않도록 관리해 주는 것이 중요
    • 720P HD 화질을 포함하여 3~4 종류의 품질로 트랜스코딩을 해야 한다면 쿼드코어는 약간 불안
    • 쿼드 코어 이상의 코어를 탑재한 CPU를 사용하는 것이 안정적

  • 3.2. Nginx-rtmp (오픈소스)
    • Nginx-rtmp는 nginx의 모듈로 동작하는 미디어 스트리밍 서버
    • RTMP 소스를 Pull 혹은 Push 방식으로 입력받을 수 있고 RTMP/HLS/MPEG-DASH 출력을 지원
    • 오픈 소스인 ffmpeg을 연동하면 트랜스코딩을 비롯하여 기타 다양한 기능들을 구현 가능할 수 있어 유료 솔루션의 좋은 대안 가능

 

 

전송 서버 (CDN)

  • 미디어 서버에서 실시간으로 생성한 HLS 영상 조각 파일을 사용자에게 전달하려면 전송 서버가 있어야 함 → 일반적인 미디어 서버는 전송 서버의 역할까지 수행
  • 동시 시청수가 많은 방송일 경우 대규모 트래픽을 안정적으로 처리하기 위해 CDN을 사용하는 것이 좋음
  • CDN에서 캐싱을 하지 않으면 동시에 많은 시청자가 접속했을 때 미디어 원본 서버로 많은 요청이 들어갈 수 있음
  • 무작정 캐싱 기간을 늘려놓는 것도 위험
  • 최근 영상의 지연을 최소화하기 위해 TS 청크의 길이를 수초 단위로 사용
  • HLS 재생목록 파일이 TS 청크의 재생 시간 내에 갱신되지 않으면 버퍼링이 발생하거나 플레이어가 영상 재생이 중단됨
  • 재생 목록 파일은 TS 청크의 절반 정도 시간만 캐싱하고 갱신되도록 설정해야 함
  • 콘텐츠 보호 차원에서 CDN 캐시 남아있는 과거 영상을 다운로드하는 것을 방지하기 위해 정해진 시간 이후에 들어온 요청은 캐시가 되어 있더라도 콘텐츠를 응답하지 않도록 설정 필요

 

 

동영상 플레이어

  • 동영상 플레이어는 말단말에서 영상 컨텐츠를 재생하는 역할
  • 미디어 서버에서 최종적으로 만든 HLS 형식은 모바일 단말이라면 안드로이드, 아이폰 구분 없이 내장된 플레이어를 통해 문제없이 재생 가능
  • HLS는 Apple에서 만든 방식으로 맥 OS에서도 재생을 지원
  • Windows PC에서 HLS를 재생하려면 별도의 외부 플레이어가 필요 → Window PC의 버전에 따라 다르지만 IE 11 이하에서는 HLS 재생을 지원하는 Flash 플레이어를 사용해야 함
  • Chrome이나 Edge 같이 MSE (Media Source Extensions)를 지원하는 최신 브라우저라면 Javascript로 구현된 플레이어를 사용 → hls.js, video.js 사용
  • 동영상 플레이어를 사용할 때 브라우저의 보안적 제약으로 재생이 불가능한 상황이 발생 가능
  • 서비스 페이지의 도메인과 영상이 전송되는 도메인이 다르면 재생 X → 전송 서버나 미디어 서버에서 적절한 크로스 도메인 설정 필요
  • HTTPS 페이지 내에서 HTTP 프로토콜로 전송되는 영상을 재생을 하려고 할 때, 재생이 되지 않을 수 있으니 영상도 HTTPS 프로토콜로 전송 필요

 

참고 자료

과거에 기본적으로 리눅스의 이더넷 이름은 eth0, eth1 과 같이 eth를 prefix로 사용

  • 리눅스 배포판들이 eth0과 같은 전통적인 ethernet naming을 버리고 현재 em1 또는 p2p1와 같은 이름 사용
  • 과거 이더넷이 하나 뿐인 일반적인 PC 환경에서는 eth0 이든, em1 이든, p2p1 이든 네트워크를 쓸 수 있는 포트가 하나 밖에 없으니 문제 X
  • 현재 라우터 뿐만 아니라 서버도 HA용으로 사용하거나 포트 bonding을 통해 여러 포트를 사용하는 네트워크를 구성
  • 여러 포트를 사용할 때 사용하는 물리적 포트가 eth0인지, eth1 인지 구분하기 힘들면 관리에서 문제 발생 → 커널이 PCI bus를 읽는 순서에 따라 eth0 이 다음번 부팅 때에는 eth1 이 되기도 하는 등 문제가 많음

 

 

현재 이더넷 이름은 물리적인 순서를 지정하는 방식으로 사용 → em1과 p2p1

  • 이더넷 이름에 물리적인 순서를 지정하는 방식으로 em1 형식과 p2p1 형식이 있음
    • em1은 온보드 이더넷 포트
    • p2p1은 PCI NIC

  • p2p1에서 첫번째 숫자는 PCI 슬롯의 이름이고, 마지막 숫자는 해당 NIC의 포트 중에 첫번째 포트를 의미

 

 

  • DIG(Domain Information Groper)는 DNS 이름 서버를 쿼리하는 강력한 명령줄 도구
  • dig 명령어를 사용하면 호스트 주소, 메일 교환 및 이름 서버를 비롯한 다양한 DNS 레코드에 대한 정보를 쿼리 가능
  • dig 명령어는 유연성과 사용 편의성 때문에 DNS 문제를 해결하는 데 시스템 관리자 중 가장 많이 사용되는 도구
  • DNS 조회 웹 페이지 : https://ko.rakko.tools/tools/18/

1. dig 설치

  • 시스템 유형에서 dig 명령을 사용할 수 있는지 확인

    $ dig -v
    DiG 9.8.2rc1-RedHat-9.8.2-0.68.rc1.el6_10.3

  • CentOS 및 Fedora에 dig 명령어 설치

    $ yum install -y bind-utils


2. Dig 출력 이해

  • 간단한 형식으로 추가 옵션 없이 단일 호스트(도메인)를 쿼리

  • dig 명령은 매우 상세하게 도메인의 내용을 출력

  • www.baidu.com 도메인으로 테스트

    $ dig www.baidu.com
    
    ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.68.rc1.el6_10.3 <<>> www.baidu.com
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 25980
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;www.baidu.com.                 IN      A
    
    ;; ANSWER SECTION:
    www.baidu.com.          356     IN      CNAME   www.a.shifen.com.
    www.a.shifen.com.       83      IN      CNAME   www.wshifen.com.
    www.wshifen.com.        296     IN      A       119.63.197.151
    www.wshifen.com.        296     IN      A       119.63.197.139
    
    ;; Query time: 34 msec
    ;; SERVER: 8.8.8.8#53(8.8.8.8)
    ;; WHEN: Wed Jun 22 00:13:05 2022
    ;; MSG SIZE  rcvd: 116


3. ANSWER SECTION의 내용 확인

  • dig 쿼리에 대한 특정 내용만 답변으로 추출

3.1. ANSWER SECTION의 짧은 내용 얻기

  • 쿼리에 대한 짧은 대답을 얻으려면 +short 옵션을 사용
  • 질의한 도메인 ANSWER SECTION의 답만 출력
  • 출력에는 CNAME과 A 레코드의 IP 주소를 포함
    $ dig www.baidu.com +short
    www.a.shifen.com.
    www.wshifen.com.
    119.63.197.139
    119.63.197.151

3.2. ANSWER SECTION 자세한 내용 얻기

  • ANSWER SECTION의 자세한 응답 확인을 보려면 +noall 옵션을 사용한 후, +answer 옵션을 사용하여 ANSWER SECTION만 출력
    $ dig www.baidu.com +noall +answer
    ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.68.rc1.el6_10.3 <<>> www.baidu.com +noall +answer
    ;; global options: +cmd
    www.baidu.com.          234     IN      CNAME   www.a.shifen.com.
    www.a.shifen.com.       7       IN      CNAME   www.wshifen.com.
    www.wshifen.com.        118     IN      A       119.63.197.139
    www.wshifen.com.        118     IN      A       119.63.197.151


4. 특정 DNS에서 도메인 쿼리

  • 기본적으로 DNS를 지정되지 않은 경우 도메인에 대한 질의 불가

  • DNS 명령어에 @DNS을 추가하지 않으면, /etc/resolv.conf 파일에 나열된 DNS 서버를 사용

  • 쿼리를 실행할 DNS를 지정하려면 @ 기호 뒤에 DNS IP 주소 또는 호스트 이름을 사용

  • 예시로는 AWS의 DNS 서버(1.1.1.1)에서 www.baidu.com 도메인에 대한 정보를 쿼리함

    $ dig www.baidu.com @1.1.1.1
    
    ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.68.rc1.el6_10.3 <<>> www.baidu.com @1.1.1.1
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5787
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;www.baidu.com.                 IN      A
    
    ;; ANSWER SECTION:
    www.baidu.com.          1183    IN      CNAME   www.a.shifen.com.
    www.a.shifen.com.       283     IN      CNAME   www.wshifen.com.
    www.wshifen.com.        283     IN      A       119.63.197.151
    www.wshifen.com.        283     IN      A       119.63.197.139
    
    ;; Query time: 3 msec
    ;; SERVER: 1.1.1.1#53(1.1.1.1)
    ;; WHEN: Wed Jun 22 01:05:52 2022
    ;; MSG SIZE  rcvd: 116


5. 레코드 유형 쿼리

  • dig 명령어를 사용하면 쿼리 끝에 레코드 유형을 추가하여 유효한 DNS 쿼리를 수행 가능
  • 아래 섹션은 A(IP 주소), CNAME(도메인 별칭), TXT(텍스트 레코드), MX(메일 교환기) 및 NS(DNS 서버)와 같은 가장 일반적인 레코드를 검색하는 방법 정리

5.1. A 레코드 쿼리

  • 도메인 이름에 대한 모든 주소 목록을 가져오려면 아래 옵션을 사용

  • DNS 레코드 유형이 지정되지 않은 경우 dig에서 A 레코드를 요청 → 옵션을 지정하지 않고 A 레코드를 쿼리 가능

    # 형식 : dig 도메인 -t A 또는 dig 도메인 A 또는 dig 도메인
    $ dig www.baidu.com -t A
    
    ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.68.rc1.el6_10.3 <<>> www.baidu.com -t A
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46904
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;www.baidu.com.                 IN      A
    
    ;; ANSWER SECTION:
    www.baidu.com.          541     IN      CNAME   www.a.shifen.com.
    www.a.shifen.com.       195     IN      CNAME   www.wshifen.com.
    www.wshifen.com.        146     IN      A       103.235.46.40
    
    ;; Query time: 34 msec
    ;; SERVER: 8.8.8.8#53(8.8.8.8)
    ;; WHEN: Wed Jun 22 01:33:45 2022
    ;; MSG SIZE  rcvd: 100

5.2. CNAME 레코드 쿼리

  • 도메인 별칭 이름을 찾으려면 cname 옵션을 사용

    # 형식 : dig 도메인 -t cname 또는 dig 도메인 cname
    $ dig www.baidu.com -t cname
    
    ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.68.rc1.el6_10.3 <<>> www.baidu.com -t cname
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45541
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;www.baidu.com.                 IN      CNAME
    
    ;; ANSWER SECTION:
    www.baidu.com.          145     IN      CNAME   www.a.shifen.com.
    
    ;; Query time: 38 msec
    ;; SERVER: 8.8.8.8#53(8.8.8.8)
    ;; WHEN: Wed Jun 22 01:38:13 2022
    ;; MSG SIZE  rcvd: 58

5.3. TXT 레코드 쿼리

  • 특정 도메인에 대한 모든 TXT 레코드를 검색하려면 txt 옵션을 사용

    # 형식 : dig 도메인 -t txt 또는 dig 도메인 txt
    $ dig baidu.com -t txt
    
    ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.68.rc1.el6_10.3 <<>> baidu.com -t txt
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20891
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;baidu.com.                     IN      TXT
    
    ;; ANSWER SECTION:
    baidu.com.              7200    IN      TXT     "_globalsign-domain-verification=qjb28W2jJSrWj04NHpB0CvgK9tle5JkOq-EcyWBgnE"
    baidu.com.              7200    IN      TXT     "v=spf1 include:spf1.baidu.com include:spf2.baidu.com include:spf3.baidu.com include:spf4.baidu.com a mx ptr -all"
    baidu.com.              7200    IN      TXT     "google-site-verification=GHb98-6msqyx_qqjGl5eRatD3QTHyVB6-xQ3gJB5UwM"
    
    ;; Query time: 109 msec
    ;; SERVER: 8.8.8.8#53(8.8.8.8)
    ;; WHEN: Wed Jun 22 01:44:16 2022
    ;; MSG SIZE  rcvd: 320

5.4. MX 레코드 쿼리

  • 특정 도메인의 모든 메일 서버 목록을 가져오려면 mx 옵션을 사용

    # 형식 : dig 도메인 -t mx 또는 dig 도메인 mx
    $ dig baidu.com -t mx
    
    ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.68.rc1.el6_10.3 <<>> baidu.com -t mx
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60866
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;baidu.com.                     IN      MX
    
    ;; ANSWER SECTION:
    baidu.com.              7111    IN      MX      20 jpmx.baidu.com.
    baidu.com.              7111    IN      MX      20 mx50.baidu.com.
    baidu.com.              7111    IN      MX      20 usmx01.baidu.com.
    baidu.com.              7111    IN      MX      10 mx.maillb.baidu.com.
    baidu.com.              7111    IN      MX      15 mx.n.shifen.com.
    baidu.com.              7111    IN      MX      20 mx1.baidu.com.
    
    ;; Query time: 33 msec
    ;; SERVER: 8.8.8.8#53(8.8.8.8)
    ;; WHEN: Wed Jun 22 01:43:50 2022
    ;; MSG SIZE  rcvd: 166

5.5. NS 레코드 쿼리

  • 특정 도메인에 대한 권한 있는 이름 서버를 찾으려면 ns 옵션을 사용

    # 형식 : dig 도메인 -t ns 또는 dig 도메인 ns
    $ dig baidu.com -t ns
    
    ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.68.rc1.el6_10.3 <<>> baidu.com -t ns
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 15087
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;baidu.com.                     IN      NS
    
    ;; ANSWER SECTION:
    baidu.com.              21600   IN      NS      ns2.baidu.com.
    baidu.com.              21600   IN      NS      ns7.baidu.com.
    baidu.com.              21600   IN      NS      dns.baidu.com.
    baidu.com.              21600   IN      NS      ns4.baidu.com.
    baidu.com.              21600   IN      NS      ns3.baidu.com.
    
    ;; Query time: 84 msec
    ;; SERVER: 8.8.8.8#53(8.8.8.8)
    ;; WHEN: Wed Jun 22 01:43:18 2022
    ;; MSG SIZE  rcvd: 117

5.6. 모든 레코드 쿼리

  • 특정 도메인에 대한 모든 DNS 레코드 목록을 가져오려면 임의 옵션을 사용

    # 형식 : dig 도메인 -t any 또는 dig 도메인 any
    $ dig baidu.com -t any
    ;; Truncated, retrying in TCP mode.
    
    ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.68.rc1.el6_10.3 <<>> baidu.com -t any
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5705
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 17, AUTHORITY: 0, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;baidu.com.                     IN      ANY
    
    ;; ANSWER SECTION:
    baidu.com.              7200    IN      SOA     dns.baidu.com. sa.baidu.com. 2012145445 300 300 2592000 7200
    baidu.com.              7200    IN      TXT     "google-site-verification=GHb98-6msqyx_qqjGl5eRatD3QTHyVB6-xQ3gJB5UwM"
    baidu.com.              7200    IN      TXT     "v=spf1 include:spf1.baidu.com include:spf2.baidu.com include:spf3.baidu.com include:spf4.baidu.com a mx ptr -all"
    baidu.com.              7200    IN      TXT     "_globalsign-domain-verification=qjb28W2jJSrWj04NHpB0CvgK9tle5JkOq-EcyWBgnE"
    baidu.com.              7200    IN      MX      20 mx50.baidu.com.
    baidu.com.              7200    IN      MX      15 mx.n.shifen.com.
    baidu.com.              7200    IN      MX      10 mx.maillb.baidu.com.
    baidu.com.              7200    IN      MX      20 mx1.baidu.com.
    baidu.com.              7200    IN      MX      20 jpmx.baidu.com.
    baidu.com.              7200    IN      MX      20 usmx01.baidu.com.
    baidu.com.              600     IN      A       220.181.38.251
    baidu.com.              600     IN      A       220.181.38.148
    baidu.com.              21600   IN      NS      ns7.baidu.com.
    baidu.com.              21600   IN      NS      ns3.baidu.com.
    baidu.com.              21600   IN      NS      dns.baidu.com.
    baidu.com.              21600   IN      NS      ns2.baidu.com.
    baidu.com.              21600   IN      NS      ns4.baidu.com.
    
    ;; Query time: 152 msec
    ;; SERVER: 8.8.8.8#53(8.8.8.8)
    ;; WHEN: Wed Jun 22 01:45:49 2022
    ;; MSG SIZE  rcvd: 620


6. 역 DNS 조회

  • 특정 IP 주소와 연결된 호스트 이름을 쿼리하려면 -x 옵션을 사용

  • 예시로 208.118.235.148에 대해 역방향 조회를 수행

    $ dig -x 8.8.8.8
    
    ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.68.rc1.el6_10.3 <<>> -x 8.8.8.8
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10553
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;8.8.8.8.in-addr.arpa.          IN      PTR
    
    ;; ANSWER SECTION:
    8.8.8.8.in-addr.arpa.   19236   IN      PTR     dns.google.
    
    ;; Query time: 32 msec
    ;; SERVER: 8.8.8.8#53(8.8.8.8)
    ;; WHEN: Wed Jun 22 01:53:35 2022
    ;; MSG SIZE  rcvd: 62


7. 대량 쿼리

  • 많은 수의 도메인을 쿼리하려면 해당 도메인을 파일에 추가하고(행당 하나의 도메인) -f 옵션 뒤에 파일 이름을 붙이면 질의 가능

  • 파일에 있는 나열된 도메인을 쿼리

    $ cat domainlist.txt
    www.baidu.com
    www.google.com
    
    # domainlist.txt 파일에 있는 도메인 질의
    $ dig -f domainlist.txt
    
    ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.68.rc1.el6_10.3 <<>> www.baidu.com
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57218
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;www.baidu.com.                 IN      A
    
    ;; ANSWER SECTION:
    www.baidu.com.          443     IN      CNAME   www.a.shifen.com.
    www.a.shifen.com.       235     IN      CNAME   www.wshifen.com.
    www.wshifen.com.        226     IN      A       119.63.197.139
    www.wshifen.com.        226     IN      A       119.63.197.151
    
    ;; Query time: 34 msec
    ;; SERVER: 8.8.8.8#53(8.8.8.8)
    ;; WHEN: Wed Jun 22 01:58:00 2022
    ;; MSG SIZE  rcvd: 116
    
    ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.68.rc1.el6_10.3 <<>> www.google.com
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 13832
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;www.google.com.                        IN      A
    
    ;; ANSWER SECTION:
    www.google.com.         300     IN      A       142.250.204.100
    
    ;; Query time: 51 msec
    ;; SERVER: 8.8.8.8#53(8.8.8.8)
    ;; WHEN: Wed Jun 22 01:58:00 2022
    ;; MSG SIZE  rcvd: 48


8. .digrc 파일

  • dig 명령의 동작은 ${HOME}/.digrc 파일에서 사용자별 옵션을 설정하여 제어 가능

  • 사용자의 홈 디렉터리에 .digrc 파일이 있는 경우 파일에 지정된 옵션이 명령줄 인수 앞에 적용됨

  • 섹션만 표시하려면 텍스트 편집기를 열고 다음 ~/.digrc 파일을 생성 → ANSWER SECTION의 자세한 응답 확인하기 위해 +noall과 +answer 저장

    $ cat ~/.digrc
    +noall +answer
    
    $ dig www.baidu.com
    ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.68.rc1.el6_10.3 <<>> www.baidu.com +noall +answer
    ;; global options: +cmd
    www.baidu.com.          234     IN      CNAME   www.a.shifen.com.
    www.a.shifen.com.       7       IN      CNAME   www.wshifen.com.
    www.wshifen.com.        118     IN      A       119.63.197.139
    www.wshifen.com.        118     IN      A       119.63.197.151


9. dig 사용 옵션

  • dig 명령어에는 ‘-‘ 옵션과 ‘+’ 옵션이 있음
  • dig 사용 주요 옵션
    옵션 설명 비고
    -b source IP를 다른 IP로 설정 interface IP
    -f batch 모두 동작시 파일이름을 지정
    -m debugging
    -p 53 이외의 포트번호를 지정
    -4 or -6 IPv4 또는 IPv6 강제 지정
    -t Type을 지정 기본 문법에 포함
    -c Class를 지정 사실상 무의미 (IN)
    -x reverse lookup IP to name
    +tcp TCP 프로토콜 사용 +notcp
    +trace delegation path 추적 +notrace
    +short Answer Section 결과만을 표시 +noshort
    +comments Comments Section 표시 +nocomments
    +question Question Section 표시 +noquestion
    +answer Answer Section 표시 +noanswer
    +authority Authority Section 표시 +noauthority
    +additional Additional Section 표시 +noadditional
    +stats Statistics Section 표시 +nostats
    +all Comments부터 Statistics Section 모두 표시 +noall
    +multiline 긴 record를 여러 줄로 보기 좋게 표시 +nomultiline

참고 자료

  • 일반적인 anycast DNS구성은 BGP로 설정
  • anycast DNS 구성을 이해하기 위해서는 네트워크 적인 부분을 이해가 필요
  • anycast DNS 네트워크를 어떤 식으로 구성되며 어떤식으로 동작하는지 설명

 

1. 6곳 지사에서 모두 1곳의 동일 DNS로 사용

  • 예를들에 서울, 인천, 대전, 광주, 대구, 부산 6곳에 지사를 두고 있으며 서울에 있는 1.1.1.5를 6곳 지사에서 모두 DNS로 사용한다고 예정
  • 서울에 있는 1.1.1.5 DNS서버에 문제가 발생하거나 서울지사에서 정전작업 혹은 재해 등으로 인하여 DNS서버에 장애가 발생하거나, DNS 앞단 스위치에 장애가 발생하면 6곳 지사 모두 DNS서비스를 받지 못함

 

 

2. 6곳 지사에서 모두 1곳의 DNS로 사용할 때 발생하는 문제 해결 → DNS 이중화(새로운 IP 사용은 불가능)

  • 6곳 지사에서 1곳의 동일 DNS로 요청하다보면 발생할 수 있는 문제점들을 해결하기 위하여 DNS 이중화 진행 → 부산에다가 새로운 DNS서버를 구축
  • 이미 몇만명이 넘는 사용자들은 각자 PC에 1.1.1.5를 설정하였고 대부분의 서버에도 DNS가 1.1.1.5로 설정되었기 때문에 새로운 IP를 할당하고 공지한다는 것은 불가능

 

 

3. BGP라는 라우팅 프로토컬을 사용하면 1개의 IP를 서로 공유하는 것 가능

  • 일반적으로 1개의 IP를 서로 공유한다는 것운 불가능 → 지역이 멀어져 있을 경우에 1개 IP를 공유하는 것은 더 불가능
  • BGP라는 라우팅 프로토컬을 사용하면 1개의 IP를 서로 공유하는 것 가능
  • anycast DNS를 구성하기 위해서는 반드시 BGP구성이 되어야 함
  • 6개의 지사가 각각 BGP로 구성되어 있고 이 BGP정보(각자 가지고 있는 IP정보)를 주고받도록 설정되어야 함

 

 

4. 각각 BGP로 연결된 다른 자사에서도 1.1.1.5가 있는 BGP 네트워크를 알 수 있음

  • 6개의 지사가 BGP로 구성되에 있고 서울과 부산에서 각각 1.1.1.5를 설정하면 BGP정보를 타고 서울과 부산은 각각 BGP로 연결된 다른 자사에게 - 1.1.1.5는 각자 자신에게 존재한다고 다른 지역에게 공유
  • 인천, 광주, 대전, 대구는 1.1.1.5가 서울에도 존재하고 부산에도 존재함을 공유받게 되어 알게 됨

 

 

5. BGP를 통한 서로 다른 2곳에서 동일 IP DNS 서비스는 분산 서비스 가능(홉카운트가 가까운 DNS로 질의)

  • 인천, 광주, 대전, 대구 지사는 서울, 부산으로부터 1.1.1.5에 대해 공유받음 → BGP라는 라우팅 프로토콜로 공유를 받아 1.1.1.5가 서울과 부산 두 곳에 존재한다는 여부를 알게 되었고 BGP 특성상 홉카운트가 가까운 쪽으로 찾아가게 됨
  • 서로 다른 2곳에서 동일한 IP 1.1.1.5를 공유받았다 하더라도 거리가 가까운 쪽을 우선적으로 찾아감
  • 인천과, 대전 사용자들은 BGP정책에 따라 서울이 가깝기 때문에 서울에 있는 1.1.1.5 DNS서버로 접속하게 되며, 광주, 대구 사용자들은 BGP정책에 따라 가까운 부산에 존재하는 DNS서버에서 DNS서비스를 받게 됨
  • DNS 서비스는 서울과 부산 2곳에서 분산 서비스 가능

 

 

6. 1곳의 DNS 서비스에 장애가 발생하면, 다른 1곳 DNS에 서비스 질의(BGP 설정으론 DNS 장애 판단 불가)

  • 부산의 DNS 서비스에 장애가 발생하면 기존에 부산에서 서비스받던 광주, 대전, 부산 사용자들은 다른 DNS서버인 서울에서 DNS 질의
    일반적으로 BGP만 설정하게 되면 BGP는 해당 DNS 서비스가 장애 유무를 판단할 수 없음
  • 1.1.1.5/32을 static으로만 BGP에 redistribute(재분배) 시킴

 

 

7. BGP 내부에 다이나믹한 라우팅 프로토컬 중 OSPF를 사용(장애 유무 판단)

  • 장애 유무를 판단하기 위해서는 다이나믹한 라우팅 프로토컬을 BGP 내부에서 DNS서버와 부산 백본스위치 간에 연동시켜야 함
  • 일반적으로 RIP, EIGRP, OSPF 등 다양한 다이나믹 라우팅 프로토컬이 있으나 가장 많이 사용되는 OSPF를 예로 사용

 

 

8. 각각의 지역끼리 BGP로 정보를 주고받으며 각 지역의 내부는 OSPF로 연동

  • 각각의 지역끼리 BGP로 정보를 주고 받으며 각 지역의 내부는 OSPF로 연동된 상태 → BGP를 사용하는 대부분의 네트워크 망 구성
  • 지역 내부에서는 OSPF가 동작하여 1.1.1.5를 지역 내에서도 접근할 수 있도록 설정
  • 각 지역 내부에 존재하는 IP도 타 지역에서 접속할 수 있도록 타 지역끼리는 BGP로 설정

 

 

9. DNS 장애 발생 시 서로 다른 지역은 BGP로 전파하며, 지역의 내부는 OSPF로 연동하여 전파

  • 부산에 있는 DNS서버에 장애가 발생하여 링크 등이 끊기거나 상단 스위치에 문제가 발생하게 되면 OSPF는 부산지역에 OSPF로 연결되어 있는 장비들에게 해당 IP의 공유를 중단하게 되며 BGP를 통하여 그 사실을 타 지역에게도 공유하게 됨
  • 부산 DNS 장애로 인해 서울 DNS에 접속하기 위해, 전 지역에 서울 DNS 1.1.1.5가 공유

 

  • 부산의 DNS서버에 장애가 발생하면, 부산에서 서비스받고 있는 지역은 BGP 공유에 의하여 다음 우선 지역인 서울의 1.1.1.5에서 DNS서비스를 받게 됨

 

 

10. 지역의 내부는 DNS서버를 L4스위치에 연결하여 OSFP 연동 전파, 서로 다른 지역은 BGP로 전파

  • 일반적으로 Bind를 사용하는 일반적인 서버에서는 OSPF를 구동시키기가 힘들다. → Redistribute Connect로 연결된 모든 것을 OSPF에 등록할 수 있지만 그런 경우 링크가 끊기는 경우만을 체크하게 되며 Bind 데몬이 Down되는 등의 장애를 감지할 수 없음
  • 몇몇 인포블럭스 같은 상용 박스형 DNS 서버들은 자체적으로 OSPF가 구동되도록 생성할 수 있음
  • 일반적인 Sun, Linux 기반에 Bind DNS서버들은 상단에 OSPF를 구현할 수 있는 L4등의 SLB장비가 구현되며, Real DNS서버들은 1.1.1.6, 1.1.1.7 등을 가지고 있으며 실적적으로 서비스받는 IP 등은 L4에서 대표 IP인 VIP로 설정
  • 부산지사 백본과 L4 스위치를 OSPF로 설정하게 되면 부산 백본 스위치는 1.1.1.5가 L4 스위치게 존재함을 알게 되며 BPG에 network 1.1.1.5/32로 다른 지역에게도 공유하게

 

참고 자료

'GTM과 DNS' 카테고리의 다른 글

Anycast DNS란  (0) 2023.09.16
DNS 보안 프로토콜 → DoH와 DoT  (0) 2023.09.16
HTTPS 암호화된 DNS 기능 지원 → TYPE65  (0) 2023.09.16
cloudflare DNS와 google DNS의 cache flush  (0) 2023.09.16
Bind DNS recursion 설정  (0) 2023.09.16
  • 네트워크 기술 하나 중 Anycast는 DNS 서비스에서 주로 사용
  • 각 글로벌 POP에 비용 절감 및 고가용성 용도로도 많이 사용

 

1. Anycast란

  • 보통 알고 사용하고 있는 IP 주소는 Unicast IP이며 이것은 고유한 IP 주소
  • Anycast IP는 서로 다른 곳, 서로 다른 호스트끼리 동일한 IP 주소를 가질 수 있는 개념 → 네트워크 내 다수의 서버가 동일한 IP 주소 또는 일련의 IP 주소를 이용(Anycast 네트워크에서는 통신은 일대다)
  • 동일한 IP 주소를 사용하는 경우, 충돌 발생 가능 → 충돌된 IP들의 회피 방법은 BGP와 같은 라우팅 프로토콜에 의해서 해결
  • 라우팅 프로토콜에 의해 충돌난 IP에 대해서 가장 최적의 경로의 IP를 가진 서버를 1개 선택해서 라우팅함
  • 같은 IP를 각 라우터들이 어나운스하며 가장 가까운 곳으로 판단되는 쪽으로 사용
  • 라우팅 코스트가 가장 적은 쪽의 경로를 선택, 라우팅 코스트가 같다면 로드밸런싱함

2. Anycast DNS

  • Anycast는 주로 DNS 서비스에 많이 활용
  • Anycast 기법을 사용하여 DNS 서버를 지역별 분산 구성하여 DNS 질의를 요청한 클라이언트와 가장 근접한 DNS 서버가 처리하도록 하여 응답속도와 안정성을 향상함
  • 항상 네트워크 경로상 가장 가까운 DNS 서버가 응답 → 가장 가까운 DNS가 장애가 발생되면 라우터에서 어나운스가 되지 않아 자동으로 빠지며 그다음 가까이 위치에 있는 DNS가 대신 처리함
  • 지리적으로 가장 가까운 서버가 응답하는 Anycast DNS는 대기 시간을 줄이고, DNS 확인 서비스의 가동 시간을 늘리면서, DNS 폭주 DDoS 공격을 방지 가능
  • Google public DNS를 Anycast로 구성하여 가장 가까운 지역에서 DNS서비스를 받는 과정

 

2.1. Anycast DNS 도입배경

  • Anycast가 도입된 이유는 2002년 10월 root DNS DDoS 공격으로 전 세계 13개 root DNS 중 8개가 다운, 2003년 1.25 인터넷 대란 때 5개의 root DNS가 웜으로 DDoS 공격당하여 전 세계 DNS가 마비되어서 개선안으로 Anycast 기술을 사용하게 됨
  • Anycast IP를 이용하여 DNS를 적절히 분산구성하여 한쪽 지역이 무너지더라도 다른 지역에서 서비스를 받을 수 있도록 함

 

2.2. Google public DNS

  • Google public DNS의 IP 8.8.8.8가 대표적으로 Anycast로 구성되어 있으며 전 세계 국가에 분산되어 있고 규모가 엄청남
  • Google public DNS를 쓰면 자신이 속한 지역에서 라우팅 경로가 가장 최적인 지역의 DNS 서비스를 받고, Google 서비스에 대한 서비스도 최적에 있는 지역의 서버에 서비스를 진행
  • 아시아에선 Google public DNS가 대만과 홍콩에 위치
  • Google public DNS 참고 자료 : https://developers.google.com/speed/public-dns/faq#locations
 

자주 묻는 질문(FAQ)  |  Public DNS  |  Google for Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. Switch to English 자주 묻는 질문(FAQ) 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 일반 Google Public DNS란

developers.google.com

 

3. Anycast DNS의 작동 방식

  • Anycast를 이용하면 DNS 확인이 훨씬 빨라짐
  • Anycast DNS에서는, DNS 질의가 하나의 특정 DNS가 아닌 다른 DNS의 네트워크로 향하며, 가장 가까우면서 가용한 DNS로 질의를 보냄
  • DNS 질의 및 응답은 가장 빨리 질의에 응답할 수 있도록 최적화된 경로를 따름
  • Anycast는 DNS 확인 서비스의 가용성을 높이는 데도 도움이 됨
  • 하나의 DNS 가 오프라인 상태가 되더라도 네트워크의 다른 DNS가 질의에 응답할 수 있음
  • CDN은 Anycast이므로, DNS 질의는 네트워크 내 어떤 데이터 센터에서도 확인 가능 → 네트워크 내의 모든 DNS가 모든 DNS 질의에 응답할 수 있음

 

4. Anycast가 없을 때의 DNS 확인 작동 방식

  • Anycast를 사용하지 않는 DNS 확인 서비스는 Unicast 라우팅을 사용하는 경우가 많음
  • Unicast 라우팅에서는 모든 DNS 서버에 하나의 IP 주소가 있으며 모든 DNS 질의는 특정 서버로 향함
  • 해당 DNS가 작동하지 않거나 사용할 수 없는 경우, 클라이언트는 추가 DNS에 질의해야 하는데, DNS 확인 시간이 길어지게 됨

 

5. Anycast DNS가 DDoS 공격에 대한 복원력을 제공하는 방식

  • DDoS 공격은 DNS 폭주 공격을 통해 DNS 마비시킴
  • DDoS 공격은 대개 IoT 기기로 된 대규모 봇네트를 이용해 DNS 질의로 DNS를 압도하거나 DNS에 폭주함
  • DNS 폭주 공격은 개방된 DNS를 통해 DDoS 공격을 증폭시키는 DNS 증폭 공격과는 다름

 

  • Anycast 네트워크는 트래픽을 전체 네트워크에 분산시킬 수 있으므로, DDoS 방어도 제공
  • Anycast 네트워크는 특정 IP 주소로의 요청에 대해 다수의 서버가 응답하므로, 한 대의 서버를 압도할 수 있는 수천 개의 요청이 다수의 서버에 나눠지는 것
  • Anycast 네트워크는 대개의 DNS 폭주 공격에 취약하지 않음

 

 

 

참고 자료

1. DNS(Domain Name System) 보안 프로토콜

  • 최초 DNS는 엄격한 보호 수단이 없었지만, 이후 카민스키(Kaminsky) 버그와 같은 보안상 취약점이 발견되면서 2010년 DNSSEC(Domain Name System Security Extensions)이 탄생
  • DNSSEC은 디지털 서명 기반의 암호화로 보안을 강화 → 전 세계 DNS 클라이언트는 DNSSEC을 이용해 DNS 응답이 정상적인 DNS 서버에서 왔으며, 전송 과정에서 변조되지 않았음을 확인
  • DNSSEC 등장 이후 DNS 오버 HTTPS(DNS over HTTPS, DoH)와 DNS 오버 TLS(DNS over TLS, DoT)가 등장
  • DNSSEC가 DNS 응답의 진정성과 데이터 무결성을 보장하지만 개인정보는 보호하지 않기 때문에 DoH와 DoT 가 개발 → DoH와 DoT 프로토콜은 종단간 암호화를 제공하므로 데이터의 기밀성이 보장
  • DNS 트래픽도 HTTPS 사이트 간의 웹 트래픽과 같은 종단간 암호화의 이점을 얻게 됨

 

1.1. DoH란

  • DNS는 전송 제어 프로토콜(Transmission Control Protocol, TCP)에서 사용할 수도 있지만 기본적으로 DNS 프로토콜은 전송 계층 프로토콜인 사용자 데이터그램 프로토콜(User Datagram Protocol, UDP)에서 동작
  • DoH는 더 빠른 UDP가 아닌 HTTPS를 통해 암호화된 DNS 메시지를 전송
  • HTTPS는 전송 계층 보안(Transport Layer Security, TLS)에서 실행되는 HTTP 프로토콜이므로 DoH는 사실상 DNS 오버 HTTP 오버 TLS(DNS over HTTP over TLS)라고 할 수 있음
  • DoH에서 DNS 질의와 DNS 응답은 모두 HTTPS를 통해 전송되며 포트 443을 사용 → 다른 HTTPS 웹 트래픽과 거의 구분 불가

 

  • 웹 브라우저에서 구글 DoH 서비스를 사용해서 CSOOnline.com 도메인 해석(resolve)
    1. 브라우저에 HTTPS URL을 입력해 HTTPS를 통해 도메인 이름을 해석하는 방식은 SSL/TLS를 사용하는 일반 웹사이트를 방문할 때와 차이가 없음
    2. 구글이 반환하는 DNS 응답은 CSO의 서버 IP 주소(A 레코드)로, 모두 JSON 형식으로 깔끔하게 포장됨
    3. 사용자와 구글 DoH 사이에 기업 중간자(man-in-the-middle, MitM) 프록시가 없다면, 사용자가 조회하고자 하는 도메인(CSO 온라인)이 무엇인지, 또는 DNS 질의에 대한 응답(JSON 결과)이 무엇인지 누구도 알아낼 수 없음

 

  • DoH를 사용하면 개인정보(데이터 기밀성) 보호와 수신된 정보의 무결성(DNS 응답이 전송 중 변조되지 않음)이 보장
  • 종단간 암호화 채널을 통해 DNS를 전송하는 방식에는 문제의 소지도 있음 → 공격자가 DoH 서비스를 악용해 악성 트래픽을 숨긴 사례가 존재 가능
  • 공격자는 구글의 DoH 또는 아무 DoH 제공업체를 통해 악성 도메인을 해석할 수 있음
  • 반환된 암호화 응답에는 공격자가 제어하는 도메인의 TXT 레코드와 함께 암호화된 악성 페이로드가 포함되고, 악성코드가 페이로드를 파싱할 수 있음
  • 기본적으로 위협 행위자가 지휘통제(C2) 활동을 용이하게 하기 위해 보안 DNS 프로토콜을 악용
  • DoH 제공업체는 합법적인 비즈니스 사용 사례가 있으므로 기업 네트워크와 DoH 제공업체 간의 인바운드 또는 아웃바운드 트래픽을 단순히 차단하기는 어려움

 

1.2. DoT란

  • DoT는 애플리케이션 계층에 상주하는 HTTPS가 아닌 전송 계층에서 TLS 프로토콜을 통해 DNS 질의를 암호화
  • DoT는 DoH와 달리 애플리케이션 수준 HTTPS를 생략
  • 기본적으로 DoT는 DNS UDP 요청과 응답을 TLS를 통해 암호화하며 메시지가 전송 과정에서 변경되지 않도록 보장
  • DoT는 HTTPS(포트 443) 또는 일반 DNS(포트 53)와는 다른 포트 853을 사용
  • DNS 클라이언트와 리졸버 간의 통신이 TLS를 통해 이뤄지므로 DoT 트래픽도 DoH와 마찬가지로 종단간 암호화의 이점을 얻게 됨

 

 

2. DoH와 DoT 중 어느 DNS 프로토콜이 더 좋을까

  • 네트워크 관리자의 입장에서는 제어가 쉬운 DoT를 선호
    • DNS 질의 모니터링 측면에서 더 높은 유연성을 제공하는 DoT 쪽을 선호
    • 네트워크에서 악성 DNS 트래픽과 침해 지표(IOC)를 차단하려는 보안 전문가라면 DoT가 유용
    • DoH의 경우 사용자의 DNS 질의가 다른 HTTPS 트래픽과 섞이므로 최종 사용자의 개인정보 보호가 더 강화 → 네트워크 관리자는 해석되는 도메인과 반환되는 DNS 응답을 확인 X
    • 네트워크 관리자 입장에서는 정상적인 비즈니스 통신에 영향을 미치지 않으면서 DoH를 차단하기가 훨씬 더 어려움
    • DoT 차단을 위해 기업 방화벽을 구성해 포트 853을 통해 이동하는 트래픽을 일률적으로 필터링하는 정책을 추가가 쉽지만, 포트 443(DoH) 필터링은 불가능 → 만약 443 포트를 차단할 경우 정상적인 트래픽도 차단될 수 있음

 

  • DNS 패킷이 가벼움
    • DoH는 애플리케이션 계층에 위치하는 HTTPS를 사용하지만, DoT는 전송 계층에 위치함으로 가벼움
    • DoT는 관여하는 계층의 수가 적으므로 패킷의 크기가 더 작음 → 패킷의 크기가 작음으로 지연 시간이 낮음

 

  • 새롭게 고안된 프로토콜의 상당수는 HTTPS 또는 SOCKS(토르) 같은 암호화된 채널을 사용
  • 최종 사용자에게 더 많은 선택권을 제공하지만 트래픽 필터링 측면에서는 보안 전문가에게 더 큰 어려움이 될 수 있음 → DNS 오버 트위터를 차단하면 트위터 전체가 차단될 수 있음
  • 프록시와 같은 보조 대책을 사용할 경우 기밀성과 사용자 개인정보 보호 측면에서 DoH가 제공하는 많은 보호 기능이 무효화될 수 있음
  • DoT든 DoH든 DNS 프로토콜 사용은 기업의 필요에 따라 결정
  • 사용자 개인정보 보호와 적절한 네트워크 모니터링 간의 타협 기준을 어디에 두느냐도 중요

 

 

3. 추가 → 클라우드플레어(Cloudflare)

  • 클라우드플레어(Cloudflare)는 새로운 DNS로 확장 시도
    1. DNS 오버 트위터(DNS over Twitter)
    2. DNS 오버 토르(DNS over Tor)
    3. DNS 오버 텔레그램(DNS over Telegram)
    4. DNS 오버 이메일(DNS over Email)

 

  • 클라우드플레어(Cloudflare)는 고객 사이트 방문자가 토르 네트워크를 사용하도록 허용하는 어니언(Onion) 서비스를 제공
  • 클라우드플레어의 리졸버(resolver) 1.1.1.1은 DoH와 DoT를 모두 지원하며 어니언 서비스를 통해 제공 → DNS 오버 토르(DNS over Tor)
  • 1.1.1.1로 질의를 해석해 결과를 트윗으로 보내는 트위터 봇으로 운영

 

'GTM과 DNS' 카테고리의 다른 글

Anycast DNS의 네트워크적 설명  (0) 2023.09.16
Anycast DNS란  (0) 2023.09.16
HTTPS 암호화된 DNS 기능 지원 → TYPE65  (0) 2023.09.16
cloudflare DNS와 google DNS의 cache flush  (0) 2023.09.16
Bind DNS recursion 설정  (0) 2023.09.16

TYPE 65 개요

  • Apple은 자사의 최신 OS인 iOS 14와 macOS 11에 암호화된 DNS 지원 기능을 추가하였음
  • DNS 통신을 암호화하여 제3자가 DNS 질의·응답을 들여다 볼 수 없도록 하는 기술로 DoH(DNS-over-HTTPS), DoT(DNSover-TLS) 등 2가지 기술 존재
  • iOS 14 및 macOS 11은 암호화된 DNS 기능을 위해 이전 버전과 달리 새로운 타입(TYPE65 HTTPS)의 DNS 질의를 추가로 발생시킴
  • DNS 운영기관에서는 신규 DNS 타입 질의로 인한 영향이 없도록 인터넷 표준에 따라 적절히 처리하는지 자체 점검할 것을 권고함
  • 애플의 최신 OS 배포 이후 새로운 유형의 DNS 질의 증가 → 애플 iOS 및 macOS 최신 버전 배포 이후, 표준화가 완료되지 않은 신규 타입인 TYPE65(HTTPS) 질의가 다량 유입됨
  • TYPE65(HTTPS) 타입은 HTTPS 연관 서비스 정보를 담기 위한 신규 DNS 레코드로 표준화 작업 진행 중인 상태
  • 애플은 암호화 DNS(DoH) 지원을 위한 목적으로 해당 타입의 DNS 질의를 사용
  • 애플, 구글, 아카마이, 클라우드플레어 등 빅테크 기업들은 새로운 DNS 관련 표준들의 개발에 직접 참여 → 일부는 표준화가 완료되기 전에도 자사 서비스에 선 탑재
  • 예상되지 않은 신규 유형의 질의는 DNS 질의량 증가 외 GSLB 등 DNS 기능을 활용한 서비스에 영향을 미칠 수 있음

 

iOS·macOS DNS 질의 변경사항

  • iOS 14와 macOS 11은 암호화된 DNS(DoT/DoH) 지원을 위해 캐시 DNS를 선택하는 몇 가지 방법이 추가됨
    1. 사용자가 기기 전체에 적용되는 기본 DNS로 DoT/DoH를 지원하는 캐시 DNS를 직접 설정
    2. 도메인 소유자가 소유한 도메인에 질의할 때 특정한 캐시 DNS를 사용하도록 지정
    3. 앱 개발자가 개별 앱에서 특정한 캐시DNS를 사용하도록 지정

 

  • 도메인 소유자는 DNS 레코드(TYPE65 HTTPS RR)을 통해 소유한 도메인에 질의할 때 암호화를 지원하는 특정한 캐시DNS를 사용하도록 지정 가능
  • 예시) foo.example.com. 7200 IN HTTPS 1 . ( dohuri=https://doh.example.net/dns-query ) ⇒ foo.example.com 도메인 질의 시 캐시 DNS로 doh.example.net을 사용하도록 지정

 

  • iOS 14와 macOS 11은 특정한 캐시 DNS를 사용 설정 여부를 확인하기 위해 사용자가 웹, 앱 등 사용하여 인터넷 이용 시 기존 DNS 질의(A, AAAA 타입 질의)에 추가로 TYPE65(HTTPS RR) 질의를 발생시킴
  • TYPE65(HTTPS RR) 및 DNS 지정·확인 절차는 아직 표준이 아닌 인터넷 초안(Internet Draft)으로 향후 변경될 수 있음

 

발생가능한 문제점

  • TYPE65(HTTPS RR) 질의를 정상적으로 처리하지 않는 경우, 불필요한 DNS 질의가 증가하거나 도메인 접속이 불안정해질 수 있음
  • DNS 서버나 네트워크·보안장비 등에서 질의가 차단될 경우, 응답을 받지 못한 기기에서 같은 질의를 반복 시도하여 불필요한 DNS 트래픽이 지속 발생 가능
  • 일부 DNS 서버나 네트워크·보안장비에서 자주 사용되는 DNS 레코드 타입(A, NS, MX 등)이 아닌 DNS 질의 패킷을 차단·폐기하거나 처리하지 않는 경우가 있음
  • 해당 타입에 대해 잘못된 DNS 응답*을 하는 경우, 도메인 접속에 문제를 일으킬 가능성도 있음
  • TYPE65 질의의 A, NS 등 다른 타입의 질의 결과로 응답하거나, NXDOMAIN으로 응답하면 잘못된 DNS 정보가 전파되어 도메인 접속에 문제가 발생할 수 있음

 

DNS 점검 방법 → TYPE65 및 알려지지 않은 타입으로 인한 문제 발생

  • 운영 중인 DNS에 TYPE65 및 알려지지 않은 타입(Unknown Type)에 대한 테스트 질의*하여 정상 처리되는지 확인
  • TYPE65 및 알려지지 않은 DNS 타입 질의가 의도치 않게 차단되거나 비정상 응답할 경우, 아래와 같이 조치 가능
    1. 사용 중인 DNS S/W에서 해당 타입 질의를 처리하지 못하는 경우, 최신 DNS S/W로 업그레이드
    2. 네트워크·보안장비 등에서 해당 타입 질의를 차단하거나 제대로 통과시키지 못하는 경우, 차단 정책을 조정하거나 제조사에 문의

 

  • 문제가 발생할 경우의 권고사항
    1. 상기 문제점은 TYPE65에만 발생하는 것이 아닌 향후 다른 DNS 레코드 타입이 새롭게 만들어질 때도 동일하게 발생할 수 있음
    2. 현재 DNS 레코드 타입은 60가지 이상 존재하고 있으며, 인터넷 표준 제·개정에 따라 새로운 타입이 계속 추가될 수 있음
    3. 신규 타입 추가로 인한 문제없이 DNS 기능 확장이 가능하도록 인터넷 표준(RFC 1035, 3597)은 DNS 서버가 어떤 레코드 타입에 대해서도 투명하게 처리할 것을 명시하고 있음
    4. 따라서, DNS 운영기관에서는 DNS 서버가 인터넷 표준에 따라 동작하는지 점검 및 필요한 조치를 취할 것을 권고함

 

참고 자료

 

https://www.google.com/url?cad=rja&cd=&esrc=s&opi=89978449&q=&rct=j&sa=t&source=web&uact=8&url=https%3A%2F%2Fkisa.or.kr%2Fpost%2FfileDownload%3FmenuSeq%3D20202%26postSeq%3D0227%26attachSeq%3D1&usg=AOvVaw1UPOdq6MnVhu-3RxUexLIS&ved=2ahUKEwig6e6ejq6BAxX6r1YBHTHhDekQFnoECBMQAQ

 

www.google.com

 

'GTM과 DNS' 카테고리의 다른 글

Anycast DNS란  (0) 2023.09.16
DNS 보안 프로토콜 → DoH와 DoT  (0) 2023.09.16
cloudflare DNS와 google DNS의 cache flush  (0) 2023.09.16
Bind DNS recursion 설정  (0) 2023.09.16
Extension DNS(EDNS0)란  (0) 2023.09.16

+ Recent posts