Linux OS/관리

iptables

서버엔지니어 2023. 3. 12.
728x90

iptables

 

iptables는 시스템 관리자가 리눅스 커널 방화벽이 제공하는 테이블들과 사용자가 저장하는 테이블, 체인, 규칙들을 구성할 수 있게 해주는 사용자 공간 응용 프로그램입니다. iptables는 패킷을 제어할 수도 있습니다. 일단 패킷의 원본이 들어오면 초기에 순회할 테이블의 체인을 고릅니다. 테이블이 모든 체인들을 갖지는 않지만, 5개의 미리 정의된 체인들이 존재합나다. 테이블은 패킷 필터링이나 네트워크 주소 변환(NAT, Network Address Translation)과 같은 기능의 광범위한 범주를 기술을 가지고 있는 iptables입니다. 또한 iptables는 체인으로 정책들을 설정 할 수 있습니다.
 
iptables 명령어 구조

# iptables [-t 테이블 이름] <command> [Chain 이름] [parameters 옵션][-m 확장 모듈] [모듈 옵션] [target] [target 옵션]

기본명령 기능 체인 출발지ip 목적지ip 프로토콜 포트 매칭 동작
iptables -A
-D
-I
-R
INPUT
OUTPUT
FORWARD
PREROUTING
POSTROUTING
사용자 Chain
-s
-d
-i
-o
-d
-s
-i
-o
-p
tcp
udp
icmp
-dport
0 ~ 65536
-j ACCEPT
DROP
REJECT
-N
-X
E
-C
-Z
-P
-F
-S              
-L              

# iptables [-t 테이블 이름] <command> [Chain 이름] [parameters 옵션][-m 확장 모듈] [모듈 옵션] [target] [target 옵션]

filter 특정 룰에 따라 패킷을 차단하거나 통과시키는 역할입니다. 정책에 일치하는 패킷을 target으로 전달하여 action을 수행합니다. 주로 패킷의 허용/거부 할 때 사용 합니다.
target -> ACCEPT, REJECT, DROP, LOG, 사용자 정의 Chain
nat 방화벽으로 향하는 패킷을 방화벽 내부 네트워크의 다른 주소로 forwaring하거나 방화벽 내부 네트워크에서 방화벽을 통해 외부 네트워크로 나갈때 ip 변환합니다.
정책에 일치하는 패킷의 주소를 변화하는 동작을 수행 합니다.
target의 종류는 SNAT, DNAT, MASQUERADE, REDIRECT 있습니다.
mangle 특정 유형의 패킷 변경을 위해 사용됩니다. 정책에 일치하는 패킷의 필드 값을 변경 합니다. 주로 데이터 전송 경로 변경, 우선순위 값 변경 등에 사용 됩니다.
Target 의 종류는 MARK, ACCEPT, TOS 입니다.

# iptables [-t 테이블 이름] <command> [Chain 이름] [parameters 옵션][-m 확장 모듈] [모듈 옵션] [target] [target 옵션]# iptables [-t 테이블 이름] <command> [Chain 이름] [parameters 옵션][-m 확장 모듈] [모듈 옵션] [target] [target 옵션]

<command>

-A (--append) chain : 지정된 chain의 마지막에 정책 추가
-I (--insert) chain [rule_num] : 지정된 chain의 지정된 위치에 정책 추가
위치가 지정되지 않으면 default로 최상위에 정책이 추가
-D (--delete) chain : 지정된 chain의 지정된 정책 삭제
-F (--flush) [chain] : 지정된 chain의 모든 정책을 초기화 또는 모든 체인의 모든 규칙을 제거
(일시적, 재부팅하면 원상복구)
-Z (--zero) [chain] : 지정된 chain이나 모든 chain내의 모든 규칙들의 패킷과 바이트의 카운트를 초기화
-P (--policy) [chain] : 지정된 chain의 기본정책 변경(Built-in chain만 변경 가능)
-L (--list) [chain] : 지정된 chain의 모든 정책 목록 확인
-L [chain] --line : --line 정책의 순서번호 확인
-L [chain] -v : -v 정책에 매치되는 패킷의 수 와 크기를 출력
-N (--new) chain : 새로운 체인 생성
–E (--rename-chain) [old-chain] [new-chain] : 체인의 명칭 바꾸기
-X (--delete-chain) [chain] : 사용자 정의 비어진 체인 제거
-C (--check) : 패킷 테스트
-h : 특정 명령에 대한 간단한 도움말 출력

