본문으로 바로가기



안녕하세요, SATAz입니다.

이번 포스팅은 IPTables에 대해서 소개드리는 열 번째 내용입니다.



지난 포스팅에서는 hashlimit를 이용한 Flooding 공격 방어에 대해서 다루었는데요,

이번 포스팅은 IPTables의 limit 매치를 이용하여 Flooding 공격을 방어하는 방법에 대해서 알려드리고자 합니다.


limit 매치는 connlimit, recent, limit 매치와는 다르게, DROP정책이 아닌 ACCEPT 정책을 통해서 트래픽을 제한합니다.

상당히 특이한 매치입니다...



▣주의!!! : 이 블로그에 작성된 IPTables 포스팅들은 교육용으로 작성된 내용입니다. 

 서비스 중인 서버에 아래의 내용만 갖고 바로 적용하지 마시고, 서버에 적용 전에 반드시 테스트를 거치시기 바랍니다.  IPTables도 방화벽인지라, 무턱대고 서버에 적용했다가는 서비스 중단되는 사태가 발생할 수 있습니다. 필히 주의하셔야합니다!!!


#IPTables 설정를 위한 환경


- 테스트 머신 : VMware WorkStation 12 Player

- 운영체제 : CentOS/RHEL 7 - 64bit ( Minimal 설치 )

- 메모리 : 2GB

- IPTables Version : iptables v1.4.21

- 서버 아이피 : 192.168.0.18


# 공격을 위한 서버 설정 환경

- 공격자 테스트 머신 : VMware WorkStation 12 Player

- 공격자 운영체제 : CentOS/RHEL 6 - 64bit ( Minimal 설치 )

- 공격자 메모리 : 2GB

- 공격자 서버 아이피 : 192.168.0.19



1. limit를 이용해서, 비정상적으로 많은 접근이 발생하는 것을 차단하자

 IPTables에는 limit라는 매치가 있습니다. limit 1초/1분/1시간 단위로 패킷이 들어오는 횟수를 선허용하고, 그 다음 패킷을 후차단하는 설정입니다.


※ limit 매치는 DROP 정책이 아니라, ACCEPT 정책을 사용합니다!!!


# limit를 이용한 패킷 차단 명령어

iptables -D INPUT -s 0.0.0.0/0 -d 192.168.0.18/32 -p tcp --dport 80 -j ACCEPT

iptables -I INPUT -m limit -p tcp -d 192.168.0.18 --dport 80 --limit 10/m --limit-burst 10  -j ACCEPT


위의 명령어는 다음과 같이 해석이 가능합니다.

첫 번째 줄 : 192.168.0.18 아이피의 80/tcp로 들어오는 패킷 허용 정책을 삭제한다.

두 번째 줄 : 처음 10번째 패킷을 허용하고, 11번째 패킷부터는 차단한다. 6초마다 패킷을 1개씩 허용한다. 


역시나 80포트의 속도제한을 위해서 ACCEPT를 걸다보니, 기존에 전체 허용되어있던 룰을 삭제해주셔야합니다.

안그러면 80포트 전체허용되는 룰에 걸려서, 속도제한이 먹히지가 않습니다.


어느정도 패킷이 허용되었는지를 확인하기 위해서, 로그도 함께 남겨놓도록 설정하겠습니다.


# 명령어의 적용

[root@localhost ~]# iptables -D INPUT -s 0.0.0.0/0 -d 192.168.0.18/32 -p tcp --dport 80 -j ACCEPT

[root@localhost ~]# iptables -I INPUT -m limit -p tcp -d 192.168.0.18 --dport 80 --limit 10/m --limit-burst 10  -j ACCEPT

[root@localhost ~]# iptables -I INPUT -m limit -p tcp -d 192.168.0.18 --dport 80 --limit 10/m --limit-burst 10  -j LOG --log-prefix "[Im Accepted]:"

[root@localhost ~]# iptables -nL

Chain INPUT (policy ACCEPT)

target     prot opt source               destination         

LOG        tcp  --  0.0.0.0/0            192.168.0.18         limit: avg 10/min burst 10 tcp dpt:80 LOG flags 0 level 4 prefix "[Im Accepted]:"

