Programming/Linux

[리눅스] iptables 개념 및 명령어

kevin_01 2024. 1. 23. 15:11
728x90

iptables란?

  • 리눅스상에서 방화벽을 설정하는 도구
  • netfilter 패킷필터링 기능을 산용자 공간에서 제어하는 수준으로 사용할 수 있다.

패킷필터링이란?

  • 지나가는 패킷의 헤더를 보고 그 전체 패킷의 운명을 결정하는 것을 말한다. 일반적으로 패킷은 헤더와 데이터를 가진다.
  • 헤더에 필터링할 정보인 출발지 IP:PORT, 도착지 IP:PORT, ckecksum, 프로토콜 옵션등을 가지며 데이터는 각각의 전송데이터가 들어간다.
  • 특정 조건을 가지고 있는 패킷에 대해 허용과 차단등을 지정할 수 있으며, 특정 조건등을 통해 당양한 방식의 패킷 필터링과 처리 방식을 지원한다.

iptables 정책은 여러 구분으로 나눠지며 중요한 부분은 Chain이다.

  • Chain INPUT : 서버로 들어오는 기본 정책
  • Chain FORWARD : 서버에서 forwarding 기본 정책
  • Chain OUTPUT : 서버에서 나가는 기본 정책
  • 스크린샷 2024-01-23 오후 1.26.25.png
  • Linux Server를 목적지로 삼는 모든 패킷은 INPUT Chain을 통과하고
  • Linux Server에서 생성되 외부로 보내지는 모든 패킷은 OUTPUT Chain을 통과하게 된다.
  • FORWARD Chain의 경우 현재의 Linux Server가 목적지가 아닌 패킷이 통과하는 Chain이다.
    • FORWARD Chain은 NAT(네트워크 공유)기능 사용을 위해 사용된다.

마스커 레이드

  • 내부 사설 IP의 PC들이 외부 인터넷이 연결 가능하도록 해주는 기능

NAT(Network Address Translation)

  • SNAT(Source NAT) : 내부 사설 IP에서 외부로 나갈 때 공인 IP로 변환 → 마스커레이드와 비슷
  • DNAT(Destination NAT) : 외부에서 방화벽(외부 IP)으로 요청되는 주소로 내부사설 IP로 변환

iptables 의 구조

  • iptables -옵션(A, D, C) 체인명 -p 프로토콜 -s 발신지 --sport 발신지포트 -d 목적지 --dport 목적지포트 -j 정책
  1. 기본 정책을 ACCEPT로 설정하는 법
    • iptables -P INPUT ACCEPT
    • iptables -P OUTPUT ACCEPT
    • iptables -P FORWARD ACCEPT
  2. 현재 자신의 방화벽 규칙을 볼 수 있는 명령
    • iptables -L
  3. 규칙 초기화
    • iptables -F
  4. 규칙 추가 후에 저장
    • service iptables save → /etc/sysconfig/iptables에 저장됨