# iptables [-t 테이블 이름] <command> [Chain 이름] [parameters 옵션][-m 확장 모듈] [모듈 옵션] [target] [target 옵션]

PREROUTING 들어오는 패킷이 라우팅되기 전에 변환
POSTROUTING 나가는 패킷이 라우팅 된 후에 변환
INPUT 목적지가 호스트에 들어온 패킷 변경
FORWARD 호스트를 통과하는 패킷 변경
OUTPUT 출발지가 호스트 방화벽에서 나가는 패킷에 대한 필터링 또는
패킷이 보내지기 전에 로컬에서 생성된 네트워크 패킷 변경

사용자가 만든 Chain

Command 옵션으로 사용자가 직접 생성하는 Chain 입니다.
ex) RH-firewall-1-INPUT – [0:0]

# iptables [-t 테이블 이름] <command> [Chain 이름] [parameters 옵션][-m 확장 모듈] [모듈 옵션] [target] [target 옵션]
-p (--protocol) = -p <ip 헤더의 protocol 값> : udp, tcp, icmp, arp
--sport = --sport <port번호(범위)> : 제어할 데이터의 출발지 포트를 조건으로 지정
--dport = --dport <port번호(범위)> : 제어할 데이터의 목적지 포트를 조건으로 지정
-s (--source) -s <출발지 ip> : 제어할 데이터의 출발지 ip를 조건으로 지정
-d (--destination) -d <목적지 ip> : 제어할 데이터 목적지를 ip를 조건으로 지정
-i (--in-interface) -i <인터페이스 이름> : 지정된 인터페이스로 들어오는 데이터를 조건으로 지정
OUTPUT chain에서는 정의하지 못함
-o (--out-interface) -o <인터페이스 이름> : 지정된 인터페이스로 내보내는 데이터를 조건으로 지정
INPUT chain에서는 정의하지 못함
--icmp-type --icmp-type <type> : 특정 종류의 icmp 메시지를 조건으로 지정
iptables -p icmp -h 타입종류 확인
--tcp-flags --tcp-flags <flags> 특정 종류의 TCP를 조건으로 지정
flag 종류 = SYN, ACK, FIN, PSH, URG, RST
--syn : TCP SYN 메시지를 조건으로 지정

[-m 확장 모듈]

iptables의 기본 기능 외의 Netfilter에서 지원하는 추가 기능을 이용하여 조건을 정의 합니다.
확장 모듈 종류 지정 옵션 : -m
확장 모듈 종류 : multiport, limit, state, string

-m multiport 떨어진 포트 번호를 묶어서 조건으로 지정합니다. 기본 정책은 범위로만 묶을 수 있습니다.(--dport, --sport 또는 port 하나, port 범위만 가능)
각각 떨어져 있는 포트를 한꺼번에 묶어서 정책을 구성할 때 multiport 모듈을 사용 해야합니다.
-m limit 데이터의 처리 주기를 (시간) 조건으로 지정 합니다. 패킷의 조건 매칭 주기를 제한하기 위해 사용 됩니다. LOG를 남기는 주기 설정입니다.
주로 DOS/DDOS 차단 정책입니다.
정상적인 패킷의 전달 주기 이상이 될 때 차단합니다.
-m limit --limit <주기> <주기> ex) 3/s, 3/m, 3/h, 3/d
-m limit --limit-burst <패킷수> --limit 옵션으로 제한하기 전 무조건 허용할 패킷의 개수 지정
-m state <모듈 옵션> 상태 추적을 조건으로 지정 합니다. state 확장 모듈은 4가지가 있습니다.
TCP -> TCP flag를 이용
UDP -> Timer를 이용
-m string 문자열 검색을 조건으로 지정 합니다.
Application Layer Text 필터링 기능을 지원하는 모듈이 있습니다.
WEB Log등을 필터링 하여 특정 주소로 접근하는 패킷을 필터링 할 수 있습니다.

 

-m state <모듈옵션>에서 4가지 의 상태 추적 기능을 지원하는 모듈입니다. 상태추적 종류는 대문자를 써야하고, 여러 종류를 한번에 지정 가능합니다.

