iptables 는 '침입 차단 시스템' 으로서 snort 의 '침입 탐지 시스템' 과 비교된다.
snort가 정찰 ,수색조라면 iptables는 섬멸조의 역할을 수행한다.
iptables [테이블] [체인] [룰] [타겟] 으로 구성된다.
기본문법
1. Table
형식
-t [테이블]
테이블을 명시하지 않으면 디폴트로 Filter 테이블이 적용된다.
2. Chain
iptables -[A | I | D] [체인]
-A : append 모드, 해당 체인의 제일 마지막에 룰을 추가
-I : insert 모드, 해당 체인의 첫 행에 룰을 추가한다.
-D : delete 모드, 룰을 삭제하는 모드로 "-D 체인 n" 형식으로 지정하면 특정 위치에 있는 룰을 삭제할 수 있다.
3. Rule
IP/ICMP/TCP/UDP 모두 호스트를 식별하기 위해서 IP를 이용한다.
앞에 붙는 -p 는 프로토콜 지정이다.
Rule 1)
-s[IP 또는 IP대역] : Source IP(출발지 IP) 를 명시한다. 명시하지 않으면 any IP 를 의미
ex) -s 192.168.159.131 (IP주소인 패킷)
-s 192.168.159.0/24 (대역인 패킷)
-d [IP또는 IP대역] : Destination IP 를 지칭, 명시하지 않으면 any(모든 IP) 를 의미
Rule 12
TCP/UDP의 경우 포트번호를 통해 서비스를 식별
--sport [포트 번호] : 출발지 포트를 명시한다.
ex) --sport 23 - 23번포트
--sport 1024: - 1024 이상 포트
--sport :65535 - 65535 이하 포트
--sport 1:1023 -1~1023 포트
Rule 3)
icmp의 경우 타입과 메세지 코드를 통해서 메시지를 식별
--icmp -type[메시지 타입]
ex) --icmp -type ehco -request : ICMP Echo Request 메시지를 의미
Rule 4)
TCP 패킷 행동 유형에 따른 필터링 룰 설정으로 다음의 모든 옵션은 TCP 프로토콜(-p tcp) 옵션이 먼저 선행되어야 한다.
--tcp -flags [검사할 플래그 리스트][설정되어야 할 플래그 리스트]
ex) --tcp -flags SYN,FIN SYN,FIN = SYN,FIN만을 이용하여 SYN,FIN 플래그가 설정된 패킷을 탐지, 즉 다른 Flags가 설정되어 있어도SYN,FIN만 설정되어 있다면 이를 탐지한다.
ex) --tcp -flags ALL SYN,FIN = 모든 플래그를 검사해서 SYN,FIN 플래그만 설정된 패킷을 탐지한다, 즉 SYN,FIN 이외의 다른 플래그가 설정되어 있지 않은 경우에만 탐지한다.
Rule 5)
-m state --state [탐지할 상태]
-m state = 확장 기능 중 TCP 상태 기능을 사용한다는 의미
--state [탐지할 상태] = 탐지할 상태에는 NEW, ESTABLISHED, RELATED, INVALID 가 있다.
[탐지할 상태]
NEW 상태 : 최초로 들어온 패킷의 상태를 말한다. 즉 상태추적 테이블에 연결정보를 가지고 있지 않은 패킷을 의미한다.
ESTABLISHED 상태 : 상태 추적 테이블에 연결정보를 가지고 있는 패킷의 상태, 연결된 이후에 송수신되는 패킷들은 ESTABLISHED 상태로 보인다
RELATED 상태 : 상태 추적 테이블에 연관된 연결정보를 가지고 있는 패킷의 상태를 말한다.
연관이 되었다는 의미는 연결시의 포트 정보가, 서비스 수행중에 새롭게 추가될 수 있다는 의미로 이러한 서비스의 패킷은 연관된 상태가 된다.
INVALID 상태 : 어떤 상태에도 해당되지 않는 패킷 상태를 의미한다. 연결 상태를 알 수 없거나 잘못된 헤더를 가지고 있는 상태를 의미한다.
4. target
-j [정책] = 룰에 매치될 때 적용할 정책을 지정한다.
-j ACCEPT = 해당 패킷을 허용한다.
-j DROP = 해당 패킷을 차단하고 잠적해 버린다
-j REJECT = 해당 패킷을 차단한 후 ICMP 에러 메시지로 응답한다.
-j LOG = 탐지 로그를 남긴다. 일반적으로 "/var/log/messages" 에 남긴다.
5. 기타 옵션
iptables -L [체인] -n
-L 해당 체인에 등록된 룰 리스트를 확인.
-n IP와 port를 숫자 형식으로 출력한다. 즉 호스트명과 서비스명으로 변환하기 위한 reverse lookup을 수행하지 않는다.
iptables -L INPUT -n
iptables -F [체인]
-F[체인] 해당 체인에 등록된 모든 룰 정보를 삭제한다.
룰 작성 (실전)
iptables [-A | -I | -D] [ -m state --state |-p[tcp...] --tcp -flags | --sport , --dport | --icmp -type | -s , -d] [ -j ACCEPT | DROP | REJECT | LOG ]
위와 같이 나뉜다.
[EX 1]
1. TCP 패킷 중 상태추적 테이블에는 NEW 이면서 (최초 들어온 패킷) SYN 플래그를 설정하지 않은 패킷은 차단(DROP) 한다.
2. TCP 상태추적 테이블에 NEW 라면 반드시 SYN 플래그가 설정된 패킷이여야 하며, 이 외의 패킷은 모두 조작된 패킷이므로 차단한다.
iptables -F Input
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
상태추적 기능을 사용하기 위해서는 state 모듈과 (-m state) state 옵션(--state) 을 이용하여 관련 상태 유형을 명시한다. 8번 라인을 보면 ESTABLISHED 상태 또는 RELATED 상태의 패킷에 대해서는 모두 허용하도록 설정하고 있다.
1. 가장 상단에 ESTABLISHED, RELATED 상태의 패킷을 허용하도록 선언함으로써 이미 허용된 트래픽에 대해 이후 발생하는 패킷들의 룰 검사를 다시 할 필요 없이 빠르게 허용할 수 있다는 장점이 있다.
2. inbound TCP 패킷의 상태가 NEW 이면서 (최초 들어온 패킷) SYN 플래그가 설정되지 않은 (! --syn) 비정상 패킷을 "[Forged SYN Packet]" 접두어를 사용하여 로그(-j LOG) 에 남긴다.
3. inbound TCP 패킷의 상태가 NEW 이면서(최초 들어온 패킷) SYN 플래그가 설정되지 않은 (! --syn) 비정상 패킷을 차단(-j DROP) 한다.
[EX 2] FTP ACTIVE Mode 상태 추적 기능 테스트
-P 는 policy 로 기본 정책을 변경하는것을 의미한다.
iptables -F INPUT
10 : iptables -P INPUT DROP
11 : iptables -P OUTPUT DROP
13 : iptables -A INPUT -m state --state ESTABLISHED -j LOG --log -prefix "[FTP INPUT_ESTABLISHED]"
14 : iptables -A INPUT -m state --state RELATED -j LOG --log -prefix "[FTP INPUT_RELATED]"
15 : iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
16 : iptables -A INPUT -m state --state NEW -p tcp --dport 21 - j LOG --log -prefix "[FTP INPUT_NEW]"
17 : iptables -A INPUT -m state --state NEW -p tcp dport 21 -j ACCEPT
19 : iptables -A OUTPUT -m state --state ESTABLISHED -j LOG --log -prefix "[FTP OUTPUT_ESTABLISHED]"
20 : iptables -A OUTPUT -m state --state RELATED -j LOG --log -prefix "[FTP OUTPUT_RELATED]"
21 : iptables -A OUTPUT -m state --state ESTABLISHED , RELATED -j ACCEPT
10,11번 라인 : INPUT ,OUTPUT 체인의 기본 정책을 차단으로 설정
13,14번 라인 : INPUT 체인에 대해 ESTABLISHED, RELATED 상태의 패킷 로그를 남기도록 설정
15번 라인 : INPUT 체인에 대해 ESTABLISHED, RELATED 상태의 패킷을 모두 허용
16번 라인 : INPUT 체인에 대해 TCP21번 포트 (FTP) 에 대한 연결 요청 (--state NEW)를 로그에 남기도록 설정
17번 라인 : INPUT 체인에 대해 TCP 21번 포트 (FTP) 에 대한 연결 요청 (--state NEW) 를 허용
19,20번 라인 : OUTPUT 체인에 대해 ESTABLISHED, RELATED 상태의 패킷로그를 남기도록 설정
21번 라인 : OUTPUT 체인에 대해 ESTABLISHED , RELATED 상태의 패킷을 모두 허용.
[EX 3] 웹서버 (80/tcp ) 에 대한 TCP / SYN Flooding 공격에 대응하기 위한 룰 설정
--connlimit-above n = n을 초과하는 동시 연결을 제한한다.
--connlimit-mask mask = 0~32범위의 mask 값을 지정한다. IP 대역의 대한 동시 연결을 제한
iptables -F INPUT
iptables -A INPUT -m state --state ESTABLISHED, RELATED -j ACCEPT
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 --connlimit -mask 24 -j LOG --log -prefix "[CONNLIMIT]"
10 번 라인 : iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 --connlimit-mask 24 -j DROP
iptables -A INPUT -m state --state NEW --p tcp --dport 80 -j ACCEPT
TCP 80번 포트 요청에 대하여 동일한 24비트 마스크 대역 (--connlimit-mast 24) 의 IP 에 대해서 동시 연결 갯수가 10개 초과 시 (--connlimit-above 10) 이를 차단 (-j DROP) 한다.
[EX 4] limit 모듈
--limit
1. 초당/분당/시간당/하루당 매칭 되는 제한건수를 지정한다
limit [n/second | n/minute | n/hour | n/day]
비정상적인 TCP 플래그 조합 (SYN_FIN 플래그 조합) 패킷 차단 룰 설정
7번 라인 : iptables -F INPUT
8번 라인 : iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
9번 라인 : iptables -A INPUT -p tcp --tcp -flags ALL SYN,FIN -m limit --limit 6/m -j LOG --log-prefix "[LIMIT]"
10번 라인 : iptables -A INPUT -p tcp --tcp-flags ALL SYN,FIN -j DROP
11번 라인 : iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
9번 라인 : TCP 패킷의 모든 플래그(ALL)를 검사해서 SYN,FIN 플래그만 설정된 비정상 패킷을 분당 최대 6개까지 "[LIMIT]"접두어를 사용하여 LOG 에 남긴다.
10번 라인 : TCP 패킷의 모든 플래그를 검사해서 SYN,FIN 플래그만 설정된 비 정상 패킷을 차단 한다.
'Operating System > Security' 카테고리의 다른 글
syslog란? (0) | 2021.08.03 |
---|---|
snort (침입 탐지 시스템) (0) | 2021.02.13 |