iptables

  • iptables이 패킷을 필터링 하는 것이 아니라 커널에 탑재된 netfilter 기능으로 하며 단지 netfilter의 룰을 세워주는 것

  • 허용되는 규칙이 먼저 나오고 나중에 거부하는 규칙을 정의



iptables 방식

  1. 모든 것을 허용하고 일부를 제한(Blacklist)

  2. 일부를 허용하고 모든 것을 제한(Whitelist)



iptables 용어

테이블(tables)

  • iptables에는 테이블이라는 광범위한 범주가 있음

  • 이 테이블은 filter, nat, mangle, raw 같은 4개의 테이블로 구성

  • 이중에서 우리에게 필요한 것은 필터링 규칙을 세우는 filter 테이블이다.


체인(chain)

  • iptables에는 filter 테이블에 미리 정의된 세가지의 체인이 존재 - INPUT, OUTPUT, FORWARD

    • INPUT : 호스트 컴퓨터를 향한 모든 패킷

    • OUTPUT : 호스트 컴퓨터에서 발생하는 모든 패킷

    • FORWARD : 호스트 컴퓨터가 목적지가 아닌 모든 패킷, 즉 라우터로 사용되는 호스트 컴퓨터를 통과하는 패킷

image

  • 이 체인들은 어떠한 네트워크 트래픽(IP 패킷)에 대하여 정해진 규칙들을 수행

    • 가령 들어오는 패킷(INPUT)에 대하여 허용(ACCEPT)할 것인지, 거부(REJECT)할 것인지, 버릴(DROP)것인지 결정


매치(match)

  • iptables에서 패킷을 처리할 때에 만족해야 하는 조건

  • 이 조건을 만족시키는 패킷들만 규칙을 적용

  • 조건 종류

    • --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) - 정책

  • iptables는 패킷이 규칙과 일치할 때 동작을 취하는 타겟을 지원

  • 종류

    • ACCEPT : 패킷을 받음

    • DROP : 패킷을 버림(패킷이 전송된 적이 없던 것처럼)

    • REJECT : 패킷을 버리고 이와 동시에 적절한 응답 패킷을 전송

    • LOG : 패킷을 syslog에 기록

    • RETURN : 호출 체인 내에서 패킷 처리를 계속함

  • DROP VS REJECT

    • DROP은 말 그대로 telnet 사용자에게 어떠한 경고 메시지도 보여주지 않은 채 패킷을 드롭

    • REJCECT는 서비스에 접속하려는 사용자의 액세스를 거부하고 connection refused 라는 오류메시지를 보여줌

    • 관리자의 재량껏 이러한 규칙을 사용할 수 있음

    • 사용자가 혼란스러워하며 계속해서 접속을 시도하는 것을 방지하려면 REJECT를 사용하는 것이 좋음


연결 추적(Connection Tracking)

  • iptables는 연결 추적(Connection Tracking) 이라는 방법을 사용하여 내부 네트워크 상 서비스 연결에 따라서 그 연결을 감시하고 제한할 수 있게 해 줌

  • 연결 추적 방식은 연결 상태를 표에 저장하기 때문에, 다음과 같은 연결 상태에 따라서 시스템 관리자가 연결을 허용하거나 거부할 수 있음

    • NEW : 새로운 연결을 요청하는 패킷, 예, HTTP 요청

    • ESTABLISHED : 기존 연결의 일부인 패킷

    • RELATED : 기존 연결에 속하지만 새로운 연결을 요청하는 패킷, 예를 들어 접속 포트가 20인 수동 FTP의 경우 전송 포트는 사용되지 않은 1024 이상의 어느 포트라도 사용 가능하다.

    • INVALID : 연결 추적표에서 어디 연결에도 속하지 않은 패킷

  • 상태에 기반(stateful)한 iptables 연결 추적 기능은 어느 네트워크 프로토콜에서나 사용 가능

  • UDP와 같이 상태를 저장하지 않는 (stateless) 프로토콜에서도 사용할 수 있음



사용법

명령어

  • iptables [command] [chain] [options] [정책(타겟)]


command

  • -A (–append) chain : 체인에 새로운 규칙을 추가

  • -C (–check) : 패킷 테스트

  • -D (–delete) chain : 체인의 어떤 지점에 규칙을 제거

    • -D (–delete) chain rulenum : 체인에서 rulenum에 일치하는 규칙 제거
  • \–E (–rename-chain) old-chain new-chain : 체인의 명칭 바꾸기

  • -F (–flush) [chain] : 모든 체인의 모든 규칙을 제거(일시적, 재부팅하면 원상복구)

  • -I (–insert) chain [rulenum] : 체인의 rulenum 지점에 규칙을 삽입 (default 1=first)

  • -L (–list) [chain] : 모든 체인의 규칙들을 나열(출력)

  • -N (–new) chain : 새로운 체인 생성

  • -R (–replace) chain rulenum : 체인의 rulenum 지점에 규칙을 교환(교체)

  • -X (–delete-chain) [chain] : 사용자 정의 비어진 체인 제거

  • -Z (–zero) [chain] : 해당 체인이나 모든 체인내의 모든 규칙들의 패킷과 바이트의 카운트를 0으로 만듬

  • -P (–policy) : 기본정책

    • \–P (–policy) chain target : 미리 만들어진 체인 정책 바꾸기