State 확장 모듈 상태 추적 종류
NEW 새로운 연결을 요청하는 패킷을 상태 추적 테이블에 등록하고 필터링 함
새로운 요청(SYN)를 매치 함
ESTABLISHED 기존 연결에 속하는 패킷(상태 추적 테이블에 등록된 패킷)일 때 필터링 함
NEW에 의해 등록된 연결에 소속된 패킷(ACK를 포함하고 있는 응답)을 매치 함
RELATED 기존 연결에 속하지만 새로운 연결을 요청하는 패킷에 대한 정보를 상태 추적 테이블에 업데이트하면서 필터링, 통신과정에서 새로운 연결을 개시하는 서비스에서 사용 함 -> FTP, ICMP Error Message
INVALID 상태 추적 테이블에 등록되지 않은 패킷에 대한 필터링
String 확장 모듈 옵션
--algo --algo <bm | kmp> 문자 매치 알고리즘 지정
bm -> Boyer-Moore
Kmp -> Knuth-Pratt-Morris
--string --string “pattern” 문자열로 패턴 지정
--hex-string --hex-string “hex pattern” 문자열의 Hex값으로 패턴 지정

# iptables [-t 테이블 이름] <command> [Chain 이름] [parameters 옵션][-m 확장 모듈] [모듈 옵션] [target] [target 옵션]

[모듈 옵션]

-t : table 사용 default는 filter이므로 nat을 사용하려면 필히 nat이라고 지정해야 함
-o : 패킷이 나가는 네트워크 장치를 지정. 보통 OUTPUT, FORWARD 체인에 사용
-i : 패킷이 들어오는 인터페이스를 지정하는데 사용. INPUT과 FORWARD 체인에 사용
-p : 프로토콜을 지시할 때 사용. 보통 TCP, UDP, ICMP 같은 것들이 사용
-j : 타겟(ACCEPT, DROP, FEJECT)을 설정하겠다는 의미
-s : 출발지 주소 도메인 넷마스크 등을 표기
-d : 목적지의 주소 도메인 넷마스크 등을 표기
--sport : 출발지 포트
--dport : 목적지 포트
-m state : 연결상태를 의미합니다. ESTABLISHED, NEW 등
NEW : 새로운 접속을 만드는 패킷
ESTABLISHED : 존재하는 접속에 속하는 패킷. 즉 접속이 허가되고 통신하면서 발생되는 패킷
RELATED : 기존의 접속의 부분은 아니지만 연관성을 가진 패킷으로 ICMP 에러나 ftp 데이터 접속을 형성하는 패킷
INVALID : 어떤 이유로 확인할 수 없는 패킷. 알려진 접속과 부합하지 않는 ICMP 에러와 out of memory 등을 포함. 보통 이런 패킷은 DROP 됨.
! : 아닌 not의 의미로 사용
--tcp-flags : tcp 패킷의 특성인 SYN, ACK, FIN, PSH, URG, RST 등을 설정
--limit : 지정한 시간동안의 최대 매칭횟수를 정의. ddos공격을 차단하는데 사용

# iptables [-t 테이블 이름] <command> [Chain 이름] [parameters 옵션][-m 확장 모듈] [모듈 옵션] [target] [target 옵션] [target] [target 옵션]

타켓(target) 정책



Filter Table Target 종류

ACCEPT -j ACCEPT 조건에 일치하는 패킷 허용하고 받거나 내보냄
REJECT -j REJECT 조건에 일치하는 패킷 차단
차단된 패킷에 대한 응답을 전달 함
DROP -j DROP 조건에 일치하는 패킷 차단후 버림
차단 된 패킷에 대한 응답을 발생하지 않음 -> port scan 차단
RETURN -j RETURN 호출 체인 내에서 패킷 처리를 계속함
LOG -j LOG 조건에 일치하는 패킷을 로그로 남김
Limit 모듈과 같이 사용 함
--log-prefix <”로그제목”>
--log-level <syslog level>


NAT Table Target 종류

SNAT -j SNAT --to <변경 할 ip> Source NAT(출발지 주소 변환)
내부에서 전달되는 요청의 출발지 주소를 직접 지정한 공인 ip로 변환
(Router Dynamic-NAT와 비슷함)
DNAT -j DNAT --to <변경 할 ip> Destination NAT(목적지 주소 변환)
외부에서 전달되는 요청의 목적지 주소를 서버의 사설 ip로 변환
(Router Static-NAT와 비슷함)
MASQUERADE -j MASQUERADE 조건에 일치하는 패킷의 출발지 주소를 변환, 내부에서 전달되는 요청의 출발지 주소를 조건에 지정된 인터페이스의 ip로 변환(Router NAT-PAT와 비슷함)
REDIRECT -j REDIRECT --to-port <redirect port> 조건에 일치하는 패킷의 Port --to-port 옵션으로 지정된 Port Redirection(Port Forwarding)

 

iptables 서비스 관리 명령어

