ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 3장
    침입차단시스템 2016. 4. 13. 19:04

    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
Designed by Tistory.