-
1. iptables 소개
- iptables 방화벽은 넷필터 프로젝트에서 개발되었으며, 2001년 1월 리눅스 2.4 커널 배포 시점부터 리눅스의 일부분으로 제공된다.
- 시간이 지나면서 iptables는 상용방화벽에서 찾아 볼 수 있는 기능의 대부분을 가진 방화벽으로 발전했다.( 광범위한 프로토콜 상태 추적, 패킷 어플리케이션 계층 검사, 속도 제한, 필터링 정책 등)
- 사용자는 iptables 방화벽을 이용해서 리눅스 시스템과 연동하는 IP 패킷에 대해 강력한 제어 기능을 갖출 수 있다. (이러한 제어는 리눅스 커널 내부에서 구현된다.)
- 때로는 커널 옵션에 따라 netfilter에서 제공하는 기능 중 일부 기능은 동작하지 않을 수도 있기 때문에 커널 옵션이 방화벽으로 이용하기에 적합하도록 최적화 되어 있는지 확인도 필요하다.
#sysctl -a | grep netfilter (커널 옵션 중 netfilter 관련 사항 확인)
- iptables의 가장 주된 기능은 패킷 필터링이라고 할 수 있다.
- 강력한 트래픽 경찰처럼 동작하는 iptables를 이용해서 정책을 생성하면 통과하면 안되는 패킷은 버리는 반면, 검열을 통과한 패킷은 목적지로 전송 된다.
2. iptables 기본 용어
1) 테이블(table)
- iptables에서 테이블은 패킷 필터링이나 네트워크 주소 변환(NAT)과 같은 iptables에서 제공하는 기능의 큰 범주를 기술하는 말로서 "iptables의 구성 요소" 정도의 의미로 이해하자.
- 쉽게 표현하자면 iptables에서 테이블은 iptables의 기능을 큰 범주로 구분해놓은 것이며, iptables의 테이블은 "filter", "nat", "mangle", "raw" 테이블이 있다.
- filter 테이블 : 필터링 규칙 적용
=> 방화벽의 가장 핵심적인 테이블로서 특정 룰에 따라 패킷을 필터링 하거나 허용하는 역할을 함
=> filter 테이블에는 기본적으로 3개의 chain이 있음
- nat 테이블 : NAT(주소변환) 규칙 적용
=> 패킷을 필터링 하는 기능은 없음
=> 방화벽으로 향하는 패킷을 방화벽이 보호하는 내부 네트워크의 다른 주소로 포워딩
=> 방화벽 내부 네트워크에서 방화벽을 통해 외부 네트워크로 나갈 때 다른 ip주소로 변환하는 역할을 함
- mangle 테이블 : 패킷 데이터를 변경하는 특수 규칙 적용
=> 그리 자주 사용되지는 않음
=> 패킷의 TTL이나 TOS(type of service : 패킷전송의 우선순위)값을 변경하거나 매칭할 때 사용
- raw 테이블 : raw 테이블은 넷필터의 연결추적(connection tracking) 시스템과는 독립적으로 동작해야 하는 정책을 적용하고자 할 때 사용하며 NOTRACK 타깃(target)과 함께 사용
2) 체인(chain)
- 패킷이 이동하는 경로를 나타낸다.
- 각각의 table은 각각의 다른 chain을 가지고 있다. (사용자는 공통 태그와 관련된 규칙집합을 만들기 위한 사용자 정의 체인을 생성할 수 있음.)
- rule은 각각의 chain에 설정하는 일련의 방화벽 정책을 말한다.
- 좀 더 견고한 iptables 설치를 위해 필요한 두 개의 추가 체인으로 nat 테이블의 PREROUTING과 POSTROUTING 체인이 있다. (이 체인은 커널 내부에서 IP 라이팅 계산을 수행하기 전과 후에 패킷 헤더를 수정하기 위해 사용한다.)
- 패킷 필터링에서 가장 중요한 고유 체인은 filter 테이블의 INPUT, OUTPUT, FORWARD 체인이다.
=> INPUT 체인 : 커널 내부에서 라우팅 계산을 마친 후 로컬 리눅스 시스템이 목적지인 패킷(즉, 방화벽 자체가 목적지인)에 적용
=> OUTPUT 체인 : 리눅스 시스템 자체가 생성하는 패킷을 위해 예약. (즉 방화벽자체에서 외부로 나가는 패킷)
=> FORWARD 체인 : 리눅스 시스템을 통과하는 패킷을 관리.(즉, 한 네트워크를 다른 네트워크와 연결하기 위해 iptables 방화벽을 사용해서 두 네트워크 간의 패킷이 방화벽을 통과해야 하는 경우.)
3) 매치(Match)
4) 타깃(targe)
- iptables에서의 타깃은 패킷이 조건으로 설정한 규칙과 일치 할 때 수행하는 동작이다.
- 여기에서 "규칙과 일치한다"의 의미는 매치(match)에 설정된 모든 내용이 일치한다는 의미이며, "수행하는 동작"의 의미는 패킷을 허용하여 주거나 차단하여 주는 것과 같이 패킷이 iptables에서 처리될 최종 행위이다.
- 실제로 상용 방화벽에서는 타깃이라는 요어를 쓰지 않고 액션이라는 용어를 사용하기도 한다.
3. iptables 기본 사용법
1) iptables 기본 옵션
- iptables 의 버전을 확인 : -V
#iptables -V
- 현재 iptables에 적용된 정책을 확인
#iptables -L
- 특정(지정) 체인에 적용된 정책을 확인 : -L [체인명]
#iptables -L INPUT : INPUT 체인의 정책만 출력
#iptables -L OUTPUT : OUTPUT 체인의 정책만 출력
#iptables -L FORWARD : FORWARD 체인의 정책만 출력
- [돌발 퀴즈] PREROUTING 체인과 POSTROUTING 체인에 설정된 정책을 각각 출력하는 명령어를 실행해 보시오.
#iptables -t nat -L PREROUTING
#iptables -t nat -L POSTROUTING
- iptables에서 옵션으로 특정한 테이블을 지정하지 않은 경우에는 기본적으로 filter 테이블이 사용된다.
- "iptables -L INPUT"의 실행 결과는 특별히 테이블을 지정하여 주지는 않았지만 filter 테이블이 사용되어 사실상 "iptables -t filter -L INPUT"의 명령어를 실행한 것과 동일하게 수행된다.
- 즉 두 명령어는 모두 filter 테이블의 INPUT 체인의 정책을 출력하는 명령을 실행한 것이다.
- 돌발 퀴즈에서 "iptables -L PREROUTING", "iptables -L POSTROUTING" 명령에는 테이블을 지정해 주는 옵션이 없기 때문에 기본적으로 사용하는 filter 테이블에서 동작하게 되는데 PREROUTING 체인과 POSTROUTING 체인은 filter 테이블에는 없는 체인이기 때문에 찾지 못한다는 메시지가 나오는 것이다.
- 특정 테이블 선택(지정) : -t [테이블명]
#iptables -L -t nat : nat 테이블의 현재 정책을 출력
- 특정 테이블, 특정 체인의 정책 확인 : -t [테이블명] -L [체인명]
#iptables -t nat -L PREROUTING : nat 테이블의 PREROUTING 체인 정책 내용을 화면에 출력
#iptables -t nat -L POSTROUTING : nat 테이블의 POSTROUTING 체인 정책 내용을 화면에 출력
◈ firewalld 중지
#iptables -L
#systemctl stop firewalld.service
#iptables -L
- 기존에 설정되어 있는 정책(내용) 삭제(flush) : -F
#systemctl stop firewalld.service : firewalld 정지
#iptables -L : 현재 설정되어 있는 정책 확인
#iptables -F : 현재 설정되어 있는 정책 삭제
#iptables -L : 현재 설정되어 있는 정책 확인
#systemctl stop firewalld.service : lokkit 사용을 위해서 firewalld 중지
#lokkit --disabled : iptables 비활성
#lokkit --enabled : iptables 활정(iptables 기본 정책 재 적용)
#iptables -L
#iptables -F INPUT : INPUT 체인의 정책만 삭제
#iptables -L
- 새로운 체인 생성 : -N [체인명]
#iptables -L
#iptables -N test : test 체인 생성
#iptables -L
- (사용자 정의) 체인 삭제(delete chain) : -X [체인]
#iptables -X test : test 체인 삭제
- 체인의 기본 정책(policy) 설정 : -P [체인명] [ACCEPT/DROP]
#iptables -F
#iptables -L
#iptables -P INPUT DROP : INPUT 체인 기본 정책을 DROP
#iptables -P OUTPUT DROP : OUTPUT 체인 기본 정책을 DROP
#iptables -P FORWARD DROP : FORWARD 체인 기본 정책을 DROP
#iptables -L
◈ 방화벽 정책 설정 시 중요 포인트(잘못 설정하면 장애가 발생할 수 있는 포인트)
1) 정책 방향의 오류
2) 정책 순서의 오류
3) 객체 생성의 오류
4) 액션(타깃) 설정의 오류
5) 정책 내용 설정의 오류
◈ 방화벽 정책은
모두 차단 후 필요에 따라 허용 정책 추가(white list) 권장
ex) 홈페이지에 파일 업로드 정책을 설정하는 경우
A : exe, asp, php, jsp 파일만 업로드 차단.(black list)
B : jpg, gif 파일만 업로드 허용하고, 그 외 모든 파일 차단.(white list)
◈ iptables 초기 정책 스크립트 작성
#vi fwstart.sh
1 #! /bin/sh
2 systemctl stop firewalld.service
3 lokkit --enabled
4 iptables -F
5 iptables -P INPUT DROP
6 iptables -P OUTPUT DROP
7 iptables -P FORWARD DROP
#sh fwstart.sh
- 체인에 새로운 정책 추가 : -A [체인] [매치] [타깃]
(기존 정책의 하단에 추가 됨)
- 프로토콜 지정 : -p [프로토콜 : tcp / udp / icmp 등]
#iptables -A INPUT -p icmp -j ACCEPT
◈ 실습 1
- iptables 의 기본 정책 적용 (lokkit --enabled)
- 윈도우에서 cmd창을 3개 open
- 각 cmd창에서
>ping fw-eth0-ip -t (ping 192.168.0.250 -t)
>ping fw-eth1-ip -t (ping 192.168.230.100 -t)
>ping fw-eth2-ip -t (ping 192.168.138.100 -t) 실행
- fwstart.sh 스크립트 적용 후 (모든 체인 정책이 DROP이고 아무 정책도 없는 상태) 이전과 비교
- fwstart.sh 스크립트 실행 후 ping이 되도록 정책을 추가 하기
#iptables -A INPUT -p icmp -j ACCEPT
#iptables -A OUTPUT -p icmp -j ACCEPT
◈ 실습 2
- fwstart.sh 스크립트 실행 후 호스트 PC에서 방화벽으로 SSH 접속이 되도록 정책을 추가하기
#iptables -A INPUT -p ssh -j ACCEPT
#iptables -A OUTPUT -p ssh -j ACCEPT
- 체인에 새로운 정책 추가 2 : -I [체인] [매치] [타깃]
(기존 정책의 상단에 추가 됨.)
#iptables -I INPUT -p icmp -j DROP
- 지정한 위치에 정책 추가 : -I [체인] [rule num] [매치] [타깃]
(rule num 위치에 추가 됨.)
#iptables -I INPUT 3 -p udp -j ACCEPT : 정책 3위치에 새로운 정책을 추가
- 체인에 설정된 정책 삭제 : -D [체인] [rule num]
(rule num 위치에 정책을 삭제 함.)
#iptables -D INPUT 2
- D 옵션을 이용하여 정책을 삭제 할 때 주의해야 할 점은 정책이 삭제되거나 새로 추가 되는 경우에는 해당 정책의 [rule num]이 상대적으로 변한다는 점에 유의해야 한다.
'침입차단시스템' 카테고리의 다른 글
iptables FORWARD 체인 (0) 2016.04.26 방화벽 정책 설정 시 중요사항 (0) 2016.04.19 iptables 복습 (0) 2016.04.19 2장 (0) 2016.04.13 1장 (0) 2016.04.13