강좌
클라우드/리눅스에 관한 강좌입니다.
네트워크 분류

DNS 트래픽 허용을 위한 iptables 룰 설정

작성자 정보

  • 관리자 작성
  • 작성일

컨텐츠 정보

본문

DNS 트래픽 허용을 위한 iptables 룰 설정





 

DNS(Domain Name Service)는 호스트 이름을 IP 주소로 또는 IP 주소를 호스트 이름으로 변환하는 역할을 하며 기본적으로 udp 53번을 사용한다.

 

 

 

 

그러나 DNS와 관련하여 주의하여야 할 부분이 있다.

 

 

 

 

 

 

첫째로, master DNS 서버에서 slave DNS 서버로의 zone transfer(zone 전송) 또는 자주 있지는 않지만 패킷 사이즈가 512 byte를 초과할 경우에는 udp 대신 tcp를 사용한다는 점이다.

 

두 번째로 일부 DNS의 경우 프로그램과 버전에 따라 클라이언트가 1024: 포트가 아닌 목적지 포트와 동일한 53번을 사용하는 경우도 있다는 점을 고려해야한다.

 

 

 

 

따라서 이러한 예외 상황도 함께 고려하여 룰을 설정해야하는데 만약 DNS 서비스를 정확히 허용하지 않을 경우에는 서비스에 직접적인 장애가 되므로 룰 설정 시 매우 주의하여야 한다.

 

 

 

 

 

클라이언트로서 DNS 트래픽 허용

 

방화벽에서 직접 DNS 서버를 운영하는 것이 아니라 ISPDNS를 이용하려 할 때 서버에서 외부 ISPDNS 서버로 질의(query)할 수 있도록 관련 트래픽을 허용하여야 한다.

 

 

 

 

상태 추적에서는 udp 트래픽도 일반 tcp 트래픽과 같은 방식으로 작동하며 다를 것은 없다.

 

 

 

 

아래 룰의 경우 $DNS_SERVER 변수에는 사용할 DNS 서버의 IP 주소를 입력하면 된다.

 

$IPTABLES -A OUTPUT -p UDP --sport 1024: -d $DNS_SERVER --dport 53 -m state --state NEW -j ACCEPT

$IPTABLES -A INPUT -p UDP -s $DNS_SERVER --sport 53 --dport 1024: -m state --state ESTABLISHED -j ACCEPT

tcp 트래픽도 같은 방법으로 다음과 같이 추가해주면 된다.

 

$IPTABLES -A OUTPUT -p TCP --sport 1024: -d $DNS_SERVER --dport 53 -m state --state NEW -j ACCEPT

$IPTABLES -A INPUT -p TCP -s $DNS_SERVER --sport 53 --dport 1024: -m state --state ESTABLISHED -j ACCEPT

4개의 룰 역시 내부에서 외부로 나가는 트래픽인데, 이 트래픽은 이미 앞에서 허용되었으므로 별도로 언급하지 않아도 된다.

 

DNS 서비스 운영시 트래픽 허용

 

방화벽에서 직접 bind등의 데몬을 실행하여 외부에 DNS 서비스를 제공할 경우에는 위의 룰을 약간 변경하여 사용하면 된다.

 

 

 

 

먼저 어떠한 곳에서 DNS 질의를 하게 될지 모르기 때문에 모든 곳에서 접근할 수 있도록 -s 0/0으로 허용하였고, 소스 포트는 1024 이후의 비특권 포트, 목적지 포트는 53번이 된다.

 

 

 

 

첫 접속 요구이므로 상태는 NEW가 된다.

 

 

 

 

이에 대한 응답도 다른 서비스의 작동 방식과 동일하다.

 

 

 

 

아울러 한 가지 주의할 것은 bind 4.x 버전에서는 DNS 질의 시 클라이언트가 1024 이후의 포트를 사용하는 것이 아니라 기본적으로 53번을 사용하므로 이 트래픽도 함께 고려하여 추가해 주어야 한다는 것이다.

 

 

 

 

또한 bind의 경우 query-source address 지시자를 이용하여 DNS 서버의 소스포트를 임의로 지정할 수 있도록 제공하고 있는데, 실제로 일부에서는 소스 포트를 53으로 지정하여 사용하는 곳도 있다.

 

 

 

 

bind 4.x를 사용하는 곳이 그리 많지 않지만 아직 일부에서는 여전히 사용하고 있으므로 이 트래픽을 허용하지 않을 경우에는 이곳에서의 DNS 질의를 필터링하게 되어 접속이 되지 않는 문제가 발생할 수 있으므로 주의하여야 한다.

 

 

 

 

 

 

일반적인 DNS 트래픽 허용

 

$IPTABLES -A INPUT -p UDP -s 0/0 --sport 1024: --dport 53 -m state --state NEW -j ACCEPT

$IPTABLES -A OUTPUT -p UDP --sport 53 --dport 1024: -m state --state ESTABLISHED -j ACCEPT