ACCEPT     tcp  --  0.0.0.0/0            192.168.0.18         limit: avg 10/min burst 10 tcp dpt:80

ACCEPT     all  --  0.0.0.0/0            192.168.0.18         state RELATED,ESTABLISHED

ACCEPT     tcp  --  192.168.0.2          192.168.0.18         tcp dpt:22

ACCEPT     all  --  192.168.0.1          192.168.0.18        

ACCEPT     all  --  8.8.8.8              192.168.0.18        

DROP       all  --  0.0.0.0/0            192.168.0.18        


Chain FORWARD (policy ACCEPT)

target     prot opt source               destination         


Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination  


로그가 딱 5개만 찍혔습니다. 

그 이유는, 패킷 개수는 접속 횟수를 의미하는 것이 아니기 때문입니다.

통신 과정에서 발생하는 모든 패킷을 의미합니다. 따라서 3way handshake 에 의해서 연결이 성립이 되면, 

최소 한번 접속할 때에는 두개 정도의 패킷이 들어오는 것입니다. 


# 로그 상태 - DOS 공격 (Flooding)

[root@localhost ~]# tail -f /var/log/iptables_log

Aug  6 11:23:22 localhost kernel: [Im Accepted]:IN=ens33 OUT= MAC=00:0c:29:a9:76:18:00:0c:29:c8:f6:8a:08:00 SRC=192.168.0.19 DST=192.168.0.18 LEN=58 TOS=0x00 PREC=0x00 TTL=128 ID=16595 DF PROTO=TCP SPT=56774 DPT=80 WINDOW=16425 RES=0x00 ACK PSH URGP=0 

Aug  6 11:23:28 localhost kernel: [Im Accepted]:IN=ens33 OUT= MAC=00:0c:29:a9:76:18:00:0c:29:c8:f6:8a:08:00 SRC=192.168.0.19 DST=192.168.0.18 LEN=58 TOS=0x00 PREC=0x00 TTL=128 ID=16597 DF PROTO=TCP SPT=56735 DPT=80 WINDOW=16425 RES=0x00 ACK PSH URGP=0 

Aug  6 11:23:50 localhost kernel: [Im Accepted]:IN=ens33 OUT= MAC=00:0c:29:a9:76:18:00:0c:29:c8:f6:8a:08:00 SRC=192.168.0.19 DST=192.168.0.18 LEN=52 TOS=0x00 PREC=0x00 TTL=128 ID=16641 DF PROTO=TCP SPT=56775 DPT=80 WINDOW=8192 RES=0x00 SYN URGP=0 

Aug  6 11:23:50 localhost kernel: [Im Accepted]:IN=ens33 OUT= MAC=00:0c:29:a9:76:18:00:0c:29:c8:f6:8a:08:00 SRC=192.168.0.19 DST=192.168.0.18 LEN=52 TOS=0x00 PREC=0x00 TTL=128 ID=16642 DF PROTO=TCP SPT=56776 DPT=80 WINDOW=8192 RES=0x00 SYN URGP=0 

....



2. limit 매치의 방식을 더욱 쉽게 이해해보자.

가) --limit 10/m 은 일종의 타이머라고 보시면 됩니다. --limit-burst 10 은 카운트(count)라고 보시면 됩니다. 그리고 여러분은 20개의 패킷을 동시에 서버로 보낸다고 가정합시다.

나) --limit-burst 설정에 의해서 첫 10개의 패킷은 그냥 통과가 가능합니다. 패킷이 1개 들어올 때 마다 count가 -1이 되기 때문에, 10개가 통과하면 count는 0이 됩니다.

다) count는 0이 되었기 때문에 11번째 패킷부터는 차단이되고, 클라이언트는 재요청을 하거나 응답을 기다립니다.


라) 10/m은 다음과 같이 계산이 되어, 6초마다 count가 +1이 됩니다. [60초 / 10개 = 6초 / 1개]

마) 30초가 지나면 count는 5, 60초가 지나면 count는 10이 되어있겠죠.

바) 만약 30초 후에 다시 20개 패킷이 동시에 발생하게 되면, count가 5이기 때문에 5개의 패킷만 통과가 되고 그 이후 패킷은 차단이 됩니다.

