| iptables에서 특정 시간 후 rule을 자동 삭제하는 방법 | 작성일 : 2011/06/20 18:34 |
| 조회수 : 10044 |
|
제 목 : 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처럼 특정 시간에 작업을 실행할 수 있다.
룰을 처음 생성할 때, 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할 경우)
iptable -L -n 으로 룰 목록을 확인하면 다음과 같이 주석으로 expire할 시간(timestamp값, 현재시간+30분)이 표시되어 있다.
2) 룰 삭제 먼저 현재 룰에서 주석해둔 것을 살펴보자.
이제 30분 뒤에 삭제할 목록을 확인해보자. 가장 핵심이 되는 부분이다.
위의 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 내려받기
|
|||||||||||||||||||
|
|