DDoS공격에 대처하는 iptables수정법

Posted on

이번에 테스트중인 서버에 DDoS공격이 발생해서 대처법을 정리해본다.

테스트중인 서버에 아래와 같은 대량의 접속이 발생.. 그러나 SYN_RECV만 계속 되고 있다.

트래픽이 갑자기 튄다.
트래픽이 갑자기 튄다.

정상적이지 않은 접속으로 대량으로 접속만 만들어 내고 있다.

admin@www-198-168-1-5:~$ netstat -nt
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 192.168.1.5:80          5.9.108.149:15168       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:63910       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:53065       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:41863       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:12438       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:29104       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:22377       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:50916       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:4704        SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:24862       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:3733        SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:8741        SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:36701       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:25031       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:15399       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:16775       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:53965       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:15129       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:38320       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:4892        SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:41745       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:43706       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:33912       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:57312       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:51826       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:43793       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:7160        SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:47140       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:47156       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:36293       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:60881       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:30607       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:31100       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:30443       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:8979        SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:64864       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:1949        SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:25143       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:15479       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:58569       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:35035       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:31875       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:65141       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:10871       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:49797       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:46004       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:60433       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:36607       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:47029       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:56695       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:15377       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:41637       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:20038       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:50312       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:23161       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:13861       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:32862       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:34492       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:5531        SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:13806       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:60450       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:34474       SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:8300        SYN_RECV
tcp        0      0 192.168.1.5:80          5.9.108.149:36432       SYN_RECV
tcp        0      0 172.17.1.4:22           172.17.1.183:57416      ESTABLISHED
tcp        0      0 172.17.1.4:22           172.17.1.183:57598      ESTABLISHED
tcp6       0      0 192.168.1.5:80          196.41.2.224:45695      ESTABLISHED
tcp6       0      0 127.0.0.1:33673         127.0.0.1:1099          TIME_WAIT
tcp6       0      0 127.0.0.1:54048         127.0.0.1:40049         TIME_WAIT

이럴때 일반적으로는 아래와 같이 해당 IP주소만 차단하는게 일반적이다.

$ sudo /sbin/iptables -I INPUT -s 5.9.108.149 -j DROP

그러나 매번 그렇게 차단하는게 귀찮다고 생각해서 조금 검색을 해보니 좋은 방법이 있어 정리 및 공유해 본다.

iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j RETURN

모든 tcp 접속에 대해서 limit이 될때 까지 허용한다.

여기서 2가지 추가 옵션이 있는데

  • –limit 1/s : 초당 최대 평균 매치 값
  • –limit-burst 3 : 매칭되는 최대 패킷 수

이다. 이 숫자를 조금 변경해서 적용해 보았는데, limit 숫자를 늘렸을때, 공격이 감지 되지 않는 케이스도 많고 해서 그냥 쓰고 있다.

각 파라메터에 대한 설명은 아래와 같다.

  • ‐‐limit rate: Maximum average matching rate: specified as a number, with an optional ‘/second’, ‘/minute’, ‘/hour’, or ‘/day’ suffix; the default is 3/hour.
  • ‐‐limit‐burst number: Maximum initial number of packets to match: this number gets recharged by one every time the limit specified above is not reached, up to this number; the default is 5.

아래의 예제는 전체적으로 자동화 된, 공격 차단 룰이다.
핑 확인을 하는 경우, 로그에 기록하고 차단하는 룰도 포함되어 있다.

# Limit the number of incoming tcp connections
# Interface 0 incoming syn-flood protection
iptables -N syn_flood
iptables -A INPUT -p tcp --syn -j syn_flood
iptables -A syn_flood -m limit --limit 1/s --limit-burst 3 -j RETURN
iptables -A syn_flood -j DROP
#Limiting the incoming icmp ping request:
iptables -A INPUT -p icmp -m limit --limit  1/s --limit-burst 1 -j ACCEPT
iptables -A INPUT -p icmp -m limit --limit 1/s --limit-burst 1 -j LOG --log-prefix PING-DROP:
iptables -A INPUT -p icmp -j DROP
iptables -A OUTPUT -p icmp -j ACCEPT

그 이외에 ssh로 접속을 계속적으로 시도하는 해킹 시도는 아래의 룰을 적용하면 어느정도 막을 수 있다.
10분동안 10개 이상 커넥션을 맺지 못하도록 하는 스크립트이다.

iptables -I INPUT -p tcp -s 0/0 -d $SERVER_IP --sport 513:65535 --dport 22 -m state --state NEW,ESTABLISHED -m recent --set -j ACCEPT
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 600 --hitcount 11 -j DROP
iptables -A OUTPUT -p tcp -s $SERVER_IP -d 0/0 --sport 22 --dport 513:65535 -m state --state ESTABLISHED -j ACCEPT

시간을 변경하고 싶으면, –seconds의 뒷자리 숫자를 변경하고,
횟수를 변경하고 싶으면, –hitcount의 뒷자리 숫자를 변경하면 된다.

참고 : http://www.cyberciti.biz/tips/howto-limit-linux-syn-attacks.html

3 thoughts on “DDoS공격에 대처하는 iptables수정법

    김도선 said:
    2014/04/21 at 5:19 PM

    “iptables -A INPUT -p tcp –syn -m limit –limit 1/s –limit-burst 3 -j RETURN”
    이 룰의 좀 이해가 잘 안되네요 SYN패킷에 대해서 초당 1개, 최대 매칭 3개패킷에 해당한다면 RETURN한다는건가요?
    그렇다면 초당 10개의 패킷만 허용( 1개 이상은 DROP) 하겠다고 한다면 (burst고려안했을때)
    “iptables -A INPUT -p tcp –syn -m limit –limit 10/s -j DROP” 이런식으로 룰을 만들어야 되는지 ..-_-
    아님 target을 ACCEPT로 줘야할지 애매하네요..

      김도선 said:
      2014/04/21 at 5:20 PM

      오타가 있었네요 여기서 1개 이상이 아니라 10개 이상입니다.
      >>> 10개의 패킷만 허용( 1개 이상은 DROP)

      zunonia responded:
      2014/04/21 at 9:01 PM

      “iptables -A INPUT -p tcp –syn -m limit –limit 1/s –limit-burst 3 -j RETURN”
      이 룰은 최대 3패킷에 대해서 초당 1패킷을 리턴한다는 뜻입니다.
      따라서 말씀하신 초당 10개의 패킷만 허용한다는 조건을 만족시키시려면,
      “iptables -A INPUT -p tcp –syn -m limit –limit 10/s –limit-burst 10 -j RETURN”
      위와 같이 적용을 해주셔야 합니다.
      tcp syn에 대한 룰이므로 RETURN이 되구요.
      다른 형태의 패킷의 경우에는 ACCEPT가 될것 같습니다. (이경우에는 기본으로 전체 패킷을 DROP을 설정해 주었을때가 해당할것 같습니다.)

Leave a comment