리눅스 iptables 개념 및 명령어
2020, Sep 04
기본 개념
- iptables는 라눅스상에서 방화벽을 설정하는 도구이다.
- netfilter 패킷 필터링 기능을 사용자 공간에서 제어한다.
체인 (Chain)
- 체인의 종류에는 총 3개가 있으며 INPUT, OUTPUT, FORWORD가 있다.
- INPUT : 호스트 컴퓨터를 향해 들어오는 모든 패킷
- OUTPUT : 호스트 컴퓨터에서 발생해서 나가는 모든 패킷
- FORWARD : 호스트 컴퓨터가 목적지가 아닌 모든 패킷, 라우터로 사용되는 호스트 컴퓨터를 통과하는 패킷
매치 (Match)
패킷을 처리할 때 만족해야 하는 조건, 이 조건들을 만족하는 패킷들만 규칙을 적용함.
- -source (-s) : 출발지 IP주소나 네트워크와의 매칭
- -destination (-d) : 목적지 ip주소나 네트워크와의 매칭
- -protocol (-p) : 특정 프로토콜과의 매칭
- -in-interface (i) : 입력 인터페이스
- -out-interface (-o) : 출력 인터페이스
- -state : 연결 상태와의 매칭
- -string : 애플리케이션 계층 데이터 바이트 순서와의 매칭
- -comment : 커널 메모리 내의 규칙과 연계되는 최대 256바이트 주석
- -syn (-y) : SYN 패킷을 허용하지 않음
- -fragment (-f) : 두 번째 이후의 조각에 대해서 규칙을 명시
- -table (-t) : 처리될 테이블
- -jump (-j) : 규칙에 맞는 패킷을 어떻게 처리할 것인가를 명시
- -match (-m) : 특정 모듈과의 매치
타겟 (Target)
패킷 규칙과 일정할 때 타겟을 지원
- ACCEPT : 패킷을 받아들임
- DROP : 패킷을 버림 (패킷이 전송된 적이 없던 것처럼)
- DROP은 서비스에 접속하려는 사용자의 액세스를 거부하고 어떠한 경고 메시지도 보여주지 않은 채 패킷을 DROP 한다.
- REJECT : 패킷을 버리고 이와 동시에 적절한 응답 패킷을 전송
- REJECT는 서비스에 접속하려는 사용자의 액세스를 거부하고 오류 메시지를 보여준다.
- LOG : 패킷을 syslog에 기록
- RETURN : 호출 체인 내에서 패킷 처리를 계속 진행
연결 추적(Connection Tracking)
서비스 연결 상태에 따라서 그 연결을 감시하고 제한
- NEW : 새로운 연결을 요청하는 패킷, 예, HTTP 요청
- ESTABLISHED : 기존 연결의 일부인 패킷
- RELATED : 기존 연결에 속하지만 새로운 연결을 요청하는 패킷, 예를 들면 접속 포트가 20인 수동 FTP의 경우 전송 포트는 사용되지 않은 1024 이상의 어느 포트라도 사용 가능
- INVALID : 연결 추적표에서 어디 연결에도 속하지 않은 패킷
명령어 (Commend)
- A (–append) : 새로운 규칙을 추가
- D (–delete) : 규칙을 삭제
- C (–check) : 패킷을 테스트
- R (–replace) : 새로운 규칙으로 교체
- I (–insert) : 새로운 규칙을 삽입
- L (–list) : 규칙을 출력
- F (–flush) : chain으로부터 규칙을 모두 삭제
- Z (–zero) : 모든 chain의 패킷과 바이트 카운터 값을 0으로 초기화
- N (–new) : 새로운 chain을 만듦
- X (–delete-chain) : chain을 삭제
- P (–policy) : 기본정책을 변경
iptable 적용 내용 출력
iptables -nvL
iptable의 기본 설정 내용 (CentOS Minamal 기준)
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited // 모든 패킷을 reject
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
기본 설정
1.기본 정책을 ACCEPT로 변경 (변경하면 이후에 사용하는 명령어는 기본 정책이 ACCEPT 기준)
iptables -P INPUT ACCEPT
2.체인에 정의된 모든 규칙을 삭제
iptables -F
3.INPUT 체인에 로컬호스트 인터페이스에 들어오는 모든 패킷을 허용
iptables -A INPUT -i lo -j ACCEPT
4.INPUT Chain에 state 모듈과 매치되는 연결상태가 ESTABLISHED, RELATED인 패킷에 대해 허용 추가
iptables -A INPUT -m state --state ESTABLISHED, RELATED -j ACCEPT
5.INPUT 체인에 프로토콜이 tcp이며 목적지 포트가 22번인 패킷에 대해 허용 추가
iptables -A INPUT -p tcp -m tcp ---dport 22 -j ACCEPT
6.INPUT 체인에 대한 기본 정책을 DROP으로 변경
iptables -P INPUT DROP
7.FORWARD 체인에 대한 기본정책을 DROP으로 변경
iptables -P FORWORD DROP
8.설정한 것을 저장 (iptables-service 패키지 설치가 필요할 수 있음)
service iptables save