System Compleat.

Protect from DDoS with Proxy, Varnish

Techs
( 정윤진  yjjeong@rsupport.co.kr )

서비스를 운영하다 보면, 심심치 않게 종종 발생하는 DDoS 공격을 볼 수 있다.
이 DDoS 공격은, 정말 아무리 좋은 회사의 L7 방화벽 장비를 이용해도 결국 Edge 레벨에서의 방어이기 때문에 IDC에서 너네 골치아프니 나가라 하면 눈물을 머금고 다른 데이터 센터를 향해 떠돌이 신세로 전락하는 경우가 많다.

내 생각에 가장 최선의 DDoS 방어 기법은, 회선 속도 자체가 서버 Down 을 발생 시키지 않을 만큼의 낮은 대역폭이거나,  아니면 정말 화끈하게 분산 구조를 충분히 적용하여 100Gbps 이상의 트래픽을 견디어 낼 수 있는 인프라를 가지는 방법밖에 없다.  전자의 경우 적당히 저렴한 사양의 장비와 잘 구성된 서버만 있다면 Edge 레벨에서의 방어를 통해 어느정도 서비스 Down은 막아 낼 수 있으며 얼마 되지 않는 트래픽 때문에 IDC에서 쫒겨 나지도 않는다. , 후자의 경우는 100Gbps 이상의 트래픽을 공격자가 유발시키기 이전에는 절대 서비스가 정지하지 않는다.

하지만, 대체 누가 100Gbps 이상의, 아니면 충분히 타협해서 50Gbps 이상의 공격을 잘 견디어 낼 수 있겠는가.

이에 대한 방책은 DNS 의 우회를 통한 Proxy Farm 의 구성이 아닌가 싶다.  다만 이러한 방법으로도 역시 서비스가 정지할 가능성은 있어서, 내 생각에 최선의 해법은 공격자로 의심되는 좀비PC 의 트래픽을 선별해서 Proxy 로 가도록 우회 시키는 것이 좋다고 본다.

자, 그럼 대체 어떻게 Proxy Farm 을 구성해야 하며, 어떻게 공격 클라이언트를 구분지을 것인가.

답은, iptables + varnish 의 조합으로 가능하지 않을까 싶다.

일단 저렴한 가격의 FTTH 또는 10M 미만의 회선을 받도록 하고, 여기에 LVS 등과 같은
로드밸런서를 붙인다.  이 로드밸런서 아래의 Real Server 들은 모두 Varnish 로 구성하도록 하고 이 아래에 서비스 서버와 동일한 웹서버를 두던지, 아니면 Varnish 자체가 Proxy 동작하므로 실제 서비스하고 있는 서버의 IP 를 박아준다.

이렇게 서버들의 구성이 끝나게 되면, 다음은 Redirect 처리다.

네임서버를 직접 운영하고 있다면, 네임 서버를 한대 더 증설하고 환경을 사설망으로 바꿔서 DNAT 처리를 하던, 공인 망에서 SLB 를 하던, 앞단에 iptables 를 올릴 서버를 한대 더 구성한다.  이쯤에서 이미 눈치 챘겠지만,  새로 만든 BIND 서버는 우리가 서비스하는 a.com 이라는 도메인에 대한 A 레코드를 새로 구성한 Proxy Farm 의 공인 IP 로 지정한다.

자, 그럼 iptables 의 조건에 걸리도록 하려면 어떻게 해야 하는가.
답은, 실 서비스 도메인인 a.com 에 대한 TTL 값을 굉장히 짧게 주는 것이다.
이후, 네임 서버 앞쪽의 iptables 에서 udp 53을 dest로 하는 패킷에 대해 특정 시간안에 많은 요청이 있게 되면 지정해 둔 내부의 네임서버로 포워딩 되도록 룰을 설정한다. 
충분한 테스트를 수행하고, 적절한 count 로 설정해야 훗날 방비가 됨은 물론이겠다.
또한, 좀비 PC 들의 공격이 우리나라에서 발생되는지, 아니면 중국등 외국에서 발생되는지를 파악해서 만약 한국 전용 서비스인데 중국등지에서 공격이 온다면, geoip 를 사용한 iptables 정책으로도 수용 가능 하겠다.

이와 함께 조정해야 할 것은, 웹 서버의 Keep alive timeout 에 대한 지정이다.  정상적인 사용자의 경우 브라우저를 통해 서비스 받을 것이기 때문에 별 문제가 없으리라 생각된다.

자, 그럼 이제 끝났는가?  아니다.
DDoS 공격을 위한 좀비들의 공격에서 보다 더 자유로워 지려면 실 서비스 구간에도 준비해야 한다.  앞서 적용한 iptables 를 동일하게 서비스 구간에도 준비하여 준다.


사실, 이 방법은 내가 만든 카더라 아이디어다.  이 아이디어의 요지는, 다음과 같다.

1.  공격자의 IP를 솎아 내고, 지정한 패턴으로 공격이 발생하는 경우 해당 클라이언트IP를
     Proxy Farm 으로 보낼 수 있어야 한다.

2. Proxy Farm 은 비교적 성능이 출중한 Varnish 를 사용하도록 한다.

3. 애초에 DNS 레벨에서 응답을 Proxy 쪽으로 줄 수 있어야 한다.
    실 서비스 망에서 처리하려 하는경우, 대역폭 문제로 IDC에서 쫒겨 날 가능성이 있다.

4. L7 레벨로 처리하지 않아도 된다.  단순 IP 레벨에서 요청에 대한 횟수 제한 조건만으로
   처리하여 장비 비용에 대한 부담을 줄인다.

5. 모든 DDoS 공격은 평생 지속되지 않는다.  공격 발생시 바로 신고하여 향후 피해를 줄인다.

6. 대역폭이 100M 미만이라면, 그냥 DDoS 전용 방어 장비를 구입하는것도 방법이다.


이런 방법을 수행하기 위해 iptables 와 proxy 서버를 예로 들었지만, 보다 좋은 방법이 있을 수도 있다.  애초에 L7 방화벽등이 있다면, 사용 가능한 많은 방법이 존재 할 것이다.
또는 이미 nginx 나 varnish 등을 실 서비스에 이용하고 있다면 보다 유연한 방어를 수행 할 수 있다.

한번 쯤은 이런 대책없는 공격에 대해 고민해 보고, 테스트를 통해 나만의 계획을 가질 수 있지 않을까 한다.

훗, 정작 Varnish 자체에 대한 이야기는 없어서, 다음에 다시 소개해야겠다.
내가 이래.. ㅎ


기타 구체적인 각 서버의 설정 등은, 다음의 링크를 참조 한다.

참고자료.
http://varnish.projects.linpro.no/

http://www.netfilter.org/

http://www.techsupportforum.com/networking-forum/security-firewalls/284749-iptables-conditional-redirect.html