blog.git

blog

~ Personal research notes. blog.sqzer.com
git clone https://github.com/debuman/blog.git

content/writing/bind9-dns-install.md (4403B)

      1 ---
      2 title: "Bind 9 DNS Server 설치"
      3 titleKo: ""
      4 date: 2024-11-05
      5 deck: ""
      6 type:
      7 tags: []
      8 draft:
      9 ---
     10 
     11 AWS Lightsail Amazon linux 인스턴스 호스트에 BIND 9 DNS Server 설치 후 설정까지 진행 해봤다.
     12 
     13 ## BIND 9 설치 및 기본 설정
     14 
     15 **패키지 매니저 업데이트**
     16 
     17 ```bash
     18 sudo yum update -y
     19 ```
     20 
     21 **BIND 9 설치**
     22 
     23 ```bash
     24 sudo yum install -y bind bind-utils
     25 ```
     26 
     27 **BIND 9 설정**
     28 
     29 ```bash
     30 sudo vi /etc/named.conf
     31 ```
     32 
     33 **모든 IP에서 쿼리를 허용**
     34 
     35 ```
     36 allow-query { any; };
     37 ```
     38 
     39 **IPv6 주소에서 요청을 수신하지 않도록 설정**
     40 
     41 ```
     42 options {
     43     listen-on-v6 { none; };
     44 };
     45 ```
     46 
     47 ## 보안 옵션 설정
     48 
     49 ### DNSSEC (DNS Security Extensions) 사용
     50 
     51 DNSSEC은 DNS 쿼리 응답이 인증되지 않은 경우, 그 응답을 무효화함으로써 스푸핑 공격을 막는 데 효과적. DNS 서버에서 DNSSEC을 사용하면 클라이언트는 응답이 신뢰할 수 있는지 확인할 수 있음.
     52 
     53 **DNSSEC 활성화(Default)**
     54 
     55 ```
     56 options {
     57     dnssec-enable yes;
     58     dnssec-validation yes;
     59 };
     60 ```
     61 
     62 ### DNS 캐시 중독 (DNS Cache Poisoning) 방지
     63 
     64 캐시 중독은 공격자가 잘못된 데이터를 DNS 서버의 캐시에 저장하여, 그 데이터를 클라이언트에게 반환하도록 만드는 공격이다. 재귀적인 DNS 서버에서 문제가 될 수 있다.
     65 
     66 **무작위 포트 및 ID 사용(DNSSEC만 활성화 해도 충분)**
     67 
     68 쿼리의 소스 포트와 트랜잭션 ID를 무작위로 사용하여 예측 불가능하게 만듦으로써 캐시 중독 공격을 어렵게한다.
     69 
     70 ```
     71 options {
     72     query-source address * port *;
     73 };
     74 ```
     75 
     76 ### DDoS 공격 (DNS Amplification) 방지
     77 
     78 DNS 증폭 공격은 DNS 서버를 이용해 공격 대상에게 대량의 트래픽을 전송하는 DDoS 공격의 일종이다.
     79 
     80 **Rate Limiting (RRL) 적용(BIND 9.9.4 이상에서 기본적으로 지원)**
     81 
     82 rate-limit 옵션 추가
     83 
     84 ```
     85 options {
     86     rate-limit {
     87         responses-per-second 10;        # 초당 응답 제한 (기본값은 5)
     88         window 5;                       # RRL 윈도우 크기 (초 단위)
     89         slip 2;                         # 1/x 확률로 응답을 전송함 (2 = 50%)
     90         qps-scale 250;                  # 응답 제한을 조정할 클라이언트 수 (기본값은 1000)
     91         ipv4-prefix-length 24;          # IPv4 네트워크 그룹화 범위 (/24 기본값)
     92         ipv6-prefix-length 56;          # IPv6 네트워크 그룹화 범위 (/56 기본값)
     93         exempt-clients { localhost; };  # RRL 제한에서 제외할 클라이언트
     94     };
     95 };
     96 ```
     97 
     98 - responses-per-second : 한 클라이언트 IP에 대해 초당 허용되는 응답 수. 초과하는 경우 응답을 제한한다. 기본값은 5이며, 이를 10으로 설정한다.
     99 - window : 쿼리를 계산할 시간 창을 설정한다. 5초 동안 응답을 계산하는 시간 창을 설정한다.
    100 - slip : RRL이 활성화된 경우, 몇 개의 쿼리 응답을 드롭하고 몇 개를 허용할지 설정한다. slip 2는 50% 확률로 응답을 전송하겠다는 뜻이다.
    101 - qps-scale : 응답 제한을 조정할 클라이언트의 수를 설정한다.
    102 - ipv4-prefix-length 및 ipv6-prefix-length : 네트워크 그룹화에 사용할 네트워크 길이를 설정한다.
    103 - exempt-clients : RRL 제한에서 제외할 클라이언트를 설정한다.
    104 
    105 ### BIND 9 서비스 재시작 및 부팅 시 자동 실행 설정
    106 
    107 ```bash
    108 sudo systemctl restart named
    109 sudo systemctl enable named
    110 ```
    111 
    112 ### 해당 인스턴스 방화벽 규칙에 DNS(53 / TCP, UDP) 추가
    113 
    114 ![](/uploads/network-bind-9-dns-server-seolci/image-11.png)
    115 
    116 ### BIND 9 서버가 제대로 설정되었는지 확인
    117 
    118 ![](/uploads/network-bind-9-dns-server-seolci/image-12.png)
    119 
    120 ## 클라이언트에서 테스트
    121 
    122 Windows
    123 
    124 ```sh
    125 nslookup example.com <BIND 9 서버의 IP 주소>
    126 ```
    127 
    128 ![](/uploads/network-bind-9-dns-server-seolci/image-13.png)
    129 
    130 Linux
    131 
    132 ```bash
    133 dig @<BIND 9 서버의 IP 주소> example.com
    134 ```
    135 
    136 ![](/uploads/network-bind-9-dns-server-seolci/image-14.png)
    137 
    138 ![](/uploads/network-bind-9-dns-server-seolci/image-15.png)
    139 
    140 *DNS 요청, 응답 패킷 확인*
    141 
    142 ### 테스트 결과 정상이라면 DNS 서버 변경
    143 
    144 **Linux에서 DNS 서버 설정 변경**
    145 
    146 /etc/resolv.conf 파일을 편집하여 BIND 9 서버의 IP 주소를 지정
    147 
    148 ```bash
    149 sudo vim /etc/resolv.conf
    150 ```
    151 
    152 파일에 다음을 추가
    153 
    154 ```
    155 nameserver <BIND 9 서버의 IP 주소>
    156 ```