$IPTABLES -A INPUT -p TCP -s 0/0 --sport 1024: --dport 53 -m state --state NEW -j ACCEPT

$IPTABLES -A OUTPUT -p TCP --sport 53 --dport 1024: -m state --state ESTABLISHED -j ACCEPT

 

Bind 4.x 버전 대 트래픽 추가 허용

 

$IPTABLES -A INPUT -p UDP -s 0/0 --sport 53 --dport 53 -m state --state NEW -j ACCEPT

$IPTABLES -A OUTPUT -p UDP --sport 53 --dport 53 -m state --state ESTABLISHED -j ACCEPT

$IPTABLES -A INPUT -p TCP -s 0/0 --sport 53 --dport 53 -m state --state NEW -j ACCEPT

$IPTABLES -A OUTPUT -p TCP --sport 53 --dport 53 -m state --state ESTABLISHED -j ACCEPT

 

아울러 DNS서버에 등록된 즉 설정되어 있는 도메인에 대한 리졸빙(resolving)만 제공하는 것이 아니라 일반 유저들이 이 DNS 서버를 이용하여 일반사용자의 PC에서 인터넷을 사용할 수 있도록 허용하려면 추가적인 설정이 필요하다.

 

 

 

 

앞에서 설명한 클라이언트로서 DNS 트래픽 허용은 자체 DNS를 사용하지 않고 ISPDNS 서버를 참고하도록 설정하였을 경우에 해당하며 자체 DNS 서버를 사용하여 일반적인 DNS를 사용할 수 있도록 하려면 다음의 설정을 추가해야 한다.

 

 

 

 

'클라이언트로서 DNS 트래픽 허용'의 룰과 동일하지만 특정한 DNS 서버에만 질의하는 것이 아니라 root 네임서버부터 시작해서 임의의 DNS 서버에 직접 질의하여야 하므로 $DNS_SERVER 부분을 0/0으로 변경하거나 빼면 된다.

 

$IPTABLES -A OUTPUT -p UDP --sport 1024: --dport 53 -m state --state NEW -j ACCEPT

$IPTABLES -A INPUT -p UDP -s 0/0 --sport 53 --dport 1024 -m state --state ESTABLISHED -j ACCEPT

$IPTABLES -A OUTPUT -p TCP --sport 1024: --dport 53 -m state --state NEW -j ACCEPT

$IPTABLES -A INPUT -p TCP -s 0/0 --sport 53 --dport 1024 -m state --state ESTABLISHED -j ACCEPT

 

결론적으로, DNS를 요청하는 클라이언트가 일반 PC나 서버라면 소스포트가 1024: 만 고려하면 되지만 DNS 서버라면 53번도 고려해 주어야 한다.

 

 

 

 

 

 

???? [필자경험담]

DNS 운영 시 tcp 53을 허용할 것인가? 거부할 것인가?

 

“4DNS서버 보안에서도 언급하였지만 방화벽 룰을 설정할 때 DNS 서비스와 관련하여 과연 TCP를 허용하여야 할 것인지 거부할 것인지 선택의 기로에 놓이게 된다.

 

 

 

 

일부 서버관리자들은 허용하여야 한다는 의견도 있고, 또 다른 서버관리자들은 거부해도 무방하다는 의견도 있다.

 

 

 

 

이 정책을 결정하기 위해서는 각각의 트래픽이 사용되는 용도를 정의하면 보다 분명해 질 것이다.

 

 

 

 

,

 

udp 53은 일반적인 DNS 질의 및 전송을 담당한다.

 

반면, tcp 53

- Zone transfer와 같이 많은 용량을 전송 시

- udp 53의 메시지 사이즈가 484 byte를 초과하는 경우(패킷 사이즈의 경우 512 byte) tcp로 재질의 하는 것으로 알려져 있다.

가끔 트래픽을 감시하다보면 정상적인 트래픽인데, 메시지 사이즈가 커 tcp로 질의하는 경우가 있으므로 결론적으로 tcp도 허용하여야 한다.

 

 

 

 

이와 관련하여 RFC 1123에서는 다음과 같이 분명히 밝히고 있다.

 

DNS servers MUST support UDP and SHOULD support TCP.

 

자신이 운영하는 DNS 서버에 과연 tcp DNS 트래픽이 있는지 여부를 확인하려면 “tcpdump tcp port 53”으로 확인해 보기 바란다.

 

해당 DNStcp가 허용되어 있는지 확인하는 방법은 직접 서버의 53번으로 telnet 접속해 보아도 되고, 다음과 같이 vc 옵션을 주어 질의해 보아도 된다.

 

 

 

 

 

udp를 이용한 DNS 질의

# dig @dns.server.com server.com. any +novc

 

tcp를 이용한 DNS 질의

# dig @dns.server.com server.com. any +vc

 

 

 

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,037 명
  • 현재 강좌수 :  35,806 개
  • 현재 접속자 :  127 명