[Linux Network] 06. iptables - 1
카테고리: LINUX_NETWORK
태그: linux linux_network
01. iptables이란?
a) Netfilter
Linux Kernel 내부의 네트워크 관련 프레임워크로, 네트워크 패킷을 제어할 수 있는 기능을 제공한다.
b) iptables
패킷 필터링 기능을 가지고 있는 리눅스 커널에 내장된 Netfilter 기능을 관리하기 위한 툴로 Rule 기반의 패킷 필터링 기능을 제공한다.
■ 지원 기능
| 구분 | 내용 |
|---|---|
| 기본 기능 | filtering, Logging, NAT |
| 확장 모듈 | ‘상태 추적(Stateful Inspection)’, String Filtering, Limit, Logging 등 |
b) 상태 추적(Stateful Inspection)
방화벽을 통과하는 모든 패킷에 대한 연결 상태를 추적하여 이 정보를 메모리에 기억하고 있다가 기존의 연결을 가장하여 접근할 경우 저정된 상태 목록과 비교하여 적합하면 통과하는 기능을 말한다.
02. iptables 용어
| 구분 | 설명 |
|---|---|
| 테이블(Table) | iptables가 제공하는 기능을 의미 |
| 체인(Chain) | 패킷이 이동하는 경로, 테이블마다 사용할 수 있는 체인이 정해져 있다. |
| 룰(Rule) | 패킷을 필터링하기 위한 룰 |
a) 테이블(Table)
■ 테이블 종류
| 구분 | 설명 |
|---|---|
| Filter | 정책에 일치하는 패킷을 타겟(Target)으로 전달하여 Action을 수행, 주로 패킷의 혀용/거부할 때 사용 |
| Nat | 정책에 일치하는 패킷의 주소를 변화하는 동작을 수행 |
| Mangle | 정책에 일치하는 패킷의 필드 값을 변경함, 주로 데이터 전송 경로 변경, 우선순위 값 변경 등에 사용됨 |
■ Table 조회 명령
# filter Table(기본값)
$ iptables –L
# nat Table
$ iptables –t nat –L
# mangle Table
$ iptables –t mangle -L
b) 체인(Chain)
■ Built-in Chain
-
Netfilter에서 정의한 패킷을 제어할 수 있는 위치
-
INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING
■ 사용자 정의 Chain
-
Command 옵션으로 사용자가 직접 생성하는 chain
-
예를 들어, WEB 데이터를 제어하기 위한 정책 목록 구성하거나 DOS 차단 정책을 위한 목록 구성 등
c) Tables별 Built-in chain
■ Filter Table
| 구분 | 설명 |
|---|---|
| INPUT | 목적지가 호스트인 패킷에 대한 필터링 |
| OUTPUT | 출발지가 호스트인 데이터에 대한 필터링 |
| FORWARD | 호스트를 경유하는 데이터에 대한 필터링(라우터 용도) |
■ Nat Table
| 구분 | 설명 |
|---|---|
| PREROUTING | ㆍtarget → DNAT ㆍ외부에서 내부로 향하는 데이터의 주소 변조 ㆍ인터페이스에 데이터를 받자마자 변환 수행 |
| OUTPUT | 로컬에서 생성된 데이터를 내보내기 직전에 변환 수행 |
| POSTROUTING | ㆍtarget → SNAT, MASQUERADE ㆍ내부에서 외부로 향하는 데이터의 주소 변환 ㆍ인터페이스로 데이터가 전달되기 직전에 변환 수행 |
■ Mangle Table
| 구분 | 설명 |
|---|---|
| INPUT | 목적지가 호스트인 패킷 변경 |
| OUTPUT | 출발지가 호스트인 패킷 변경 |
| FORWARD | 호스트을 경유하는 패킷 변경 |
| PREROUTING | 패킷이 라우팅 되기 전에 변경 |
| POSTROUTING | 패킷이 라우팅 된 후에 변경 |
03. iptables 동작
-
위에서부터 차례로 각 규칙에 대해 검사 수행
-
규칙과 일치하는 패킷에 대해 타겟에 지정한 작업을 수행
-
규칙이 일치하고 작업이 수행되면 해당 규칙의 결과에 따라 처리하고 체인에서 추가 규칙을 무시
-
패킷이 체인의 모든 규칙과 매치하지 않아 규칙의 바닥에 도달하면 정해진 기본정책(policy) 수행
04. iptables 명령어
iptables [-t 테이블 이름] <Command> [Chain 이름] [Rule 옵션] [-m 확장 모듈] [모듈 옵션] [target] [target 옵션]
a) 체인(Chain) 설정
| 구분 | 설명 |
|---|---|
| -A <chain> | 지정된 체인의 마지막에 정책 추가 |
| -I <chain> <num> | 지정된 체인의 지정된 위치에 정책 추가 |
| -D <chain> <num> | 지정된 체인의 지정된 정책 삭제 |
b) 체인(Chain) 정보 관리
| 구분 | 설명 |
|---|---|
| -F [chain] | 지정된 chain의 모든 정책을 초기화 |
| -Z [chain] | 지정된 chain의 패킷 카운터 초기화 |
| -P <chain> | 지정된 chain의 기본정책 변경(Built-in chain만 변경 가능) |
| -L [chain] | 지정된 chain의 모든 정책 목록 확인(–line: 정책 순번 확인, -v: 정책 매치되는 패킷의 수와 크기 출력) |
| -N <new chain> | 지정된 chain 이름으로 사용자 정의 체인 생성 |
| -E <old> <new> | 지정된 chain을 다른 이름으로 변경(단, chain이 비어있어야 함) |
| -X <chain> | 지정된 chain을 삭제(사용자 정의 chain만 삭제 가능) |
| -h | 특정 명령에 대한 간단한 도움말 출력 |
c) 룰(Rule) 설정
| 구분 | 설명 |
|---|---|
| -p <IP헤더의 protocol 값> | 제어할 데이터의 종류 지정 |
| –sport <port번호(범위)> | 제어할 데이터의 출발지 포트를 조건으로 지정 |
| –dport <port번호(범위)> | 제어할 데이터의 목적지 포트를 조건으로 지정 |
| -s <출발지 IP> | 제어할 데이터의 출발지 IP를 조건으로 지정 (네트워크 설정 가능: 10.10.10.0/24) |
| -d <목적지 IP> | 제어할 데이터의 목적지 IP를 조건으로 지정 (네트워크 설정 가능: 10.10.10.0/24) |
| -i <인터페이스 이름> | 지정된 인터페이스로 들어오는 데이터를 조건으로 지정 (OUTPUT 체인에서는 정의하지 못함) |
| -o <인터페이스 이름> | 지정된 인터페이스로 들어오는 데이터를 조건으로 지정 (INPUT 체인에서는 정의하지 못함) |
| –icmp-type <type> | 특정 종류의 icmp 메시지를 조건으로 지정 (iptables -p icmp -h : 타입종류 확인) |
| –tcp-flags <flag> | 특정 종류의 TCP를 조건으로 지정 (flag : SYN, ACK, FIN, PSH, URG, RST) |
| –syn | TCP SYN 메시지를 조건으로 지정 |
d) 타겟(Target) 설정
-j <target 종류> [target 옵션]"
■ Filter 테이블 타겟 종류
| 구분 | 설명 |
|---|---|
| -j ACCEPT | 조건에 일치하는 패킷 허용 |
| -j REJECT | 조건에 일치하는 패킷 차단, 차단 된 패킷에 대한 응답(Error Message)을 전달 함 |
| -j DROP | 조건에 일치하는 패킷 차단, 차단 된 패킷에 대한 응답을 발생시키지 않음 |
| -j LOG | 조건에 일치하는 패킷을 로그로 남김, Limit 모듈과 같이 사용 함, [–log-prefix <”로그제목”>], [–log-level <syslog level>] |
■ NAT 테이블 타겟 종류
| 구분 | 설명 |
|---|---|
| -j SNAT –to <변경 할 IP> | 내부에서 전달되는 요청의 출발지 주소를 직접 지정한 공인 IP로 변환 |
| -j DNAT –to <변경 할 IP> | 외부에서 전달되는 요청의 목적지 주소를 서버의 사설 IP로 변환 |
| -j MASQUERADE | 조건에 일치하는 패킷의 출발지 주소를 변환, 내부에서 전달되는 요청의 출발지 주소를 조건에 지정된 인터페이스의 IP로 변환 |
| -j REDIRECT –to-port <redirect port> | 조건에 일치하는 패킷의 port를 –to-port 옵션으로 지정된 port로 redirection 함(Port Forwarding) |
e) 확장 모듈 설정
■ Multiport 확장 모듈
- 각각 떨어져 있는 포트를 한꺼번에 묶어서 정책을 구성할 때 multiport 모듈을 사용
-m multiport <모듈 옵션>
-p <UDP|TCP> -m multiport <--sports|--dports|--ports> <port>,[port],…
# 예시
$ iptables –t filter –A FORWARD –p tcp –m multiport --dports 20,80,443 –j ACCEPT
■ limit 확장 모듈
- 패킷의 조건 매칭의 주기를 제한하기 위해 사용 (LOG를 남기는 주기 설정 또는 DOS/DDOS 차단 정책 (정상적인 패킷의 전달주기 이상이 될 때 차단))
# 패킷을 매치 시킬 주기 패킷수/시간단위
# 초당(/second, /s), 분당(/minute, /m), 시간당(/hour,/h), 하루당(/day, /d)
# 예) 3/s → 초당 3개의 패킷을 조건에 매치
--limit <주기>
# --limit 옵션으로 제한하기 전 무조건 허용할 패킷의 개수 지정
--limit-burst <패킷 수>
■ state 확장 모듈
- 상태 추적 기능을 지원하는 모듈
-m state --state <상태추적 종류>
| 상태 추적 종류 | 설명 |
|---|---|
| NEW | ㆍ새로운 연결을 요청하는 패킷을 상태 추적 테이블에 등록하고 필터링 함 ㆍ새로운 요청(SYN)을 매치 함 |
| ESTABLISHED | ㆍ기존 연결에 속하는 패킷(상태 추적 테이블에 등록된 패킷)일 때 필터링 함 ㆍNEW에 의해 등록된 연결에 소속된 패킷(ACK를 포함하고 있는 응답)을 매치 함 |
| RELATED | ㆍ기존 연결에 속하지만 새로운 연결을 요청하는 패킷에 대한 정보를 상태 추적 테이블에 업데이트하면서 필터링 ㆍ통신과정에서 새로운 연결을 개시하는 서비스에서 사용 함 → FTP, ICMP Error Message … |
| INVALID | 상태 추적 테이블에 등록되지 않은 패킷에 대한 필터링 |
- 상태 추적 테이블 정보 확인 (/proc/net/nf_conntrack)
■ string 확장 모듈
-
Application Layer의 Text 필터링 기능을 지원하는 모듈
-
WEB Log등을 필터링 하여 특정 주소로 접근하는 패킷을 필터링 할 수 있음
-m string --algo <문자 알고리즘> --string <“필터링 할 문자열”>
| 옵션 | 설명 |
|---|---|
| –algo <bm|kmp> | 문자 매치 알고리즘 지정 (bm:Boyer-Moore, Kmp:Knuth-Pratt-Morris) |
| –string “pattern” | 문자열로 패턴 지정 |
| –hex-string “hex pattern” | 문자열의 Hex값으로 패턴 지정 |
05. iptables 규칙 저장
a) iptables 규칙 저장
-
iptables로 구성된 정책은 메모리에 저장되어 서비스를 재시작하면 삭제 된다.
-
“service iptables save”: /etc/sysconfig/iptables 파일에 저장됨
b) 다른 파일로 BACKUP
- “iptables-save > 백업파일”: iptables-save명령으로 정책을 호출한 후 redirection하여 파일에 출력 함
c) 지정한 파일로 RESTORE
- “cat 백업파일 | iptables-restore”: Backup된 iptables 정책을 메모리에 로드 함
댓글 남기기