DDoS공격에 대처하는 iptables수정법
이번에 테스트중인 서버에 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
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로 줘야할지 애매하네요..
2014/04/21 at 5:20 PM
오타가 있었네요 여기서 1개 이상이 아니라 10개 이상입니다.
>>> 10개의 패킷만 허용( 1개 이상은 DROP)
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을 설정해 주었을때가 해당할것 같습니다.)