정보보안 - iptables
iptables
- 정의
- 리눅스 상에서 방화벽을 설정하는 도구
- 패킷 필터링 기능 : 지나가는 패킷의 헤더를 보고 해당 패킷에 대한 허용/차단 (ACCEPT/DROP) 결정
- Rule 기반의 패킷 필터링 기능을 제공
- 기능
- 상태추적 (Connection Tracking or Stateful Inspection)
- 방화벽을 통과하는 모든 패킷에 대한 연결상태를 추적, 메모리에 기록하여 상태추적테이블을 생성
- 모든 송 수신 패킷을 기록하고 검사
- 기존 연결을 가장하여 접근할 경우 저장되어 있는 상태목록과 비교하여 허용/차단
- 이미 연결된 상태의 패킷은 검사하지 않음
- Stateful Inspection : 이스라엘 보안업체인 Checkpoint 사 에서 최초로 개발한 방화벽 구조
- NAT 기능
- 네트워크 주소 변환
- 패킷 레벨에서 로깅
- 확장 모듈을 이용해 다양한 기능 제공
- 상태추적 (Connection Tracking or Stateful Inspection)
- 용어
- Table
- Filter Table
- NAT Table
- Mangle Table
- Chain : 패킷이 이동하는 경로 (3가지 기본 Chain 이 존재-삭제불가)
- Chain Input : 방화벽을 최종 목적지로 하는 체인
- Chain Output : 방화벽을 최초 출발지로 정하는 체인
- Chain Forward : 방화벽을 통과하는 체인 (방화벽을 별도의 서버로 구성해서 서비스할 때 사용하는 체인)
- -> INPUT -> Linux Server -> Output ->
- ->->->->->->-> FORWARD ->->->->->->->
- Linux Server 를 목적지로 삼는 모든 패킷은 Input Chain 통과
- Linux Server 에서 생성되어 외부로 보내지는 모든 패킷은 Output Chain 을 통과
- Forward Chain 은 현재의 Linux Server 가 목적지가 아닌 패킷이 통과하는 Chain (방화벽을 별도의 서버로 구성)
- Rule : 패킷 필터링을 하기 위한 Rule
- 기본구문 형식
iptables [테이블] [체인] [룰] [타깃]
- 대 소문자 구분
- 테이블 설정
- 형식 :
-t [테이블]
- 테이블을 명시하지 않으면 기본값으로 Filter Table 이 적용
- 형식 :
- 체인(Chain) 설정
- 형식 :
iptables -[A|I|D] [체인]
-A
: append 모드 (해당 체인의 가장 마지막 줄에 룰을 추가)-I
: insert 모드 (해당 체인의 첫 줄에 룰을 추가)- 행번호 지정시 :
-I 체인 n(행번호)
(n 행에 롤 추가)
- 행번호 지정시 :
-D
(delete) : delete 모드-D 체인 룰
: 해당 룰 삭제-D 체인 n(행번호)
: n행의 룰 삭제iptables -D INPUT 1
-P
: 해당 체인의 기본 정책을 설정, 변경- 기본 정책 : 해당 체인의 모든 룰에 매치가 되지 않으면 적용되는 정책
iptables -P [체인명] [ACCPET|DROP|REJECT|LOG]
-R
(replace) : 위치 선택 후 정책 교환-N
(new chain) : 새로운 체인을 생성-Z
: 체인의 모든 규칙들의 패킷과 바이트 카운트를 0으로 만듬-X
(delete chain) : 비어있는 체인 제거-C
(check) : 패킷을 테스트
- 형식 :
- 룰 설정
- 형식 :
iptables -A INPUT -s [발신지] --sport [발신지포트] -d [목적지] --dport [목적지포트] -j [정책]
- 제어 옵션 명령어
-s
(source) : 패킷의 송신지를 제어, IP 또는 IP 대역을 명시 가능-s 192.168.159.0/24
-d
(destination) : 패킷의 수신지를 제어, IP 또는 IP 대역을 명시 가능-j
(jump) : 방화벽을 지난 후 패킷의 상태를 제어-j [정책]
: 룰에 매치될 때 적용할 정책을 지정- ACCEPT : 허용
- DROP : 해당 패킷을 차단한 후 아무런 응답 메시지를 전송하지 않음
- REJECT : 해당 패킷을 차단한 후 ICMP 에러 메시지로 응답 (불필요한 네트워크 트래픽 발생)
- LOG : 탐지 로그를 남김. 주로
/var/log/message
에 남김
-p
(protocol) : 프로토콜을 제어-i
(inbound interface) : 패킷이 들어오는 네트워크 인터페이스-o
(outbound interface) : 패킷이 나가는 네트워크 인터페이스-f
(fragment) : 분절(단편화)된 패킷--sport
: 송신지 포트 제어 (대역 명시 가능)--sport 1024:
: 1024 이상의 포트--sport :65535
: 65535 이하의 포트--sport 1:1023
: 1 ~ 1023 대역의 포트
--dport
: 수신지 포트 제어--icmp-type [메시지타입]
: ICMP 의 경우 타입과 코드를 이용한 메시지 식별--icmp-type echo-request
(ICMP Echo Request 를 의미)
- 예시
- 기본 정책을 ACCPET 로 설정
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
-P
(policy) : 미리 만들어진 체인의 정책을 바꾸기
- 현재 자신의 방화벽 규칙을 보는 명령
iptables --list
iptables -L
(list) : 적용되어 있는 정책 목록을 출력
- 규칙 추가 후에 저장하기
service iptables save -> /etc/sysconfig/iptables
- 현재 iptables 규칙을 초기화 하기
iptables -F
(flush) : 체인의 모든 규칙을 삭제iptables -F INPUT
- 특정 출발지의 패킷을 모두 차단
iptables -A INPUT -s 192.168.0.5 -j DROP
- 특정 목적지로 가는 패킷이 아니라면 허용
iptables -A INPUT -d !192.168.0.10 -j ACCPET
- 특정 프로토콜, 특정 포트일 경우 허용
iptables -A INPUT -p TCP --dport 80 -j ACCEPT
- ICMP 의 경우 타입과 코드를 이용한 메시지 식별
- 기본 정책을 ACCPET 로 설정
- 형식 :
- 기본구문 형식
- Table
- 상태 추적 (Connection Tracking)
- 상태 유형
- New
- 상태추적 테이블에 연결 정보를 가지고 있지 않은 패킷
- 최초로 들어온 패킷의 상태
- 예) TCP 의 SYN 패킷
- ESTABLISHED
- 상태추적 테이블에 연결 정보를 가지고 있는 패킷의 상태
- 연결된 이후에 송수신되는 패킷들의 상태
- RELATED
- 상태추적 테이블에 연관된 연결정보를 가지고 있는 패킷의 상태
- 연관 : 연결 시에 포트의 정보가 서비스 수행중에 새롭게 추가될 수 있는데 이러한 서비스 패킷의 상태를 말함
- 예) FTP 프로토콜 (21/TCP 제어채널 -> 20/TCP 데이터채널)
- 연관 : 연결 시에 포트의 정보가 서비스 수행중에 새롭게 추가될 수 있는데 이러한 서비스 패킷의 상태를 말함
- 상태추적 테이블에 연관된 연결정보를 가지고 있는 패킷의 상태
- INVALID
- 어떤 상태에도 해당되지 않는 패킷상태
- 연결된 상태를 알 수 없거나 잘못된 헤더를 가지고 있는 경우
- New
- 프로토콜 상태 유형
- TCP 프로토콜 상태
- 방화벽 기준
- inbound SYN 패킷 : NEW
- outbound SYN + ACK 패킷 : ESTABLISHED
- 연결종료 마지막 ACK 패킷이 보이기 전까지 ESTABLISHED 상태
- 방화벽 기준
- UDP 프로토콜 상태
- 비연결 (Connectionless) 프로토콜 : 연결 상태를 유지하지 않음
- 프로토콜 수준에서 연결상태 정보가 없음
- 최초 inbound : NEW 상태
- 상태추적 테이블에 UDP 는 inbound 될 때마다 임의의 시간동안 정보를 유지 (ESTABLISHED 상태)
- 비연결 (Connectionless) 프로토콜 : 연결 상태를 유지하지 않음
- TCP 프로토콜 상태
- 룰 설정 예시
- 위조된 TCP SYN 패킷을 차단
- 상태 추적 테이블 상 NEW 이면서 SYN 플래그로 설정되지 않은 패킷 -> DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
- 상태추적 테이블에서 ESTABLISEHD, RELATED 상태의 패킷은 모두 허용
- 이미 허용된 트래픽에 대해서는 룰 검사를 다시 하지 않음 (성능 향상)
-m state
: 상태추적기능을 사용하기 위한 옵션 (state 모듈)--state
: state 옵션
- 상태추적 테이블에서 ESTABLISEHD, RELATED 상태의 패킷은 모두 허용
iptables -A INPUT -p tcp !--syn -m state --state NEW -j LOG --log-prefix "[Forged SYN Packet]"
- 패킷의 상태가 NEW 이면서, SYN 플래그가 설정되지 않은 비정상 패킷을 로그에 남김
--log-prefix "접두어"
: 로그에 접두어를 만들어 표시
iptables -A INPUT -p tcp !--syn -m state --state NEW -j DROP
- 패킷의 상태가 NEW 이면서, SYN 플래그가 설정되지 않은 비정상 패킷을 차단
- 설정 예시
iptables -F INPUT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp !--syn -m state --state NEW -j LOG --log-prefix "[Forged SYN Packet]" iptables -A INPUT -p tcp !--syn -m state --state NEW -j DROP
- FTP ACTIVE MODE 상태추적 (Passive 모드일 경우 포트 지정을 1024 이상으로 하면 됌)
iptables -F INPUT iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -A INPUT -m state --state ESTABLISHED -j LOG --log-prefix "[INPUT ESTABLISHED]" iptables -A INPUT -m state --state RELATED -j LOG --log-prefix "[INPUT RELATED]" iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -m state --state NEW -p tcp --dport 21 -j LOG --log-prefix "[FTP INPUT_NEW]" iptables -A INPUT -m state --state NEW -p tcp --dport 21 -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED -j LOG --log-prefix "[OUTPUT ESTABLISHED]" iptables -A OUTPUT -m state --state RELATED -j LOG --log-prefix "[OUTPUT RELATED]" iptables -A OUTPUT -m state --state ESTABLISHED, RELATED -j ACCEPT
- 위조된 TCP SYN 패킷을 차단
- 상태 유형
- 확장 모듈
- connlimit 모듈
- 개요
- 동일한 ip 대역에 대한 동시 연결 개수 제한 모듈
- 디도스 공격에 효과적 대응
- 주요옵션
--connlimit-above n
: n을 초과하는 동시 연결을 제한--connlimit-mask mask
: 0~32 범위의 mask 값을 지정, IP 대역에 대한 동시 연결 제한
- 예시
- 웹서버 80 포트에 대한 TCP SYN Flooding 공격 대응룰
- TCP 80포트에 동일 src IP 로 동시연결개수가 5개 초과시 이를 차단
- 로그 저장 위치 :
/var/log/messages
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 5 -j LOG --log-prefix "[CONNLIMIT]" iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 5 -j DROP
- 웹서버 (80/tcp) 에 대한 TCP SYN Flooding 공격에 대응하기 위한 룰 설정
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]" iptables -A
- 웹서버 80 포트에 대한 TCP SYN Flooding 공격 대응룰
- 개요
- limit 모듈
- 룰에 매치되는 비율을 제한
- connlimit 모듈
댓글남기기