사) 마찬가지로 60초 후에 다시 20개 패킷이 동시 발생하게 되면, count는 10이기 때문에 10개의 패킷만 통과되고 그 이후 패킷은 차단됩니다.


아) 만약에 600초가 지났다 하더라도 --limit-burst의 값이 10이기 때문에, count는 10까지만 유지하고 그 이상 넘어가지 않습니다.



3. 방화벽 설정을 걸기 전에! hashlimit의 한계를 알고, 실 서비스에 적용하자

다른 것과 마찬가지로, 아이피를 변조하거나 DDOS 공격을 받게되면 차단할 수가 없습니다.

1. 특정 아이피에 대해서 패킷을 제한하는 것이기 때문에, 아이피를 변조하거나 DDOS 공격이 들어오면 차단할 수가 없다.

2. iptables를 재시작하지 않는 이상, 차단된 아이피를 풀어줄 수가 없다. 방화벽에서 추가적으로 허용을 해줘야한다. (이번 한번만 풀어주겠다... 뭐 이런 것이 안된다는 의미입니다,)


사실 limit 또한 특정 시간이 지나면 추가적인 연결이 가능한 특징을 갖고있습니다. 

다만, 이것도 DDOS처럼 전혀 다른 아이피들이 1번씩만 접근을 시도하는 공격은 차단할 수가 없습니다.


마찬가지로, 아이피 변조 및 DDOS 공격의 경우에는 PREROUTING을 이용해서 방어가 가능합니다.




4. 혹시 limit 매치에 ACCEPT가 아닌 DROP을 시킨다면?

소제목과 같이 ACCEPT가 아닌 DROP을 시킬 경우에는 반대가 될 것입니다. 그러면 해석은 아래와 같이 바뀌게 되겠죠.


# limit를 이용한 패킷 차단 명령어

iptables -I INPUT -m limit -p tcp -d 192.168.0.18 --dport 80 --limit 10/m --limit-burst 10  -j DROP


처음 10번째 패킷을 차단하고, 11번째 패킷부터는 허용한다. 6초마다 패킷을 1개씩 차단한다. 


뭐... 단순하게 생각하면 DDOS도 막을 수 있는거 아닌가? 라고 생각을 하시겠지만...

정상적으로 서비스를 이용하는 사람들의 패킷도 위와 같이 차단되기 때문에 사용하시는 것을 비추합니다.



5. limit vs hashlimit vs recent 매치는 어떤 차이가 있을까?

가) hashlimit & recent은 DROP 정책을 사용해서 패킷을 제한하지만, limit은 ACCEPT로 패킷을 제한한다.

나) recent는 차단된 아이피를 풀어주는 명령어가 있으나, hashlimit & limit 은 그러한 기능이 없다.



항상 상황에 맞는 매치를 사용하는 것이 중요합니다. 하지만 limit 함수는... 다른 좋은 매치가 있어서 굳이 이 것을 어느 상황에 사용해야하는지는 잘 모르겠습니다.


근데 다른 블로그에서 limit 매치를 잘못 소개하는 곳이 많아서 제가 한번 포스팅해보았습니다.



다음 시간에는 DDOS를 방어하는 방법에 대해서 포스팅하려고 합니다.

글이 길어지는 것은 아니지만 셋팅하는데 좀 애먹을 것 같아서 시간이 좀 걸릴 것 같네요 ^^


긴 글 읽어주셔서 감사합니다 ^^





