커피닉스, 시스템 엔지니어의 쉼터 커피향이 나는 *NIX
커피닉스
시스템/네트웍/보안을 다루는 곳
* HanIRC의 #coffeenix 방
[ 장비 및 회선 후원 ]
HOME > 보안(security) 도움말
검색 : 사이트 WHOIS 웹서버 종류

보안권고 (1, 자료 1)
보안툴 및 장비 (13, 글 1, 자료 11)
보안뉴스 / 정보 (3)
방화벽, 패킷 필터링 / IDS (15, 글 6, 자료 11)
보안문서 - 네트워크 보안 (1, 자료 12)
보안문서 - 시스템 보안 (7, 글 1, 자료 17)
보안문서 - 무선랜(WLAN) 보안 (자료 6)
보안문서 - 해킹 / 공격 (6, 자료 13)
바이러스(virus) / 웜 / 백신 (11, 글 4, 자료 3)
보안 통계 (자료 5)
암호화 및 인증 (3, 자료 3)
원격 OS 탐지 / OS 핑거프린팅 (4, 글 1, 자료 6)

  iptables에서 특정 시간 후 rule을 자동 삭제하는 방법 작성일 : 2011/06/20 18:34
 
  • 글쓴이 : 좋은진호 ( http://coffeenix.net/ )
  • 조회수 : 4452
          [ 이전화면 / 수정 ]   비밀번호 :     인쇄용 화면
      제  목 : iptables에서 특정 시간 후 rule을 자동 삭제하는 방법
    작성자 : 좋은진호(truefeel, http://coffeenix.net/ )
    작성일 : 2011.6.14(화)


    리눅스 iptables에서 특정 시간이 지나면 rule을 자동으로 삭제(expire)시키는 방법을 찾아봤다.
    이를테면 특정 IP를 30분간만 또는 하루동안만 차단시키고 DROP에서 빼고 싶다면 어떻게 해야할까.

    serverfault( http://serverfault.com/ )에서 대단한 꽁수를 발견했다.

    How to make iptables rules expire?
    http://serverfault.com/questions/273324/how-to-make-iptables-rules-expire


    1. at 명령을 이용해서

    at는 cron처럼 특정 시간에 작업을 실행할 수 있다.

     
          iptables -I INPUT -s 192.168.123.100 -j DROP
    echo "iptables -D INPUT -s 192.168.123.100 -j DROP" | at @10pm
     


    룰을 처음 생성할 때, 2개 명령을 동시에 실행시킨다.
    하나는 -I(Insert) 또는 -A(Append)로 iptables에 룰을 생성하는 것이고,
    다른 하나는 -D(Delete)로 지정 시간이나 시간간격을 지정해서 자동으로 삭제되도록 at명령을 실행시켜두는 것이다. at명령은 폭탄 타이머가 되어, 해당 시간이 되면 룰을 자동으로 삭제를 할 것이다.
    현재부터 30분 이후에 룰을 삭제하고 싶다면 at now +30 minutes 처럼 지정한다. hours, days, weeks 등의 단위를 사용할 수 있다.

    위와같이 아주 간단한 방법으로 해결책을 찾다니, 놀랍기만 하다.
    atd 데몬이 띄워져 있어야 하며, at 명령으로 실행중인 job목록은 atq로 확인할 수 있다. (※ 개인적으로 at는 사용하지 않는다.)


    2. iptables에 expire처리할 timestamp를 comment. 현재 timestamp와 비교 삭제

    답변자 Seth Robertson는 어떻게 이런 방법을 생각해냈을까. 대단하다는 생각밖에 안든다.

    1) 룰 생성 (expire처리할 룰을 만든다. 30분 뒤에 expire할 경우)

     
    # iptables -A INPUT -s 192.168.123.100 -m comment --comment "expire=`date -d '+ 30 min' +%s`" -j DROP
     


    iptable -L -n 으로 룰 목록을 확인하면 다음과 같이 주석으로 expire할 시간(timestamp값, 현재시간+30분)이 표시되어 있다.

     
    DROP       all  --  192.168.123.100      0.0.0.0/0           /* expire=1308025139 */
     


    2) 룰 삭제

    먼저 현재 룰에서 주석해둔 것을 살펴보자.

     
    # iptables -L INPUT -n --line-numbers
    Chain INPUT (policy ACCEPT)
    num  target     prot opt source               destination        
    1    DROP       all  --  123.123.123.120      0.0.0.0/0           /* expire=1308026089 */
    2    DROP       all  --  123.123.123.121      0.0.0.0/0           /* expire=1308026086 */
    ... 생략 ...
    28   DROP       all  --  123.123.123.123      0.0.0.0/0           /* expire=1308026079 */
     


    이제 30분 뒤에 삭제할 목록을 확인해보자. 가장 핵심이 되는 부분이다.

     
    # iptables -L INPUT -n --line-numbers  | perl -ne 'next unless /(^\d+).*expire=(\d+)/; if ($2 < time) { print "iptables -D INPUT $1\n"; }'
    iptables -D INPUT 1
    iptables -D INPUT 2
    iptables -D INPUT 28
     


    위의 perl 명령 부분은 '룰 번호'(필드 1번)와 comment의 'expires= 부분의 숫자'(필드 2번)를 뽑아 낸다. 그리고, 이 expires의 timestamp를 현재 시간과 비교해서 더 작은지를 판단한다. 즉, expire할 시간이 지나서 지워도 되는 룰인지를 판단한다.

    위에서 print "iptables -D INPUT $1\n" 대신에 system "iptables -D INPUT $1" 로 바꾸면 룰이 삭제된다.
    위 1줄을 스크립트 파일로 만든다. 그리고 cron에 적당한 시간간격(1~10분정도)으로 실행되도록 등록하면, 원하는 시간이 지나면 자동으로 룰은 expire된다.

    * iptables_expires.sh 내려받기
     
    #!/bin/sh
    #
    # rule expire 처리
    #
    # - rule 생성 예) iptables -A INPUT -s -m comment --comment "expire=`date -d '+ 30 min' +%s`" -j DROP

    export PATH=$PATH:/sbin:/usr/sbin:/usr/local/bin

    iptables -L INPUT -n --line-numbers  | \
       perl -ne 'next unless /(^\d+).*expire=(\d+)/; if ($2 < time) { system "iptables -D INPUT $1"; }'
     

      커피닉스 카페 최근 글
    [01/26] Re: wget으로 다른서버에있는 디렉토리를 가져오려고합니다.
    [01/25] wget으로 다른서버에있는 디렉토리를 가져오려고합니다.
    [01/11] 특정 안드로이드 WebView 버전에서 SSL 문제 (WebView 버그)
    [08/01] DNS forwarder (전달자) 서버를 통해서 쿼리하면 역방향을 받아오질 못합니다.
    [05/16] (주)후이즈 시스템엔지니어 (경력자) 모집
    [02/15] [AWS] Cloudfront edge 확인하기
    [01/20] Mobile Service/eCommerce 기업에서 Server / Java / PHP 개발자 구인
    [01/11] 탄탄한 퍼블리싱 모바일기업에서 Mobile 개발자를 모십니다.
    [01/11] 탄탄한 퍼블리싱 모바일기업에서 Web Front 개발자를 모십니다.
    [01/11] 탄탄한 퍼블리싱 모바일기업에서 Server 개발 팀장을 모십니다.
    [12/21] 브라우저별 SHA1 퇴출 시점
    [09/15] [구인] 시스템엔지니어 (경력)
    [08/05] Re: 칼리리눅스 텔넷관련
    [08/04] 칼리리눅스 텔넷관련
    [06/29] 또 다른 무료 SSL 인증서, Let's Encrypt
      New!   최근에 등록한 페이지
      KiCad EDA Suite project (Free/Libre/Open-Source EDA Suite) (CAD)
      오픈캐스케이드 캐드 (OpenCASCADE CAD)
      QCad for Windows --- GNU GPL (Free Software)
      The Hello World Collection
      IPMI를 활용한 리눅스 서버관리
      DNS 설정 검사
      nagiosgraph 설치 방법
      Slony-I 설치 방법 (postgresql replication tool)
      Qmail기반의 Anti spam 시스템 구축하기
      clusterssh

    [ 함께하는 사이트 ]




    운영진 : 좋은진호(truefeel), 야수(yasu), 범냉이, sCag
    2003년 8월 4일~