iptables 정의 및 예제

동스토리 ㅣ 2021. 9. 2. 21:28

반응형

침입차단 시스템(iptables)

IPS(Intrusion Prevention System)의 대표적 오픈소스 솔루션으로  리눅스 방화벽을 통과하는 모든 패킷에 대한 연결 상태를 추적하여 이 정보를 메모리에 기억하고 있다가 기존의 연결을 가장하여 접근할 경우 메모리에 저장된 상태 목록과 비교하여 적합하면 통과하고 그렇지 않으면 거부하는 솔루션

 

iptables [Table] -[ A | I | D ] [Chain] [Rule] [Target]

1) -A : append mode, 해당 체인의 제일 마지막에 룰을 추가한다.

2) -I : insert mode, 해당 체인의 첫 행에 룰을 추가한다.

3) -D : delete mode, 해당 룰을 삭제한다.

 

[Chain]

1) INPUT Chain : 방화벽을 최종 목적지로 하는 체인

2) OUTPUT Chain : 방화벽을 최초 출발지로 하는 체인

3) FORWARD Chain : 방화벽을 통과하는(경유하는) 체인

 

[Rule]

1) -s [IP 또는 IP 대역] : Source IP를 명시한다. 명시하지 않으면 any IP를 의미

2) -d [IP 또는 IP 대역] : Destination IP를 명시한다. 명시하지 않으면 any IP를 의미

3) --sport [포트 번호] : 출발지 포트를 명시한다.

4) --dport [포트 번호] : 목적지 포트를 명시한다.

5) --icmp--type [메시지 타입] : 메시지타입을 명시한다.

6) --tcp-flags [검사할 플래그 리스트] [설정되어야 할 플래그 리스트]

ex. --tcp-flags SYN,FIN SYN,FIN 

SYN, FIN 플래그만을 검사해서 SYN, FIN 플래그가 설정된 패킷을 탐지한다. 즉 SYN, FIN 이외에 다른 플래그가 설정되어 있어도 SYN, FIN만 설정되어 있으면 이를 탐지한다.

ex. --tcp-flags ALL SYN,FIN

모든 플래그(ALL)를 검사해서 SYN, FIN플래그만 설정된 패킷을 탐지한다. 즉, SYN, FIN이외의 다른 플래그가 설정 되어 있지 않은 경우에만 탐지한다.

 

-m state --state [탐지할 상태(NEW, ESTABLISHED, RELATED, INVALID]: TCP 상태 기능을 사용

* NEW : 최초로 들어온 패킷의 상태를 말한다. (일반적으로 TCP의 경우 SYN 패킷이 해당된다.)

* ESTABLISHED : 상태추적 테이블에 연결정보를 가지고 있는 패킷의 상태

* RELATED : 상태추적 테이블에 연관된 연결정보를 가지고 있는 패킷의 상태를 말한다. 연관이 되었다는 의미는 연결시의 포트 정보가 서비스 수행 중에 새롭게 추가될 수 있는데 이러한 서비스의 패킷은 연관된 상태가 된다.(FTP에 21/tcp로 제어채널 형성후 20/tcp 데이터 채널을 형성하는 경우)

* INVALID : 어떤 상태에도 해당되지 않는 패킷 상태를 의미한다. 연결 상태를 알 수 없거나 잘못된 헤더를 가지고 있는 경우를 의미한다.

 

[Target]

1) -j ACCEPT : 해당 패킷을 허용한다.

2) -j DROP : 해당 패킷을 차단한 후 아무런 응답 메시지도 전송하지 않는다.

3) -j REJECT : 해당 패킷을 차단한 후 ICMP 에러 메시지로 응답한다.

4) -j LOG : 탐지 로그를 남긴다. (/var/log/messages)

iptables -L [Chain] -n

IP와 Port를 숫자형식으로 출력하여 해당 체인에 등록된 룰 리스트를 확인한다.

iptables -F [Chain]

해당 체인에 등록된 모든 룰 정보를 삭제한다.

iptables -P [Chain] [ ACCEPT | DROP | REJECT ]

해당 체인의 모든 룰에 매치되지 않으면 기본 정책을 지정

 

침입 차단시스템(iptables) 실습

 

(가) 위조된 TCP SYN 패킷을 차단하기 위한 룰 설정

1) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

2) iptables -A INPUT -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "[Forged SYN Packet]"

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

 

(나) FTP Active Mode 상태추적 기능 테스트

1) iptables -P INPUT DROP

2) iptables -P OUTPUT DROP

3) iptables -A INPUT -m state --state ESTABLISHED -j LOG --log-prefix "[FTP INPUT_ESTABLISHED]"

4) iptables -A INPUT -m state --state RELATED -j LOG --log-prefix "[FTP INPUT_RELATED]"

5) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

