본문 바로가기
Security/정보보안기사

[정보보안기사] #4. IPTABLES 개요 및 활용

by 이미존재 2022. 10. 19.
반응형

■ IPTABLES 개요 및 활용

 ※ 해당 포스트는 작성자가 정보보안기사를 공부하면서 작성한 자료로 일부 정보가 변경되거나 잘못된 부분이 
     있을 수 있으므로 댓글 남겨 주시면 수정하도록 하겠습니다.

 

 ▶ 정보보안기사 대비하여 iptables의 정의와 간단한 사용법에 대한 내용입니다.
 ▶ iptables는 리눅스의 OS 방화벽 도구로서 가능 널리 사용되고 있으나 현재 firewalld, UFW 등으로 대체되고 있습니다.
 ▶ firewalld는 CentOS7부터 이전의 iptables를 대체해 새롭게 선보인 동적 방화벽 관리자패킷필터링 방화벽 입니다.
 ▶ firewalld는 네트워크 인터페이스에 기초한 네트워크 구역(zone)을 통해 설정합니다.
 ▶ ubuntu 18.04는 기본적으로 iptables와 함께 UFW(Uncomplicated Firewall, ufw)를 제공합니다.
 ▶ iptables의 작업을 간편화 해주는 소프트웨어가 UFW(Uncomplicated FireWall) 입니다.
 ▶ 참조 - https://itwiki.kr/w/%EB%A6%AC%EB%88%85%EC%8A%A4_iptables 
 ▶ 참조 - https://ko.wikipedia.org/wiki/Iptables


1. iptables 개요

 - iptables는 리눅스상에서 방화벽을 설정하는 도구로서 커널 2.4 이전 버전에서 사용되던 ipchains를 대신하는 방화벽 도구입니다.
 - iptables는 커널상에서의 netfilter 패킷필터링 기능을 사용자를 제어하는 방식으로 사용합니다.
 - netfilter는 커널 모듈로 서버에 대한 클라이언트의 네트워크 접속을 제어합니다.
 - 패킷필터링이란 지나가는 패킷의 해더를 보고 전체 패킷을 허용할지 결정합니다.(패킷 = 해더 + 데이터)
 - 헤더에는 출발지IP:PORT, 도착지IP:PORT, checksum, 프로토콜 옵션 등이 포함되며, 데이터는 각각의 전송데이터가 들어갑니다.
 - 패킷에 대해 허용(ACCEPT)과 차단(DROP)등을 지정할 수 있으며, 특정 조건등을 통해 다양한 방식의 패킷 필터링과 처리 방식을 지원합니다.

 1) iptables의 Chain
  : iptables는 여러 구분으로 나눠지며 Chain은 설정의 중요한 부분입니다.
  : iptables에 내장된 기본 Chain은 다음과 같습니다.
   * Chain INPUT : 서버로 들어오는 정책
   * Chain OUTPUT : 서버 자체에서 나가는 정책
   * Chain FORWARD : 서버를 통해 forwarding 되는 정책. Linux Server가 목적지가 아닌 Server의 네트워크를 통해 패킷이 통과하는 chain입니다. (FORWARD는 NAT(네트워크 공유) 사용을 위해 사용됩니다.) 

 

2. iptables 기본 사용법

 1) iptables 추가 방법(-A 명령어)
  : iptables -A chain -s [Source IP] -p tcp --sport [Source Port ] -d [Destination IP] --dport [Destination Port] -j [규칙허용여부(target)] 
  예) # iptables -A INPUT -s 192.168.100.21 -p icmp -j DROP 

 2) 현재 iptables 정책 확인
    # iptables --list 또는 iptables -L

    ..........
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:domain
ACCEPT     tcp  --  192.168.48.1         anywhere             tcp dpt:postgresql
    ..........


 3) 현재 iptables rule number 확인(룰셋 적용순서 확인)

root@raonyn:~# iptables -nL --line-numbers
    ..........

