728x90

개요
쿠버네티스를 사용하다가 k3s에서 사용하는 iptables와 firewalld가 iptables를 쓰는 것이 충돌하여 문제가 발생했습니다.
이 과정에서 리눅스 네트워킹 개념이 부족하고, iptables의 개념이 부족하여 찾아보고 공부한 내용을 정리하고자 합니다.
IPTABLES 란❓
기본 개념
- iptables는 Linux 커널에 내장된 네트워크 패킷 필터링 시스템(netfilter)을 제어하는 사용자 공간 도구입니다.
- 즉, 실제 패킷 처리(차단, 허용 등)는 커널에서 수행하고, iptables는 그 규칙을 설정하거나 제어하는 사용자 공간 프로그램입니다.
네트워크 패킷 필터링 시스템이란 ❓
Netfilter는 리눅스 커널 내부에 포함된 네트워크 패킷 처리 프레임워크입니다. 즉, 리눅스 커널 안에서 네트워크 패킷이 들어오고, 나가고, 라우팅 되는 과정 중에 패킷을 가로채서 검사·수정·차단·허용할 수 있는 기능을 제공합니다.
iptables이란 ❓
규칙을 설정하고 관리
쉽게 말하면, Linux 시스템에 들어오고 나가는 네트워크 트래픽을 제어하는 방화벽입니다.
IPTABLES 핵심 구조
1. Table(테이블)
- iptables는 여러 개의 테이블로 구성되어 있으며, 각 테이블은 특정 목적을 가집니다.
주요 테이블
| filter | 패킷 필터링 (허용/차단) | 방화벽 규칙 |
| nat | 네트워크 주소 변환 | 포트 포워딩, IP 변환 |
| mangle | 패킷 헤더 수정 | QoS, TTL 변경 |
| raw | 연결 추적 예외 설정 | 고급 설정 |
2. Chain(체인)
- 각 테이블은 여러 개의 체인을 가지고 있으며, 체인은 패킷이 통과하는 경로를 나타냅니다.

◽체인별 역할
- INPUT : 외부에서 로컬 시스템으로 들어오는 패킷 처리
- 예: SSH 접속, 웹 서버 접근
- OUTPUT : 로컬 시스템에서 외부로 나가는 패킷 처리
- 예: 인터넷 브라우징, API 호출
- FORWARD : 로컬 시스템을 경유하는 패킷 처리 (라우터 역할)
- 예: 방화벽, 게이트웨이, Kubernetes Pod 간 통신
- PREROUTING : 패킷이 시스템에 도착한 직후 (라우팅 전)
- 예: DNAT (목적지 주소 변환)
- POSTROUTING : 패킷이 시스템을 떠나기 직전 (라우팅 후)
- 예: SNAT (출발지 주소 변환), Masquerading
3. Rules (규칙)
각 체인은 여러 개의 규칙(Rule)을 가지고 있습니다. 규칙은 조건(Match)과 동작(Target)으로 구성됩니다.
IF (조건) THEN (동작)
조건 예시
- 출발지 IP가 192.168.1.100
- 목적지 포트가 80
- 프로토콜이 TCP
동작 예시
- ACCEPT: 허용
- DROP: 조용히 차단
- REJECT: 거부 메시지와 함께 차단
- LOG: 로그 기록
허용(ACCEPT)과 차단(DROP)의 의미
1. 허용(ACCEPT) : 패킷을 통과시켜 목적지로 전달
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
2. 차단(DROP) : 패킷을 버립니다. 아무런 응답 X
iptables -A INPUT -p tcp --dport 23 -j DROP
3. 명확한 차단(REJECT) : 패킷을 거부하고 즉시 거부 메시지를 전송
iptables -A INPUT -p tcp --dport 23 -j REJECT
IPTABLES 기본 명령어
규칙 조회
# 모든 규칙 확인
iptables -L -n -v
# nat 테이블 확인
iptables -t nat -L -n -v
# 줄 번호와 함께 확인
iptables -L --line-numbers
- 시스템에 설정된 iptables 규칙을 확인합니다
- 모든 규칙 확인
- -L: 목록
- n: IP를 이름으로 변환 안 함
- -v: 상세 정보
규칙 추가
- 새로운 방화벽 규칙을 체인에 추가합니다.
# SSH 허용 (22번 포트 TCP 트래픽 허용)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 특정 IP 허용 (192.168.1.100에서 오는 모든 트래픽)
iptables -A INPUT -s 192.168.1.100 -j ACCEPT
# HTTP/HTTPS 허용
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 이미 연결된 세션 허용 (중요! 이게 없으면 응답 패킷이 차단됨)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
- -A
- 체인 끝에 규칙 추가 (Append)
- -p
- 프로토콜 지정 (tcp, udp, icmp 등)
- --dport
- 목적지 포트
- -s:
- 출발지 IP 주소
- -j
- 동작 지정 (ACCEPT, DROP, REJECT 등)
규칙 삭제
# 줄 번호로 삭제
iptables -D INPUT 3
# 모든 규칙 삭제
iptables -F
기본 정책 설정
# 모든 입력 차단
iptables -P INPUT DROP
# 모든 출력 허용
iptables -P OUTPUT ACCEPT
규칙 영구 저장
- iptables 규칙은 재부팅 시 사라지므로 저장이 필요합니다.
CentOS/RHEL
# 현재 규칙을 파일로 저장
iptables-save > /etc/sysconfig/iptables
# 부팅 시 자동 로드되도록 설정
systemctl enable iptables
Ubuntu/Debian
# iptables-persistent 패키지 설치
apt-get install iptables-persistent
# 규칙 저장 (설치 중 자동으로 물어봄)
netfilter-persistent save