댓글을 달아 주세요

  1. sjh 2018.01.25 11:33

    안녕하세요.
    제가 테스트하는 장비에 limit,connection limit/ dst.limit(아마 hash.limit인거 같아요.)라는 기능이 이해가 안가 포기했었는데
    덕분에 어느정도 이해가 되었습니다. 감사합니다 ㅎㅎ
    하나 여쭤볼게 있는데, limit에서 limit 1000/sec 에 burst를 5로 지정하게 되면,
    5개 패킷이 처리되고 나서 0.001초마다 패킷이 하나 생성된다고 이해하면 될까요?
    답변 해주시면 정말 감사하겠습니다!

    • SATAz 2018.01.25 12:05 신고

      패킷이 들어올 수 있는 개수가 0.001초마다 1개씩 늘어난다고 표현하는게 맞겠네요.....
      물론 그런 의미로 말씀하신거겠지만요

  2. sjh 2018.01.25 11:58

    추가적으로 궁금한것이
    위에 예제처럼 한 다음 웹서핑을 해보면 룰이 작동하여 엄청 느리게 동작할 줄 알았는데, 인터넷 창도 금방금방 로딩이 되네요
    add action=accept chain=forward limit=10/1m,10:packet src-address=192.168.0.0/24
    요런식으로 작성이 됐는데 확인해주시면 감사하겠습니다

    • SATAz 2018.01.25 12:00 신고

      내부->외부로 향하는 패킷 속도를 제한하려 하시는건가요??
      내부->외부 방향 패킷들에 대해 미리, 전체허용을 걸어두신건 아닌가 싶네요....

    • sjh 2018.01.25 15:49

      빠른 답변 정말 감사드립니다!
      이 외 룰 말고 아무룰도 없습니다. ㅠㅠ
      룰이 제대로 작동되는지 확인하려면 어떻게 하는게 좋을까요?

    • SATAz 2018.01.25 16:13 신고

      그 외에 룰이 없다면, 기본적으로 전체 허용해주는 설정이 베이스로 깔려있기 때문일겁니다.
      내부->외부로 나가는 설정에 dst port 80을 전체차단 한 다음에 속도제한 설정해보세요.

    • hsj 2018.01.26 09:37

      안녕하세요.
      답변 정말 감사드립니다.
      사타님 말씀대로 맨 아래에 80,443 포트 차단하고 위에 limit룰 추가하니 잘 작동되는거 같네요.
      클라이언트에서는 어차피 ack정도만 보내는거일테니 burst값을 10만 줘봤는데 생각보다 많이 필요한거 같네요.
      150을 주었는데도 로딩이 한참 걸리네요 ㅎㅎ

    • SATAz 2018.01.26 12:35 신고

      client에서 웹서버로 요청을 보낼때 3way handshake 과정만 해도 syn과 ack 2개를 보냅니다.
      그리고 네이버나 다음같은 웹사이트의 경우에는, 광고나 인터넷기사 사진이나 실시간인기검색어 새로고침 등등... 메인페이지 1개에서 표시해주는 url들이 엄청 많습니다. 그거 하나하나를 url로 봐야할 것입니다...
      그래서 150개로도 부족하실 수도 있어요......

  3. hsj 2018.01.26 09:40

    저는 이해할려고 막 인터넷도 검색해서 문서봐도 도무지 이해가 가질 않던데.. 사타님은 내공이 엄청나실거 같습니다.
    실례가 안된다면 어느 문서를 보고 공부하셨는지도 알 수 있을까요?

    • SATAz 2018.01.26 12:44 신고

      저 아직 내공 많이 부족합니다;; 좋게 봐주셔서 감사하네요.
      저도 iptables에서 이런게 가능하다는 것을, 전에 일하던 곳의 고객사가 그런 기능이 필요하다고 해서, 찾아서 적용해본거구요.....
      우리나라 블로그에서는 너무 애매하게 설명해놔서, 해외 블로그들을 많이 참고했습니다.

      필요한 것들은 영어로 구글링 하시면 웬만한것들은 다나와요.
      워낙 오래전에 기억이라... 뭐라고 검색했었는지는 기억이 안나네요.....

    • hsj 2018.01.26 13:26

      그렇군요. 구글링과 영어실력을 더 향상시켜야겠네요~
      가끔씩 여쭤봐도 될까요?ㅎㅎ
      답변 너무 감사드리고,
      금요일 오후 마무리 잘 하시고, 즐거운 주말 보내시기 바랍니다~!

    • SATAz 2018.01.27 16:59 신고

      필요하시면 언제든지 댓글 남겨주세요 ^^

  4. 행인 2018.10.03 11:12

    iptables -A INPUT -p tcp --syn --dport 80 -m limit --limit 30/second -j DROP
    라고 설정하면 초당30개씩 들어오는 SYN패킷은 모두 차단해버리는것 맞나요

    • 11 2018.10.03 11:15

      [root@localhost ~]# iptables -I INPUT -m limit -p tcp -d 192.168.0.18 --dport 80 --limit 100/m --limit-burst 5 -j DROP

      출처: http://sata.kr/entry/IPTables-4-m-옵션의-활용-예시 [SATAz BLOG]

      그리고 님 글에서는 저렇게표현해주셧던데 -j DROP 이라고... -j ACCPET로 표현하신다고하셧는데... 헷갈리네요

    • 11 2018.10.03 11:29

      어차피 --limit-burst 5 라고 표현헀으면 5개는 무조건 허용하고 --limit 100/m 을 통해 1분당 100개씩 들어오는 패킷을 차단한다(-j DROP 이 -j ACCPET보다 맞다고생각하는데 저는...)

      ->결론 5개패킷허용 그 이후 패킷 차단

    • SATAz 2018.10.03 11:30 신고

      "--limit 30/s"는 1초 뒤에 30개를 허용해주겠다는 의미입니다. 그리고 "--limit 30/m"으로 설정하면 1분 뒤에 들어올 수 있는 패킷이 30개(2초 지날때마다 1개씩 패킷을 허용하며, 해당 패킷이 1분동안 들어오지 않는다면 1분뒤에는 30개까지 허용 가능) 라는 의미가 됩니다...

      그리고 패킷 hitcount가 30개 넘으면 차단하는 설정은 "--limit-burst 30"에서 담당합니다.
      *참고 : --limit-burst값을 주지 않으면 기본값으로 5가 들어갑니다.

      다시한번 정리하자면 --limit 30/s 은 타이머 역할을 하구요, --limit-burst가 hitcount가 패킷 개수를 보고 차단하는 역할을 합니다.
      따라서 limit-burst가 기본값 5로 설정된다면 0.2초마다 1개씩 허용되는 limit 30/s설정 때문에 차단되는 패킷이 거의 없을 것 같습니다...

      그리고 DROP 설정을 적용하면 5개의 패킷을 먼저 차단한 다음 그다음 패킷을 허용한다는 의미가 됩니다;;
      그 설정으로 방화벽 적용하시면 서비스 안될꺼에요 ;;
      limit에서 ACCEPT냐 DROP이냐는 --limit-burst 값을 기준으로 잡으시면 이해가 편하실...까요?

      ->결론 DROP쓰면 limit-burst 5개패킷 차단 후 허용, ACCEPT쓰면 limit-burst 5개패킷 허용 후 차단


      이에대한 근거를 말씀드리자면... 위에 로그찍는 설정(-j LOG)를 보시면 ACCEPT된 패킷들이 로그에 찍힙니다. 그 이후의 로그는 안찍히죠....

    • 11 2018.10.03 13:40

      정보보안기사 9회 실기시험 답을 보면
      iptables -A INPUT -p tcp --dport 80 -m limit --limit 10/s --syn -j DROP 이라고 되어있는데
      이에 대한 해석은 TCP80 포트로의 SYN패킷 요청패킷을 1초에 10씩 차단한다
      -> 11개를 보낼경우 10개까지 차단하고 11번째꺼는 허용되는식
      이렇게이해하면 될까요?!

      저방법을 쓰면 SYN FLOODING 공격을 어느정도 막을 수 있겟네요 대신.. 정상적인 SYN 요청도 막히겟지만요 ㅠ

      https://blog.naver.com/bycho211/221119795708

      이블로그 맨 밑에 그 문제가있습니다.

    • 11 2018.10.03 14:49

      바쁘시겟지만 답변꼭좀부탁드릴게요 ㅠ

    • 11 2018.10.03 20:06

      부탁좀드릴게요 계속기다렸습니다 ㅠㅠ
      갑론을박이네요 스터디사이에서..

    • SATAz 2018.10.03 20:32 신고

      테스트 끝났습니다. 댓글 작성중입니다 ^^

    • SATAz 2018.10.03 20:49 신고

      두둥!! 이거저것 테스트해보느라고 좀 늦었습니다 ^^ 결론적으로 봤을때는 공격이 차단이 됩니다.

      단, DROP 정책을 사용할 때에는 위의 포스팅 글과는 다르게 80포트 전체허용 정책이 들어가야합니다. <이 글을 읽으시려면 데스크탑 화면에서 봐주세요 ^^>

      [root@localhost ~]# iptables -nvL
      Chain INPUT (policy ACCEPT 36 packets, 4250 bytes)
      pkts bytes target prot opt in out source destination
      907 66427 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
      56 2844 DROP tcp -- * * 0.0.0.0/0 192.168.0.17 limit: avg 10/sec burst 10 tcp dpt:80
      55 2784 LOG tcp -- * * 0.0.0.0/0 192.168.0.17 limit: avg 10/sec burst 10 tcp dpt:80 LOG flags 0 level 4 prefix `[Im Accepted]:'
      28 1456 ACCEPT tcp -- * * 192.168.0.2 192.168.0.17 tcp dpt:80
      0 0 ACCEPT tcp -- * * 192.168.0.2 192.168.0.17 tcp dpt:22
      1423 72092 DROP all -- * * 0.0.0.0/0 192.168.0.17

      공격이 들어왔을때를 가정해보겠습니다.
      공격이 1000개가 한꺼번에 들어옵니다.

      그럼 우선
      DROP tcp -- 0.0.0.0/0 192.168.0.17 limit: avg 10/sec burst 10 tcp dpt:80
      정책에 10개 패킷이 걸립니다.
      그리고 그 이상의 패킷 990개는 제일 하단의 DROP으로 보내버립니다. (왜그런지는 저도 알아봐야겠습니다.)

      하지만 여기에서는 서비스에 문제가 생겨버립니다.
      상황 1. 공격이 들어오고 있는 중에는 정상적인 서비스 접근이 가능합니다.
      상황 2. 공격이 들어오지 않는 상태에서는 정상적인 서비스 접근이 불가능합니다.

      [root@localhost ~]# iptables -nL
      Chain INPUT (policy ACCEPT)
      target prot opt source destination
      ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
      DROP tcp -- 0.0.0.0/0 192.168.0.17 limit: avg 10/sec burst 10 tcp dpt:80
      LOG tcp -- 0.0.0.0/0 192.168.0.17 limit: avg 10/sec burst 10 tcp dpt:80 LOG flags 0 level 4 prefix `[Im Accepted]:'
      ACCEPT tcp -- 192.168.0.2 192.168.0.17 tcp dpt:80
      ACCEPT tcp -- 192.168.0.2 192.168.0.17 tcp dpt:22
      DROP all -- 0.0.0.0/0 192.168.0.17

      *결론 : 하단에 ACCEPT룰이 있는 상태에서 limit 매치에 DROP 정책을 걸면 공격은 차단이 된다. 하지만 공격이 없을때에는 정상적인 서비스에 문제가 발생한다.

      여기에서 저는 정상적인 서비스가 가능한 방법을 좀 찾아봤는데요, 타이머를 10/min으로 설정하게될 경우에는 어느정도 정상적으로 서비스 접근이 가능하다는 것도 확인했습니다.
      10/min으로 설정해도 공격이 들어왔을때 10개 이상 패킷이 들어오면 최 하단의 DROP으로 빠져버리기 때문에 공격 차단도 잘 됩니다.

      10/min 설정했을때...
      상황 1. 공격이 들어올때 정상적인 서비스 접근이 가능하다.
      상황 2. 공격이 안들어올때는 10개 패킷을 먼저 차단한 뒤에 타이머 값에 따라서 정상적인 서비스 접근이 어느정도 가능하다.

      *결론 : 타이머 설정을 적절하게 이용할 경우에는 어느정도 SYN Cookie와 비슷한 효과를 누릴 수 있을 것 같습니다.

      *공격 테스트는 SYN Flooding, GET Flooding을 테스트했습니다.
      일단 가장 궁금하셨던 결과를 먼저 말씀드리고 밑에 댓글에서 이어가겠습니다.

      *참고 : 아직 10/sec이 초당 10회 접근이냐 아니냐는 Timeout값을 조절해서 테스트를 해보고있는중입니다.

    • SATAz 2018.10.03 21:45 신고

      최종 결론 댓글

      [root@localhost ~]# iptables -nL
      Chain INPUT (policy ACCEPT)
      target prot opt source destination
      ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
      DROP tcp -- 0.0.0.0/0 192.168.0.17 limit: avg 10/sec burst 10 tcp dpt:80
      LOG tcp -- 0.0.0.0/0 192.168.0.17 limit: avg 10/sec burst 10 tcp dpt:80 LOG flags 0 level 4 prefix `[Im Accepted]:'
      ACCEPT tcp -- 192.168.0.2 192.168.0.17 tcp dpt:80
      ACCEPT tcp -- 192.168.0.2 192.168.0.17 tcp dpt:22
      DROP all -- 0.0.0.0/0 192.168.0.17

      상황1. 공격을 10/min 이상 때렸을 때.
      DROP all -- * * 0.0.0.0/0 192.168.0.17 정책으로 차단이 됩니다.
      그리고 정상적인 서비스 접근은 가능하다.

      상황 2. 공격을 10/sec 이하로 때렸을 때.
      limit: avg 10/min burs
      t 10 tcp dpt:80 정책에 걸립니다.
      그리고 정상적인 서비스는 초반 연결이 불안정하다는 것 외에는 접근 가능합니다.

      상황 3. 공격을 안때리고 있을때.
      10개의 패킷이 선 차단되고 그 이후 패킷이 허용된다. 10/min 타이머에 따라서 6초당 한개씩의 패킷이 차단되기 때문에 서비스가 다소 불안정하다.

      상황 4. 공격이 들어오는데 최 하단"DROP all -- 0.0.0.0/0 192.168.0.17"이 없다면?
      burst값에 따라서 10개 패킷은 차단이 되지만 그 후의 패킷들이 그대로 유입된다... <공격 차단에는 의미가 없었습니다...>

      질문주신 10/sec이 초당 10개가 넘는 패킷을 차단하는데 DROP정책을 사용하는 것은....
      제가 부족해서인지 기출문제에 모순이 있는것인지는 잘 모르겠습니다.
      제 개인적인 입장으로는 납득이 잘 가지 않습니다...;;

      최종 결론은 limit 10/sec에 DROP을 걸면, 초당 10개 이상의 패킷이 걸러지지는 않는다에 도달했습니다.

      저도 선배들한테 물어봐야겠네요 ㅎㅎ

    • 11 2018.10.03 22:13

      어렵네요 ㅠㅠ...
      딴 분한테 제가 쓴 정책에 대해 물어보니까 이렇게 답해주셧어요

      iptables -A INPUT -p tcp --syn --dport 80 -m limit --limit 10/second -j DROP

      구문은


      '목적지 포트가 80번(TCP)인 INPUT 패킷은 drop하는데 초당 10개까지만 drop함.'

      즉 초당 11개를 보내면 1개는 drop을 안하는 거라고 보셔야될것 같습니다.

    • SATAz 2018.10.03 23:20 신고

      지금 다시보니... 제가 정보보호기사 기출문제에 너무 빠져있어서... 질문의 요지에 간단하게 답변을 못드렸던거같네요 ㅠㅠ (답변서 작성에 버릇이 들어서... 초중반을 너무 장황하게 설명드렸네요 ㅠㅠ)

      iptables -A INPUT -p tcp --syn --dport 80 -m limit --limit 10/second -j DROP 구문만을 봤을때는
      "11개를 보낼경우 10개까지 차단하고 1개는 drop을 안한다"라는 정리가 개념적으로 맞습니다 ^^

      P.S
      이 아래 부분은 무시해주세요ㅋ
      아마 IPTables를 직접 적용해서 테스트하시면... 개념정리처럼 잘 안되실꺼에요;;
      혹시 가상머신에 테스트하시거나 실 업무에 IPTables를 사용하신다면 --limit-burst (기본값) 5가 먼저 적용되고 --limit 10/sec(타이머)가 적용되어서, 정리된 개념처럼 정확한 값의 패킷 수가 적용되지 않는다는 점을 참고 부탁드릴게요^^