linux iptables 구조 및 명령어
iptables의 구조를 이해하고 네트워크 트래픽을 제어하는 방법을 알아보겠습니다.
먼저 iptables는 IP주소, 포트번호, 프로토콜 유형, 패킷 컨텐츠 등 사용자 환경에 따라 트래픽을 차단 및 허용할 수 있습니다.
iptables의 구조
iptables의 구조는 table, chain이 있고 table을 먼저 소개하겠습니다.
1) table
iptables는 방화벽 규칙을 네트워크 트래픽을 처리하는 방법을 정의한 테이블이 존재하며,
각 테이블은 틍정 종류의 패킷 처리 규칙을 담당합니다.
1-1) filter
이 테이블을 가장 자주 사용하며, 패킷을 허용할지 말지 결정합니다.
iput, output, forward 체인을 사용합니다.
1-2) NAT
NAT규칙을 처리하는 테이블입니다.
prerouting, postrouting, output 체인을 사용합니다.
1-3) Mangle
패킷의 우선순위와 같은 패킷의 특정 속성을 변경합니다.
input, output, forward 체인을 사용합니다.
1-4 Raw
패킷이 다른 테이블에서 처리되기 전 초기 단계를 처리하는 규칙 테이블입니다.
prerouting, output 체인을 사용합니다.
4가지의 테이블 구조에 작성한 각각의 체인들을 설정할 수 있습니다.
다음은 체인에 대해 설명하겠습니다.
2) chain
각 테이블은 여러 개의 체인을 가질 수 있고, 체인은 패킷이 언제 규칙에 따라 처리될지 결정합니다.
2-1) input
시스템으로 들어오는 패킷을 처리합니다.
2-2) output
시스템에서 나가는 패킷을 처리합니다.
2-3) forward
시스템을 통과하는 패킷, 즉 라우터 역할을 하는 경우의 패킷을 처리합니다.
다른 컴퓨터로부터 받아 다른 컴퓨터로 전달되는 데이터의 규칙을 설정합니다.
2-4) prerouting, postrouting
NAT 테이블에서 사용되며, 주소 변환 전 후 패킷 처리 규칙을 정의합니다.
3) iptables 명령어
iptables는 등록 순서에 영향을 받아 먼저 등록한 정책이 우선순위가 높습니다.
iptables [-t table] [action] [chain] [match] [-j target]
으로 iptagles를 사용하고 명시되는 동작에 따라서만 패킷을 처리합니다.
3-1) action
action | 설명 |
-A | 규칙 추가 |
-D | 규칙 삭제 |
-I | 순서 지정 |
-L | 규칙 목록 출력 |
-F | 규칙 초기화 |
-N | 새로운 사용자 정의 |
-X | 비어있는 체인 제거, 기본 체인 제거불가 |
-P | 체인 기본 정책 설정 |
3-2) match
match | 설명 |
-s | 출발지 source를 뜻함 |
-d | 목적지 destination을 뜻함 |
-P | 특정 프로토콜과 매칭 |
-i | 입력 인터페이스와 매칭 |
-o | 출력 인터페이스와 매칭 |
# -p 옵션 뒤에는 추가 옵션을 붙여야합니다.
--sport # 발신지의 포트
--dport # 목적지의 포트
3-3) target
target | 설명 |
ACCEPT | 패킷을 허가함 |
DROP | 패킷을 거부함 |
LOG | 패킷을 로그에 전달하여 기록하여 시스템로그에 저장 |
REJECT | 패킷을 버리고 응답 패킷 전달 |
3-4) 종합 예제문
설정 내용 출력
iptables -nL
TCP 22 포트를 열기
iptables -A INPUT -p tcp --drpot 22 -j ACCEPT
특정 네트워크 인터페이스를 통해 들어오는 트래픽 규칙 지정
iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
# 특정 네트워크 인터페이스를 통해 나가는 트래픽 규칙 지정
iptables -A OUTPUT -o eth0 -p tcp --dport 80 -j ACCEPT
# localhost 접속 허용
iptables -A INPUT -i lo -j ACCEPT
# 순서 지정하기
iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT
# 특정 ip차단
iptables -A INPUT -s 111.222.33.44 -j DROP
# 포워딩
iptables -A PREROUTING -t nat -p tcp --dport 80 -j REDIRECT --to-port 8080
# 특정 테이블 리스트 확인
iptables -t nat -L
# 규칙 삭제
iptables -D INPUT 1 -p tcp --dport 443 -j ACCEPT
# 체인의 기본 정책 정의
iptables -P INPUT DROP
# 모듈 사용
iptables -A INPUT -p tcp -m state --state NEW,ESTABLISHED -j ACCEPT
# -m state : state 모듈을 사용한다는 의미
# --state NEW,ESTABLISHE : 패킷의 연결 상태를 기준으로 필터링을 하겠다는 조건을 나타냄
# 설정 내용 초기화
iptables -F
3-5) 모듈
-m 명령어로 모듈을 지정해줍니다.
# conntrack 모듈 패킷의 연결 추적 상태를 기반으로 필터링 한는 모듈입니다. state보다 더 세밀한 관리가 가능합니다.
-m conntrack --ctstate NEW,ESTABLISHED
# 새로운 연결을 시작하는 패킷이나 이미 화립된 연결의 패킷을 선택할 수 있습니다.
# 이 밖에도 RELATED, INVALID, UNTRACKED, SNAT, DNAT의 옵션이 있습니다.
# state 모듈 conntrack 모듈과 유사하게 패키스이 연결 상태를 기반으로 필터링 합니다.
-m state --state RELATED,ESTABLISHED
# RELATED 상태는 새 연결이 기존의 확립된 연결과 관련 있음을 나타냅니다.
# 이 밖에도 NEW, INVALID 옵션이 있습니다.
# 공통적으로
# NEW : 새로운 연결을 위한 패킷
# ESTABLISHED : 기존 연결의 일부로 확인된 패킷
# RELATED : 기전 연결과 관련된 새로운 연결을 위한 패킷. (FTP의 데이터 전송과 같은 경우)
# INVALID : 추적할 수 없는 상태
# UNTRACKE : 연결 추적 시스템에 의해 추적되지 않는 패킷
# SNAT : 소스 NAT 후의 패킷 상태
# DNAT : 목적지 NAT 후의 패킷 상태
# 를 나타냅니다.
# tcp 모듈
# udp 모듈
# icmp 모듈 icmp 프로토콜을 사용하는 패킷, 특히 echo request 메시지를 필터링합니다.
-m icmp --icmp-type echo-request
# limit 모듈 지정된 한도 내에서만 패킷을 허용하는 모듈입니다.
-m limit --limit 1/s --limit-burst 5
# 초당 1개 패킷을 허용하되, 최대 5개까지는 버스트를 허용한다는 의미입니다.
# multiport 모듈 여러 포트에 대한 규칙을 지정합니다.
-m multiport --dports 22,80,443