iptables 정책

  1. 규칙 추가
  • 로컬(127.0.0.1)에서 요청하는 모든 ICMP 패킷에 대해 무시할때
    • ping요청에 사용되는 프로토콜은 ICMP, 발신 주소 127.0.0.1, 목표는 DROP이다.
    • iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP
  1. 규칙 제거
  • 여러가지 방법으로 가능
  • iptables -D INPUT -s [발신지] --sport [발신지 포트] -d [목적지] --dport [목적지 포트] -j [정책]` iptables -D INPUT [필터링 번호] # 필터링 번호는 service iptables stat을 통해 확인할 수 있다. iptables -F INPUT # 입력할 경우 모든 체인이 삭제된다.
  • 위에 입력했던 체인을 삭제하는 방법
  • # 방법 1 - 첫번째 필터였을때 iptables -D INPUT 1 # 방법 2 iptables -D INPUT -s 127.0.0.1 -p icmp -j DROP
  • DROP, REJECT 차이
    • DROP
      • 패킷을 완전히 무시하고 폐기
      • 송신자는 패킷이 도달하지 않았음을 알 수 없다.
      • 네트워크 상에서 패킷이 소멸된 것으로 간주된다.
      • 공격자가 특정 포트로 접근을 시도하더라도 시스템은 해당 포트가 닫혀있는 것처럼 행동한다.
    • REJECT
      • 패킷을 폐기하면서 동시에 송신자에게 여러 메시지를 전송
      • 송신자를 패킷이 차단되었음을 알 수 있다.
      • 이는 송신자에게 통신이 차단되었음을 알려주는데, 서비스를 사용할 수 없다는 에러 메시지를 반환한다
      • 공격자에 대한 특별한 정보를 노출할 우려가 있으므로 주의해야 한다.
  1. 정책 순서
    • 모든 방화벽은 순차적 실행이다.
      • 등록 순서가 먼저인 부분에 대해 효력이 발생하기 때문에 등록시에는 순서가 매우 중요
      • 입출력 패킷에 대해 거부하는 설정이 먼저 등록되면 그 이후에 포트를 열어주는 설정을 하여도 효과가 없다.
      • 허용하는 정책 설정후 거부 하는 정책 설정하기
    • 다음과 같이 설정하면 우선적으로 22번 포트가 열린 후, 낮우에 22~30번 포트가 막히기 때문에 SSH 접속 가능
    • # 22번 포트 열기 iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 22 ~ 30 포트 닫기 iptables -A INPUT -p tcp --dport 22:30 -j DROP
    • iptables 로 입력할 경우 바로 적용이 되기 때문에 원경에서 작업할 경우엔 주의해야 한다.

iptables 의 활용

1초 동안 80포트에 똑같은 IP가 10번 이상의 SYN 가 오면 드랍 시킨다.

  • 즉, 정상적인 요청이 아닌 웹서비스 공격으로 간주하여 요청 패킷을 폐기시켜 응답하지 않도록 한다.
iptables -A INPUT -p tcp --dport 80 -m recent --update --second 1 --hitcount 10 --name HTTP -j DROP

비슷한 예시들

  • 소스 ip가 192.168.0.111 인 모든 접속 포트를 막아라
  • iptables -A INPUT -s 192.168.0.111 -j DROP iptables -D INPUT -s 192.168.0.111 -j DROP
  • INPUT 사슬에 출발지 주소가 127.0.0.1(-s 127.0.0.1) 인 icmp 프로토콜(-p icmp) 패킷을 거부(-j DROP)하는 정책을 추가(-A)하라
  • iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP iptables -D INPUT -s 127.0.0.1 -p icmp -j DROP
  • INPUT 사슬에 목적지 포트가 23번(--dport 23)인 tcp 프로토콜(-p tcp) 패킷을 거부하는(-j DROP)규칙을 추가(-A) 하라
  • iptables -A INPUT -p tcp -dport 23 -j DROP
  • INPUT 사슬에 목적지 포트 번호가 80번(--dport 80)인 tcp 프로토콜(-p tcp)패킷을 받아들이는(-j ACCEPT) 규칙을 추가(-A) 하라
  • iptables -A INPUT -p tcp --dport 80 -j ACCEPT
  • INPUT 사슬에 목적지 포트번호가 1023번 보다 작은 모든 포트(--dport :1023)인 tcp프로토콜(-p tcp)패킷을 거부하는(-j DROP)규칙을 추가(-A)하라
  • iptables -A INPUT -p tcp --dport :1023 -j DROP
  • ftp포트를 열어라
  • # -I 옵션 사용시 맨앞으로 삽입 iptables -I INPUT -p tcp --dport 21 -j ACCEPT
  • imap 서비스를 방화벽에서 열어라
  • iptables -I INPUT -s 192.168.0.0/255.255.255.0 -p udp --dport 143 -j ACCEPT
  • 웹서버 방화벽 열어라
  • iptables -I INPUT -p tcp --dport 80 -j ACCEPT
  • 웹서버 포트 80 -> 8880으로 교체하라( 웹서비스 포트 변경시 /etc/services 에서도 변경 해줘야 함)
  • iptables -R INPUT 2 -p tcp --dport 8880 -j ACCEPT
  • domain-access_log 파일에 있는 모든 ip의 모든 접속 포트를 막아라(DOS공격 방어시 사용)
  • cat domail-access_log | awk '{print $1}' | sort | uniq |awk '{print "iptables -A INPUT -s "$1" -j DROP "}' | /bin/bash
728x90

'Programming > Linux' 카테고리의 다른 글

[리눅스] tr 명령  (1) 2024.01.24
[리눅스] top 명령  (0) 2024.01.23
[리눅스] 파일 복사 및 이동  (0) 2024.01.23
[리눅스] 파일 읽기  (2) 2024.01.23
[리눅스] 파이프 및 리디렉션  (0) 2024.01.23