num  target     prot opt source               destination         
1    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
2    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:53
3    ACCEPT     tcp  --  192.168.48.1         0.0.0.0/0            tcp dpt:5432
    ..........


 4) iptables 정책 수정(-I 명령어)
  예) # iptables -I INPUT 2 -s 192.168.48.1 -p icmp -j ACCEPT 

 5) iptables 정책 수정(-R 명령어)
  예) # iptables -R INPUT 3 -s 192.168.48.11 -p icmp -j DROP 

 6) 현재 iptables 규칙을 초기화
    # iptables -F

 7) iptables 규칙 제거(-D 명령어)
  : iptables -D chain -s [Source IP] -p tcp --sport [Source Port ] -d [Destination IP] --dport [Destination Port] -j [규칙허용여부(target)] 
  예) # iptables -D INPUT -s 192.168.100.21 -p icmp -j DROP 
  : iptables -D INPUT [rule line number] 
  예) # iptables -D INPUT 1

  

3. iptables 정책 순서

 - iptables는 정책을 상단부터 적용된다. 즉 먼저 등록한 정책의 효력이 유효하기 때문에 등록시에는 순서가 중요합니다.
 - 입출력 패킷에 대해 거부하는 설정이 먼저 등록되면 그 이후에 포트를 열어주는 설정을 해도 적용이 안됩니다.

 1) 정책 적용 순서에 따라 다른 효력 
  : 22번 포트가 열린 후 나중에 22번~30번 포트가 막히기 때문에 SSH 접속이 가능
 # iptables -A INPUT -p tcp --dport 22 -j ACCEPT
 # iptables -A INPUT -p tcp --dport 22:30 -j DROP

  : 22번~30번 포트가 막히기 때문에 뒤에서 아무리 22번 포트를 열어도 외부에서 SSH로 접속할 수 없습니다.
   (실제 적용시 원격 접속 안되므로 주의 하세요!!!!!!)
 # iptables -A INPUT -p tcp --dport 22:30 -j DROP
 # iptables -A INPUT -p tcp --dport 22 -j ACCEPT


4. iptables 활용 예제


 1) 소스 ip가 192.168.48.129 인 접속의 모든 접속 포트를 차단
    # iptables -A INPUT -s 192.168.48.129 -j DROP

 2) 목적지 포트가 23번(--dport23)인 tcp 프로토콜(-p tcp) 패킷을 거부하는(-j DROP)규칙을 추가(-A)
    # iptables -A INPUT -p tcp --dport 23 -j DROP

 3) 출발지 주소가 127.0.0.1(-s 127.0.0.1) 인 icmp 프로토콜(-p icmp) 패킷을 거부(-j DROP)하는 정책을 추가(-A)
    # iptables -A INPUT -p icmp -s 127.0.0.1 -j DROP

 4) 모든 접속지에서 목적지 80 포트 허용 추가(-A)
    # iptables -A INPUT -p tcp --dport 80 -j ACCEPT

 5) 목적지 포트번호가 1023번 보다 작은 모든 포트(--dport :1023)인 tcp프로토콜(-p tcp)패킷을 거부하는(-j DROP)규칙 추가(-A)
    # iptables -A INPUT -p tcp --dport :1023 -j DROP

 6) ssh 포트 오픈 정책 삽입
    # iptables -I INPUT -p tcp --dport 22 -j ACCEPT

 7) 출발지 IP가 192.168.0.0/255.255.255.0 대역에 대해 imap 서비스 오픈정책 삽입
    # iptables -I INPUT -s 192.168.0.0/255.255.255.0 -p udp --dport 143 -j ACCEPT

 8) 웹서버 포트 80 -> 8880으로 수정
   # iptables -R INPUT 2 -p tcp --dport 8880 -j ACCEPT

 


5. DoS 유형 공격 차단 정책 예제


 1) SYN 연결의 임계치 설정(Syn_Cookie 설정)
  - 동일한 출발지에서 동시에 5개 이상의 SYN 패킷이 들어오면 DROP
     # iptables -A INPUT -p TCP --dport 80 --syn -m connlimit --connlimit --conlimit-above 5 -j DROP


 2) MSS 값 차단 설정
  - 일반적이지 않은 TCP MSS 값을 사용하는 새로운 패킷을 차단
     # iptables -A PREROUTING -p tcp -m conntrack --ctstate NEW -m tcpmss ! --mss 536:65535 -j DROP

 3) TCP RST  패킷 제한 설정
  - RST 패킷에 대해 초당 2개까지 허용, 3개 부터는 차단됨(burst는 --limit와 함께 쓰며 매칭시킬 최대값을 설정)
   # iptables -A INPUT -p tcp --tcp-flags RST RST -m limit --limit 2/s --limit-burst 2 -j ACCEPT 
   # iptables -A INPUT -p tcp --tcp-flags RST RST -j DROP

728x90

댓글