6) iptables -A INPUT -m state --state NEW -p tcp --dport 21 -j LOG --log-prefix "[FTP INPUT_NEW]"

7) iptables -A INPUT -m state --state NEW -p tcp --dport 21 -j ACCEPT

8) iptables -A OUTPUT -m state --state ESTABLISHED -j LOG --log-prefix "[FTP OUTPUT_ESTABLISHED]

9) iptables -A OUTPUT -m state --state RELATED -j LOG --log-prfix "[FTP OUTPUT_RELATED]"

10) iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCPET

- connlimit 모듈 : 동일한 IP 또는 IP 대역의 동시 연결 개수에 대한 제한 (디도스 공격에 효과적)

1) --connlimit-above n : n을 초과하는 동시 연결을 제한한다.

2) --connlimit-mask mask : 0~32범위의 mask값을 지정해 IP 대역에 대한 동시 연결을 제한한다.

 

(다) 웹서버(80/tcp)에 대한 TCP SYN Flooding 공격을 대응하기 위한 룰 설정1

1) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

2) iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 5 -j LOG --log-prefix "[CONNLIMIT]"

3) iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 5 -j DROP

4) iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT

 

(라) 웹서버(80/tcp)에 대한 TCP SYN Flooding 공격에 대응하기 위한 룰 설정2

1) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

2) iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 --connlimit-mask 24 -j LOG --log-prefix "[CONNLIMIT]"

3) iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 5 --connlimit-mask 24 -j DROP

4) iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT

- limit 모듈 : 룰에 매치되는 비율을 제한할 수 있는 기능으로 불필요한 로그를 남기지 않도록 할 때 유용

limit [n/second(또는 s) | n/minute(또는 m) | n/hour(또는 h) | n/day(또는 d)]

초당/분당/시간당/하루당 매칭되는 제한건수를 지정한다.

 

(마) 비정상적인 TCP 플래그 조합(SYN_FIN 플래그 조합) 패킷 차단 룰 설정1

1) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

2) iptables -A INPUT -p tcp --tcp-flags ALL SYN,FIN -m limit --limit 6/minute -j LOG --log-prefix "[LIMIT]"

3) iptables -A INPUT -p tcp --tcp-flags ALL SYN,FIN -j DROP

4) iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT

 

(마) 비정상적인 TCP 플래그 조합(SYN_FIN 플래그 조합) 패킷 차단 룰 설정2

1) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

2) iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit --limit 1/second -j LOG --log-prefix "[LIMIT]"

3) iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

4) iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT

 

(바) 비정상적인 TCP 플래그 조합(FIN 플래그만 설정) 패킷 차단 룰 설정

1) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

2) iptables -A INPUT -p tcp --tcp-flags ALL FIN -m limit --limit 1/second -j LOG --log-prefix "[LIMIT3]"

3) iptables -A INPUT -p tcp --tcp-flags ALL FIN -j DROP

4) iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT

 

(사) 비정상적인 TCP 플래그 조합(NULL 플래그 설정) 패킷 차단 룰 설정

1) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

2) iptables -A INPUT -p tcp --tcp-flags ALL NONE -m limit --limit 1/second -j LOG --log-prefix "[LIMIT4]"

3) iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

4) iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT

 

(아) 비정상적인 TCP 플래그 조합(XMAS 플래그 설정) 패킷 차단 룰 설정

1) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

2) iptables -A INPUT -p tcp --tcp-flags ALL ALL -m limit --limit 1/second -j LOG --log-prefix "[LIMIT5]"

3) iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

4) iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT

- recent 모듈 : 동적으로 Source IP 목록을 생성하여 이를 기반으로 패킷을 제어하는 기능을 제공하는 모듈

 

(자) SSH Brute Force/Dictionary Attack 차단 룰 설정

1) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

2) iptables -A INPUT -m state --state NEW -p tcp --dport 22 -m recent --name SSH_DROP --set

3) iptables -A INPUT -m state --state NEW -p tcp --dport 22 -m recent --name SSH_DROP --update --seconds 60 --hitcount 5 -j LOG --log-prefix "[SSH Brute Force Drop]"

4) iptables -A INPUT -m state --state NEW -p tcp --dport 22 -m recent --name SSH_DROP --update --seconds 60 --hitcount 5 -j DROP

5) iptables -A INPUT -m state --state --state NEW -p tcp --dport 22 -j ACCEPT

 

감사합니다.

반응형

'Security > Network' 카테고리의 다른 글

[Infra] Security Onion 설치  (0) 2021.10.08
Snort 정의 및 예제  (0) 2021.09.02
Proxy (Forward proxy & Reverse proxy)  (0) 2020.11.27
라우팅 (Routing)  (0) 2020.11.24
미러링(Mirroring) / 인라인(In-line) 모드  (0) 2020.11.16