iptables

기능
  • iptablessnort 에 비해 다른 점은 상태추적(Stateful inspection) 기능이다.
  • 상태 추적 기능: firewall을 거치는 패킷을 메모리에 기억, 메모리에 저장된 목록과 일치하면 빠르게 통과할 수 있는 기능.
  • 이밖에 NAT, 패킷레벨 로깅, 확장모듈 등을 지원한다.
체인
  • 패킷이 이동하는 경로, input, output, forward 체인이 있음.
  • INPUT : firewall이 최종 목적지이다.
  • OUTPUT : firewall이 출발지이다.
  • FOWARD : 방화벽을 경유(방화벽이 별도의 서버로 구성되어 있을 때)
  • PREROUTING ,POSTROUTING : 라우터 결정 이전/이후에 결정 되는 체인.
iptables 기본 구문
iptables [테이블] [체인] [룰] [타겟]
  • 테이블 : -t, default는 아무것도 적지 않음
  • 체인 : -A(append), -I(insert), -D(delete) + 체인
  • 룰 : -s (source ip), -d (destination ip), –sport(출발지 포트), –dport(목적지 포트), –icmp-type, –tcp-flags, -m state –state(확장모듈; TCP 상태 기능 추적)
  • 타겟 : -j ACCEPT (허용), DROP (차단 한 후 아무 응답 메시지 전송 x), REJECT (차단 후 ICMP 메시지를 남긴다.), LOG (/var/log/messages)에 남긴다.
이 밖에 기타
/* -L :  룰 리스트 확인, -n : ip와 포트를 숫자 형식으로 출력 */
iptables -L INPUT -n

/* -F : flush 기능 */
iptables -F INPUT

/*-P : default 정책 설정*/
service iptables restart

iptables -F INPUT

iptables -P INPUT DROP /*  서비스 재기동 후 input 정책 초기 값을 drop */
iptables -P OUTPUT DROP /* 서비스 재기동 후 output 정책 초기값을 drop */

상태 추적 기능
  • NEW : 상태추적 테이블에 완전히 새로 들어왔을 때
  • ESTABLISHED : 상태추적 테이블에 연결 정보를 가지고 있을 때
  • RELATED : 연관된 연결정보(연결 시 서비스 수행 중에 새롭게 추가 될 때, ex)ftp )
  • INVALID : 알수 없거나, 잘못된 헤더 정보를 갖고 올 때
예제
iptables -A INPUT -m state --state ESTABLISHED, RELATED -j ACCEPT

/* 21 들어오는 포트 허용 ( ftp active ) */
iptables -A INPUT -m state --state NEW -p tcp --dport 21 -j ACCEPT
connlimit 모듈
  • -m connlimit [option] 형식으로 주로 사용

  • –connlimit-above n : n을 초과하는 동시 연결을 제한
  • –connlimit-mask mast : 0~32 범위의 mask값을 지정한다.
/* tcp SYN attack 확인 (connlimit 모듈 활용) */
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 5 -j DROP  

/* 24 비트 마스크 대역 차단 */
iptables -A INPUT -p tcp --syn -m connlimit --connlimit-above 10 --conlimit-mask 24 -j DROP

limit 모듈
  • 초당/분당/시간당/하루당 매칭되는 제한건수를 지정한다.
/* SYN,FIN 조합 차단 */
iptables -A INPUT -p tcp --tcp-flags SYN,FIN -m limit --limit 6/minute -j DROP

recent 모듈
  • 동적으로 source IP 들을 모아서 새로운 목록을 생성하여, 그 목록 안에서 작동 시킬 수 있음.
  • --name : 목록 이름을 설정
  • --set : 추가
  • --rcheck : 해당 목록에 source ip가 있는 지 체크
  • --update : source ip가 있는 지 체크 후, 있으면 timestamp 갱신
  • --seconds : update, rcheck 후 지정된 초에 있는지 확인
  • --hitcount : 지정한 초에 몇번 들어왔는 지 체크
예제
/* BRUTE FORCE attack (알기사) */
iptables -A INPUT -m state --state NEW -p tcp --dport 22 -m recent --name SSH_DROP --set

iptables -A INPUT -m state --state NEW -p tcp --dport 22 -m recent --name SSH_DROP --update --seconds 60 --hitcount 5 -j DROP 

출처 알기사