options

  • -t : table 사용 default는 filter이므로 nat을 사용하려면 필히 nat이라고 지정해야 함

  • -o : 패킷이 나가는 네트워크 장치를 지정. 보통 OUTPUT, FORWARD 체인에 사용

  • -i : 패킷이 들어오는 인터페이스를 지정하는데 사용. INPUT과 FORWARD 체인에 사용

  • -p : 프로토콜을 지시할 때 사용. 보통 TCP, UDP, ICMP 같은 것들이 사용

  • -j : 타겟(ACCEPT, DROP, FEJECT)을 설정하겠다는 의미

  • -s : 출발지 주소 도메인 넷마스크 등을 표기

  • -d : 목적지의 주소 도메인 넷마스크 등을 표기

  • --sport : 출발지 포트

  • --dport : 목적지 포트

  • -m state : 연결상태를 의미한다. ESTABLISHED, NEW 등

    • NEW : 새로운 접속을 만드는 패킷

    • ESTABLISHED : 존재하는 접속에 속하는 패킷. 즉 접속이 허가되고 통신하면서 발생되는 패킷

    • RELATED : 기존의 접속의 부분은 아니지만 연관성을 가진 패킷으로 ICMP 에러나 ftp 데이터 접속을 형성하는 패킷

    • INVALID : 어떤 이유로 확인할 수 없는 패킷. 알려진 접속과 부합하지 않는 ICMP 에러와 out of memory 등을 포함. 보통 이런 패킷은 DROP 됨.

  • ! : 아닌 not의 의미로 사용

  • --tcp-flags : tcp 패킷의 특성인 SYN, ACK, FIN, PSH, URG, RST 등을 설정

  • --limit : 지정한 시간동안의 최대 매칭횟수를 정의. ddos공격을 차단하는데 사용



기본 동작

  • 패킷에 대한 동작은 위에서부터 차례로 각 규칙에 대하여 검사
    그 규칙이 일치하는 패킷에 대하여 타겟에 지정한 ACCEPT, DROP등을 수행

  • 규칙이 일치하고 작업이 수행되면, 그 패킷은 해당 규칙의 결과에 따라 처리하고 체인에서 추가 규칙을 무시

  • 패킷이 체인의 모든 규칙과 매치하지 않아 규칙의 바닥에 도달하면 정해진 기본정책(policy)이 수행

  • 기본 정책은 policy ACCEPT, policy DROP으로 설정할 수 있음

    • 일반적으로 기본 정책은 모든 패킷에 대해 DROP을 설정하고 특별히 지정된 포트와 IP주소 등에 대해 ACCEPT를 수행하게 만듦



iptables 예제

  • 현재 자신의 방화벽 규칙을 확인
$ iptables –L
  • 기존 정책 제거
$ iptables –F
  • 기본 정책을 ACCEPT로 설정
$ iptables –P INPUT ACCEPT
$ iptables –P OUTPUT ACCEPT
$ iptables –P FORWARD ACCEPT

image

  • 21, 23, 25, 80 포트를 차단하는 정책(각각 하나씩 규칙을 만들 것)

    • (1개씩 열던 여러 개씩 열던 한 번 칠 때마다 한 개씩 쌓이는 것 같음)
$ iptables –A INPUT –p tcp --dport 21 -j DROP
$ iptables –A INPUT –p tcp --dport 23 -j DROP
$ iptables –A INPUT –p tcp --dport 25 -j DROP
$ iptables –A INPUT –p tcp --dport 80 -j DROP
$ iptables –A INPUT –p tcp –m multiport --dport 21,23,25,80 -j DROP

image

  • 첫 번째 정책을 삭제
$ iptables –D INPUT 1

image

  • 세 번째 정책의 출발지 IP를 192.68.1.0/24로 수정
$ iptables –R INPUT 3 –p tcp –s 192.168.1.0/24 --dport 80 –j DROP

image

  • 출발지 IP가 A클라스 사설 IP일 경우 차단하는 정책
$ iptables –A INPUT –s 10.0.0.0/8 –j DROP
  • 출발지 IP가 192.168.10.1부터 192.168.10.100, 그리고 192.168.150.0.24이고 목적지 IP는 192.168.10.170이고 목적지 포트는 3306일 경우 차단하는 정책
$ iptables –A INPUT –p tcp –s 192.168.150.0/24 –d 192.168.10.170 --dport 3306 –j DROP
$ iptables –A INPUT –p tcp –m iprange --src-range 192.168.10.1-192.168.10.100 –d 192.168.10.170 --dport 3306 –j DROP

image

image

  • tcp 패킷이 초당 10개가 올 경우 차단하는 정책(limit match 이용)
$ iptables –A INPUT –p tcp –m limit --limit 10/s –j DROP
  • 하나의 세션에서 10개의 패킷이 매칭된 후 tcp 패킷이 분당 100개가 올 경우 차단하는 정책
$ iptables –A INPUT –p tcp –m limit --limit 100/m --limit-burst 10 –j DROP
  • 초기화
$ iptables -F
$ iptables -L

image

  • 80포트 REJECT
$ iptables -A INPUT -p tcp --dport 80 -j REJECT
$ iptables -A OUTPUT -p tcp --dport 80 -j REJECT
$ iptables -A FORWARD -p tcp --dport 80 -j REJECT

image

  • 80포트 DROP
$ iptables -A INPUT -p tcp --dport 80 -j DROP
$ iptables -A OUTPUT -p tcp --dport 80 -j DROP
$ iptables -A FORWARD -p tcp --dport 80 -j DROP

image