iptables

민콕이·3일 전

iptables란?

리눅스 커널에 들어오고/나가는 패킷을 필터링, 제어, 변환(NAT) 하는 방화벽



iptables는 왜 필요할까?

리눅스 서버는 기본적으로

  • 네트워크 패킷을 받고
  • 처리하고
  • 다른 곳으로 전달할 수 있다

👉 그런데 아무 제어 없이 둔다면

  • 아무 IP나 접속 가능
  • 아무 포트나 접근 가능
  • 내부 네트워크가 그대로 노출



테이블(table) 종류

filter (기본 테이블)

가장 많이 사용되는 기본 테이블로, 패킷이 목적지에 도달하도록 할지 아니면 차단할건지 결정

  • INPUT : 호스트 컴퓨터로 들어오는 패킷 제어 (외부 → 내 서버)
  • OUTPUT : 호스트 컴퓨터에서 외부로 나가는 패킷 제어 (내 서버 → 외부)
  • FORWARD : 호스트를 거쳐 다른 목적지로 가는 패킷 제어

nat

패킷의 IP 주소나 포트 번호를 변환하는데 사용, 주소 사설 IP와 공인 IP 간의 통신이나 포트 포워딩에 사용

  • PREROUTING : 들어올 때 목적지 변경 (DNAT)
  • POSTROUTING : 나가기 직전 출발지 변경 (SNAT, MASQUERADE)
  • OUTPUT : 로컬에서 나가는 패킷

mangle

패킷의 내용을 수정하거나 서비스 품질 설정을 위해 IP 헤더의 특정 필드를 변경할 때 사용
(모든 체인을 지원한다)
ex) TTL 64 => TTL 128

  • PREROUTING : 들어오기 전
  • INPUT : 로컬로 올 때
  • FORWARD : 전달
  • OUTPUT : 나갈 때
  • POSTROUTING : 나간 후



체인(Chain)

패킷이 이동하는 통로에 위치한 체크포인트 같은 개념 패킷이 이 체크 포인트를 지날 때마다 우리가 설정한 규칙에 부합한지 검사하고, 그에 맞는 조치를 취합니다.

즉 iptables가 Packet을 컨트롤할 때 시점


각 체인의 역할

  • PREROUTING: 패킷이 네트워크 인터페이스를 통해 막 들어왔을 때 거치는 단계 (라우팅 결정 전)
  • INPUT: 패킷의 최종 목적지가 호스트(본인 서버)일 때 거치는 단계
  • FORWARD: 패킷의 목적지가 본인이 아니라 다른 곳일 때, 중간에서 전달만 해주는 단계
  • OUTPUT: 호스트(본인 서버)에서 생성되어 외부로 나가는 패킷이 거치는 단계
  • POSTROUTING: 라우팅 결정이 끝나고 패킷이 망으로 나가기 직전에 거치는 단계

체인에서 내리는 결정 (Target)

체인의 각 규칙 끝에는 이 패킷을 어떻게 처리할지 결정하는 타겟(Target)이 붙습니다.

  • ACCEPT: 패킷을 허용
  • DROP: 패킷을 조용히 차단 (보낸 쪽에서 응답을 못 받고 타임아웃 발생)
  • REJECT: 패킷을 차단하고 거부 메시지를 보냄 (보낸 쪽에서 즉시 차단됨을 인지)
  • LOG: 패킷의 정보를 로그에 기록 (차단이나 허용을 하지 않고 통과시킴)
  • DNAT: 패킷의 목적지 주소를 변경 (외부에서 내부 서버로 접속할때 주로 사용)
  • SNAT: 패킷의 출발지 주소를 변경 (내부 네트워크에서 외부 인터넷으로 나갈때 사용)
  • MASQUERADE: 유동 IP 환경에서 사용 (SNAT와 유사)

사용자 정의 체인

생성 시 제어할 대상을 그룹화해서 호율성을 높이기 위해 사용




Policy

특정 체인에 정의된 모든 규칙에 해당하지 않는 패킷이 도착했을 때 적용되는 '기본 처리 방식' 을 의미합니다.

즉 내가 정해둔 조건에 맞는게 없다면 해당 패킷을 어떻게 할지 최종 결정을 하는것이라고 보면 됩니다.


  • ACCEPT: 패킷을 통과 (전부 허용하고 거부할 대상을 작성) 기본 설정
  • DROP: 패킷을 모두 버림 (전부 거부하고 허용할 대상을 작성) 권장 방식
  • REJECT: 패킷을 버리고 발신자에게 거부되었다는 오류 메시지를 보냄 (Policy 설정으로는 직접 사용 불가하며, 규칙의 마지막에 추가하는 방식으로 활용)



기본 문법

iptables [테이블] [체인] [조건] -j [동작]

# 기본적인 테이블 확인
iptables -L -n -v

# 전체 초기화 
iptables -F

# 기본 정책 설정
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

#정책 전체 삭제
iptables -t filter -F

예시

SSH 허용

iptables -A INPUT -p tcp --dport 22 -j ACCEPT
부분의미
-A INPUTINPUT 체인에 추가
-p tcpTCP 패킷
--dport 22목적지 포트 22
-j ACCEPT허용

웹 서버 허용

iptables -A INPUT -p icmp -j ACCEPT

내부 네트워크 인터넷 공유

iptables -t nat -A POSTROUTING -s 192.168.9.0/24 -o ens32 -j MASQUERADE

ICMP 정책 삭제

iptables -t filter -L --line : icmp의 행 번호 확인
iptables -t filter -D INPUT (행 번호)

Interface 기준 정책

iptables -t filter -A INPUT -i (Interface 이름) -j DROP/ACCEPT



iptables 사용 시 주의사항

규칙은 위에서부터 순서대로 검사
먼저 매칭되면 종료


재부팅하면 사라짐

iptables-save
iptables-restore
profile
정리 블로그

0개의 댓글