리눅스 iptables 개념 및 명령어

2020, Sep 04    

기본 개념

  • iptables는 라눅스상에서 방화벽을 설정하는 도구이다.
  • netfilter 패킷 필터링 기능을 사용자 공간에서 제어한다.

체인 (Chain)

  • 체인의 종류에는 총 3개가 있으며 INPUT, OUTPUT, FORWORD가 있다.
    • INPUT : 호스트 컴퓨터를 향해 들어오는 모든 패킷
    • OUTPUT : 호스트 컴퓨터에서 발생해서 나가는 모든 패킷
    • FORWARD : 호스트 컴퓨터가 목적지가 아닌 모든 패킷, 라우터로 사용되는 호스트 컴퓨터를 통과하는 패킷

매치 (Match)

패킷을 처리할 때 만족해야 하는 조건, 이 조건들을 만족하는 패킷들만 규칙을 적용함.

  • -source (-s) : 출발지 IP주소나 네트워크와의 매칭
  • -destination (-d) : 목적지 ip주소나 네트워크와의 매칭
  • -protocol (-p) : 특정 프로토콜과의 매칭
  • -in-interface (i) : 입력 인터페이스
  • -out-interface (-o) : 출력 인터페이스
  • -state : 연결 상태와의 매칭
  • -string : 애플리케이션 계층 데이터 바이트 순서와의 매칭
  • -comment : 커널 메모리 내의 규칙과 연계되는 최대 256바이트 주석
  • -syn (-y) : SYN 패킷을 허용하지 않음
  • -fragment (-f) : 두 번째 이후의 조각에 대해서 규칙을 명시
  • -table (-t) : 처리될 테이블
  • -jump (-j) : 규칙에 맞는 패킷을 어떻게 처리할 것인가를 명시
  • -match (-m) : 특정 모듈과의 매치

타겟 (Target)

패킷 규칙과 일정할 때 타겟을 지원

  • ACCEPT : 패킷을 받아들임
  • DROP : 패킷을 버림 (패킷이 전송된 적이 없던 것처럼)
    • DROP은 서비스에 접속하려는 사용자의 액세스를 거부하고 어떠한 경고 메시지도 보여주지 않은 채 패킷을 DROP 한다.
  • REJECT : 패킷을 버리고 이와 동시에 적절한 응답 패킷을 전송
    • REJECT는 서비스에 접속하려는 사용자의 액세스를 거부하고 오류 메시지를 보여준다.
  • LOG : 패킷을 syslog에 기록
  • RETURN : 호출 체인 내에서 패킷 처리를 계속 진행

연결 추적(Connection Tracking)

서비스 연결 상태에 따라서 그 연결을 감시하고 제한

  • NEW : 새로운 연결을 요청하는 패킷, 예, HTTP 요청
  • ESTABLISHED : 기존 연결의 일부인 패킷
  • RELATED : 기존 연결에 속하지만 새로운 연결을 요청하는 패킷, 예를 들면 접속 포트가 20인 수동 FTP의 경우 전송 포트는 사용되지 않은 1024 이상의 어느 포트라도 사용 가능
  • INVALID : 연결 추적표에서 어디 연결에도 속하지 않은 패킷

명령어 (Commend)

  • A (–append) : 새로운 규칙을 추가
  • D (–delete) : 규칙을 삭제
  • C (–check) : 패킷을 테스트
  • R (–replace) : 새로운 규칙으로 교체
  • I (–insert) : 새로운 규칙을 삽입
  • L (–list) : 규칙을 출력
  • F (–flush) : chain으로부터 규칙을 모두 삭제
  • Z (–zero) : 모든 chain의 패킷과 바이트 카운터 값을 0으로 초기화
  • N (–new) : 새로운 chain을 만듦
  • X (–delete-chain) : chain을 삭제
  • P (–policy) : 기본정책을 변경

iptable 적용 내용 출력

iptables -nvL

iptable의 기본 설정 내용 (CentOS Minamal 기준)

Chain INPUT (policy ACCEPT) 
target prot opt source destination 
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED 
ACCEPT icmp -- anywhere anywhere 
ACCEPT all -- anywhere anywhere 
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh 
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited // 모든 패킷을 reject

Chain FORWARD (policy ACCEPT) 
target prot opt source destination 
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT) 
target prot opt source destination

기본 설정

1.기본 정책을 ACCEPT로 변경 (변경하면 이후에 사용하는 명령어는 기본 정책이 ACCEPT 기준)

iptables -P INPUT ACCEPT

2.체인에 정의된 모든 규칙을 삭제

iptables -F

3.INPUT 체인에 로컬호스트 인터페이스에 들어오는 모든 패킷을 허용

iptables -A INPUT -i lo -j ACCEPT

4.INPUT Chain에 state 모듈과 매치되는 연결상태가 ESTABLISHED, RELATED인 패킷에 대해 허용 추가

iptables -A INPUT -m state --state ESTABLISHED, RELATED -j ACCEPT

5.INPUT 체인에 프로토콜이 tcp이며 목적지 포트가 22번인 패킷에 대해 허용 추가

iptables -A INPUT -p tcp -m tcp ---dport 22 -j ACCEPT

6.INPUT 체인에 대한 기본 정책을 DROP으로 변경

iptables -P INPUT DROP

7.FORWARD 체인에 대한 기본정책을 DROP으로 변경

iptables -P FORWORD DROP

8.설정한 것을 저장 (iptables-service 패키지 설치가 필요할 수 있음)

service iptables save