본문 바로가기

OS,Network,Container

[Linux] iptables 정리

반응형

- Kubernetes network 스터디를 진행하면서 iptables 개념은 필수로 이해하고 있어야 하기 때문에 정리하였습니다.


iptables : 네트워크 패킷들을 규칙에 따라 제어(Accept, Drop, Modify, NAT, ..)하기 위한 유저 스페이스 레벨의 애플리케이션이다.

 

Packet은 Netfilter에서 설정한 여러 Hook들을 통과하게 된다.

Hook별로 iptables에서 정의한 각 Chain들의 Rule들을 점검하며, 해당 Rule에 매칭되면 특정 Action을 Trigger한다.

⇒ 해당 부분이 이해가 가지 않을 수 있다. 중간에 한번 더 해당 문구가 보일 경우 의미를 되새겨보면 이해할 수 있을 것이다.

 

유저 스페이스 레벨의 애플리케이션이란 어떤 의미일까?

⇒ iptables는 Linux 관리자 및 사용자들이 Kernel 내부를 조정하지 않고 User Space 단에서 방화벽 정책 및 NAT 정책을 손쉽게 관리하기 위한 목적이며, 내부적으로는 커널단에 있는 Netfilter을 통해 동작하게 된다.


1. iptables 핵심 개념

‘테이블’들은 ‘체인’들을 가지고 있다.

‘체인’들은 ‘규칙’들을 가지고 있다.

 

2. iptables 개념 요약

  • Table : 목적/용도별 규칙 모음
  • ⇒ filter, nat, mangle, raw, security
  • Chain : 패킷이 지나가는 Hook별로 존재
  • ⇒ INPUT, FORWARD, PREROUTING, POSTROUTING, OUTPUT, ..
  • Rule : Table과 Chain Matrix에 대해서 정의
  • ⇒ Protocol Type, 소스 IP, 목적지 IP, 헤더, ..
  • Action(target) : 패킷이 해당 Rule에 매칭되면 Trigger된다.
  • ⇒ ACCEPT, DROP, REJECT, ..

가시다님 자료

그림을 보면 이해가 좀 더 잘 될 수 있다.

 

TABLE 1은 Chain1, Chain2를 가지고 있고, 각각의 Chain은 여러 Rule들을 가지고 있다.

 

가시다님 자료

1. FILTER TABLE은 INPUT, OUTPUT, FORWARD CHAIN이 있다.
2. NAT TABLE은 OUTPUT, PREROUTING, POSTROUTING CHAIN이 있다.
3. MANGLE TABLE은 INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTIN CHAIN이 있다.

⇒ 왜 3개의 TABLE 밖에 없냐고 묻는다면 주로 많이 사용되고 우선 3개의 TABLE만 이해해도 무방하기 때문일 것으로 추정한다.


iptables 처리 흐름도

가시다님 자료

 

가시다님 자료

Packet은 Netfilter에서 설정한 여러 Hook들을 통과하게 된다.

Hook별로 iptables에서 정의한 각 Chain들의 Rule들을 점검하며, 해당 Rule에 매칭되면 특정 Action을 Trigger한다.

 

⇒ 위의 그림에서 볼 수 있듯이 미리 정의해놓은 Hook들을 Packet들은 거쳐가게 되고,
    Hook 별로 우리가 iptables 라는 명령어를 통해서 각 Chain에 Rule들을 세팅할 수 있고,
    해당 Rule에 매칭이 될 경우 특정 Action을 수행하도록 한다. 특정 Action은 ACCEPT, DROP, 
    MODIFY, .. 등이 될 수 있다.

 

 

1) 개인 노트북 WSL2에서 iptables 수행 결과

filter 테이블의 -S(list-rules) 커맨드 옵션을 준 결과,

nat 테이블의 -S(list-rules) 커맨드 옵션을 준 결과,

-L(list) 옵션을 준 결과이다.

 

두 커맨드 모두 특정 chain을 지정하지 않으면 모든 체인을 보여준다

S, --list-rules [chain]

L, --list [chain]

 

Docker 설치한 뒤 iptables 변경

Packet의 source가 172,17.0.0/16(Docker 네트워크 대역)이고 docker0로 나가지 않는(외부로 향하는) 경우에는 MASQUERADE로 목적지를 향하도록 한다.

 

⇒ 마스커레이딩을 사용함을 의미

Docker를 사용하는 것 만으로도 Docker가 스스로 Container 네트워크 환경을 조성하기 위해 iptables를 설정하여 Network packet 흐름을 조작하는 것을 확인할 수 있다.


명령어 정리

Ref : https://blessu1201.github.io/2020/09/08/iptables.html

https://fmyson.tistory.com/284

 

 

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

 


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

 


3. 타겟(target)
ACCEPT : 패킷을 받아들임.
DROP : 패킷을 버림 (패킷전송이 없었던 것 처럼)
REJECT : 패킷을 버리고 이와 동시에 적절한 응답 패킷을 전송
LOG : 패킷을 syslog에 기록
RETURN : 호출 체인 내에서 패킷 처리를 지속함

 

 

 

# 적용상태 확인

iptables -nvL --line-numbers | more

 

# 특정 Port를 차단하는 정책

⇒ 테이블을 명시하지 않았기 때문에 Default 테이블인 filter 테이블에 대한 정책을 추가한 것이다.

iptables -A INPUT -p tcp --dport 21 -j DROP

iptables -A INPUT -p tcp --dport 80 -j DROP

 

# 첫 번째 정책을 삭제 (iptables -L --line으로 라인 확인할 수 있다.)

iptables -D INPUT 1

 

# n번째 정책의 출발지 IP를 xx.xx.xx.xx/xx로 수정

iptables -R INPUT 3 -p tcp -s 192.168.10.10/24 --dport 80 -j DROP

 

# tcp 패킷이 초당 10개가 올 경우 차단하는 정책 (limit match)

iptables -A INPUT -p tcp -m limit --limit 10/s -j DROP

 

# ICMP라는 Chain을 새롭게 생성

icmp 패킷이 들어올 경우 ICMP란 이름의 Chain으로 전달

icmp 체인에 ping에 대한 응답하지 않는 정책 추가

 

iptables -N ICMP

iptables -A INPUT -p icmp -j ICMP

iptables -A ICMP -p icmp --icmp-type 8 -j DROP

반응형