# service iptables stop | start | restart
# chkconfig iptables on | off
# systemctl enable | disable | start | stop | restart iptables


iptables 설정 파일위치 및 설정 예시

# vi /etc/sysconfig/iptables
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-firewall-1-INPUT - [0:0]
-A INPUT -j RH-firewall-1-INPUT
-A FORWARD -j RH-firewall-1-INPUT
-A RH-firewall-1-INPUT -i lo -j ACCEPT
-A RH-firewall-1-INPUT -p icmp -m icmp --icmp-type any -j ACCEPT
-A RH-firewall-1-INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A RH-firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 20 -j ACCEPT


명령어로 설정하기 예제


192.168.0.123를 제외한 모든 ip에서 tcp 접근 DROP

# iptables -A INPUT -p tcp -i eth0 ! -s 192.168.0.123 -j DROP


192.168.0.123의 목적지 포트 137,138,139,445 으로 향하는 패킷 DROP

# iptables -A INPUT -s 192.168.0.123 -p tcp --sport 22 -j ACCEPT
# iptables -A INPUT -p tcp -m multiport --dport 137,138,139,445 -j DROP


DNS 허용 내부에서 외부로 접속

# iptables -A INPUT -p udp --sport 53 -j ACCEPT
# iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
# iptables -A INPUT -p tcp --sport 53 -j ACCEPT
# iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT


웹서버 운영, 외부에서 들어오는 HTTP/HTTPS 허용

# iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
# iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

 

뒤따라오는 연결은 허용
(참고 : 이걸 안하게 되면 네트워크간 접속이 원활하지 않게 됩니다.)

# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT


내부에서 외부로 인터넷 허용

# iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
# iptables -A INPUT -p udp --sport 53 -j ACCEPT
# iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
# iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT
# iptables -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT


SSH 허용

# iptables -A INPUT -p tcp --dport 22 -j ACCEPT


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

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


하나의 세션에서 10개의 패킷이 매칭된 후 tcp 패킷이 분당 100개가 올 경우 차단하는 정책

# iptables -A INPUT -p tcp -m limit --limit 100/m --limit-burst 10 -j DROP


NULL 패킷 차단 - NULL 패킷은 정찰 패킷으로 서버설정의 약한 곳을 찾기위한 방법으로 사용됩니다.

# iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP


syn-flood attack 차단
syn-flood attack은 공격자가 새로운 연결을 만들고 빠지고를 반복해 리소스의 소모를 시키는 것

# iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP


XMAS 패킷 차단 - XMAS 또한 정찰 패킷입니다.

# iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP


루프백 인터페이스에 대해 모든 패킷을 허용

# iptables -A INPUT -i lo -j ACCEPT


랜카드 지정에 대해 모든 패킷을 허용

# iptables -A INPUT -i eth0 -j ACCEPT

 

신뢰할 만한 ip에 대해 모든 패킷을 허용

# iptables -A INPUT -s 192.168.0.3 -j ACCEPT


신뢰할 만한 ip 대역에 대해 모든 패킷을 허용

# iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT


포트 범위지정

# iptables -A INPUT -p tcp --dport 6881:6890 -j ACCEPT

 

ICMP 허용(Ping)

# iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT


위의 명령어를 하고나서 현재 방화벽 설정을 영구적으로 사용

# service iptables save


명령어로 현재 방화벽설정을 파일로 저장하기

현재 방화벽설정을 파일로 저장하기

# iptables-save > /etc/sysconfig/iptables.rules
# vi /etc/sysconfig/iptables.rules


기존에 저장했던 방화벽파일로 복원하기

현재 방화벽 설정을 파일로 저장했어도 방화벽을 재시작하면 추가명령어를 입력하기전의 설정파일의 값으로 원복이 됩니다. 이 부분 아래명령어로 파일로 복구하는 방법입니다.

# iptables-restore < /etc/sysconfig/iptables.rules
# service iptables save


기본적으로 방화벽을 재시작을 하면 추가로 입력했던 방화벽설정은 없어집니다. 추가로 입력했던 방화벽설정을 자동으로 저장하는 설정입니다.

# vi /etc/sysconfig/iptables-config

==============================================================================
iptables 데몬이 정지되었을 경우 운영 중인 방화벽 룰을 저장할 것 인지에 대한 옵션입니다.
(yes 로 설정하였을 경우 현재 운영 중인 방화벽 룰로 저장됩니다.)

ipTABLES_SAVE_ON_STOP="no"(default) → "yes"로 변경



 

 

 

댓글