라이브러리
프로그래밍언어, 각종코드, 관련동향, 논문 등의 저장소
OpenBSD와 pf(Packet Filter)를 이용한 PC 방화벽 구성

OpenBSD와 pf(Packet Filter)를 이용한 PC 방화벽 구성

 

 

IPv6 서비스를 제공하거나 이용하는 과정에서 OS에서 제공하는 단말 수준의 방화벽뿐만 아니라, 네트워크 전체를 보호하기 위한 별도의 방화벽의 필요성이 제기되고 있다. 특히, 상용방화벽중 IPv6를 지원하는 방화벽은 2004년부터 출시되기 시작하였으나, 그 수가 매우 적은 실정이다.

 

따라서, 본 문서에서는 OpenBSD와 PF(Packet Filter) 소프트웨어를 이용하여 IPv6 지원 PC 방화벽을 구성하는 방법을 간단하게 설명하고자 한다.

 

 

1. 필요 요소

 

OpenBSD에서 방화벽을 구성하기 위해서는 2개 이상의 네트워크 인터페이스가 필요하다. 만약 라우터(router) 기반의 방화벽을 구성할 경우 2개의 인터페이스(랜카드)만 필요하며, 브릿지(bridge) 형태의 방화벽을 구성할 경우 3개의 네트워크 인터페이스가 있으면 편리하다.

 

라우터 형태로 방화벽을 구성할 경우 네트워크 구성에 일부 변경이 필요하기 때문에,본 문서에서는 기존 IPv6 네트워크의 구성을 변경하지 않고 IPv6 방화벽을 적용하기 위해 브릿지(bridge) 형태의 IPv6 방화벽을 구성한다.특히 브릿지 형태의 경우 외부에서는 IPv6 방화벽 존재 자체가 드러나지 않기 때문에 보안상 더욱 유리하다.

 

브릿지 모드에서는 2개의 네트워크 인터페이스는 In-bound, Out-bound 경로로 이용되며, 나머지 1개의 네트워크 인터페이스는 원격 관리용도로 이용할 수 있다. 만약 원격 관리를 하지 않고 시리얼 포트 또는 로컬 콘솔에서 관리를 한다면 2개의 네트워크 인터페이스만 있어도 된다.

 

최소 하드웨어 요구사항

 

  • 133MHz or higher x86 class processor
  • 64 MB of RAM
  • 1 GB hard drive
  • 2 NICs ( 인텔 또는 3COM 랜카드 권장, 본 문서에서는 Intel 10/100 랜카드 이용 )
  • OpenBSD 3.6 or higher ( 현재 버전은 3.7 )

     

    아래 그림처럼 OpenBSD를 이용한 브릿지 형태의 방화벽은 라우터와 라우터 사이 또는 라우터와 스위치 사이에 위치하며, 브릿지를 통과하는 패킷을 통제한다.

     

    사용자 삽입 이미지

     

    2. OpenBSD 설치

     

    OpenBSD 웹사이트의 문서를 참고 하여 OpenBSD를 설치한다.

    참고 문서 ::http://www.openbsd.org/faq/faq4.html

    참고 문서 :: OpenBSD_install [다운로드]

     

    ** 어떤 소프트웨어 패키지를 선택해야 할지 잘 모를 경우 전체 설치를 선택함

     

    설치과정에서 OS 파티션 및 네트워크 인터페이스 설정이 끝난 뒤 쉘 프롬프트가 나타나면 브릿지 인터페이스를 구성할 수 있다.

     

     

    3. 브릿지 인터페이스 구성

     

    OpenBSD의 브릿지는 OSI 7 Layer 중 Layer 2 계층에서 동작을 하며, 동시에 브릿지를 통과하는 패킷의 Layer 3, Layer 4 데이터를 필터링 할 수 있다.

     

    우선, 브릿지 구성을 위해 양 네트워크 인터페이스(Inbound, Outbound) 사이트의 IP 패킷 포워딩을 가능하게 해야 한다. OpenBSD의/etc/sysctl.conf파일의 내용 중 'net.inet.ip.forwarding=1' 항목과 'net.inet6.ip6.forwarding=1' 항목의 주석을 제거한다.

     

    변경 전 :: #net.inet.ip.forwarding=1

                   #net.inet.ip6.forwarding=1  

         

    변경 후 :: net.inet.ip.forwarding=1   ( 주석 제거 )

                   net.inet6.ip6.forwarding=1  ( 주석 제거 )

     

    다음으로 두 개의 네트워크 인터페이스를 이용하여 브릿지 인터페이스를 구성해야 한다.

     

    두 개의 네트워크 인터페이스를fxp0fxp1이라고 가정하고 (인텔 NIC의 경우 fxp0, 1, 2 형태의 이름으로 네트워크 인터페이스가 생성되며, 타 NIC의 경우 이름이 다름) 아래와 같은 명령을 실행한다.

     

    # fxp0 인터페이스의 변경 및 시작

       ifconfig fxp0 delete

       echo 'up' > /etc/hostname.fxp0

     

    # fxp1 인터페이스의 변경 및 시작

       ifconfig fxp1 delete

       echo 'up' > /etc/hostname.fxp1

     

    # 브릿지 인터페이스의 생성 및 시작

       echo 'add fxp0 add fxp1 up' > /etc/bridgename.bridge0

     

    ** bridge 설정과 관련하여 위 명령을 실행해도 bridge 인터페이스가 정상적으로 동작하지 않는 경우, 직접 /etc 디렉토리에 bridgename.bridge0 파일을 만들고 아래와 같은 내용을 추가한다.

        add fxp0

        add fxp1

        up

    이제, 시스템을 재시작하고 ifconfig -a 명령 실행 결과를 확인해 보면 아래와 유사한 bridge 인터페이스 정보를 확인할 수 있으며, 브릿지 인터페이스가 정상 동작하고 있음을 알 수 있다.

    bridge0: flags=41<UP,RUNNING> mtu 1500

     

    4. pf 활성화

     

    pf(Packet Filter)는 OpenBSD 3.0부터 제공되는 패킷 필터링 도구이며, 기본 시스템 설정에서는 비활성화되어 있다.

     

    pf를 활성화기 위해서는 /etc/rc.conf 파일을 아래와 같이pf=NO를 pf=YES로 수정한다.

    # set the following to "YES" to turn them on
    rwhod=NO
    nfs_server=NO             # see sysctl.conf for nfs client configuration
    lockd=NO
    amd=NO
    pf=YES                        # Packet filter / NAT
    portmap=NO                # Note: inetd(8) rpc services need portmap too
    inetd=YES                    # almost always needed
    check_quotas=YES        # NO may be desirable in some YP environments
    krb5_master_kdc=NO     # KerberosV master KDC. Run 'info heimdal' for help.
    krb5_slave_kdc=NO       # KerberosV slave KDC.
    afs=NO                        # mount and run afs

    수정후 시스템을 재시작해야지만, pf가 동작한다.

     

    기타 pf 관련 설정항목에는 아래와 같은 것이 있다.

    # miscellaneous other flags
    # only used if the appropriate server is marked YES above
    savecore_flags=                          # "-z" to compress
    ypserv_flags=                             # E.g. -1 for YP v1, -d for DNS etc
    yppasswdd_flags=NO                 # "-d /etc/yp" if passwd files are in /etc/yp
    nfsd_flags="-tun 4"                     # Crank the 4 for a busy NFS fileserver
    amd_dir=/tmp_mnt                      # AMD's mount directory
    amd_master=/etc/amd/master      # AMD 'master' map
    syslogd_flags=                           # add more flags, ie. "-u -a /chroot/dev/log"
    pf_rules=/etc/pf.conf                  # Packet filter rules file
    pflogd_flags=NO                        # add more flags, ie. "-s 256"

    afsd_flags=                                # Flags passed to afsd
    shlib_dirs=                                 # extra directories for ldconfig, separated
                                                     # by space

     

    위 내용에서pf_tule=/etc/pf.conf항목은 pf 규칙을 정의한 파일을 지정하는 항목이며,pflogd_flags=NO는 pf 관련 로그 기록 여부와 관련된 항목이다.

     

     

    5. pf 기본 규칙 정의

     

    pf 관련 패킷 필터링 규칙을/etc/pf.conf파일에 적용하기 이전에, 방화벽 규칙을 정해야 한다. 우선 본 예제에서는 브릿지 모드로 동작하기 때문에, 하나의 인터페이스에 대해서만 방화벽 규칙을 적용하면 된다.

     

    fxp0를 외부 네트워크와 연결된 인터페이스로 가정하고, fxp1을 내부 네트워크와 연결된 인터페이스로 가정한다면, fxp0의 inbound, outbound 트래픽에 대한 규칙을 정의한다.

     

    - 외부에서 들어오는 IPv4/IPv6 패킷중 ssh와 http는 웹서버(1.1.1.2, 2001:aaaa::2)에만 허용

    - 외부에서 들어오는 IPv6 패킷중 ftp는 FTP 서버(2001:aaaa::3)에만 허용

    - 외부에서 들어오는 IPv4 패킷중 DNS Lookup은 DNS 서버(1.1.1.4)에만 허용

    - ICMP, ICMP6는 모두 허용함

    - Loopback 관련 트래픽은 모두 허용함

    - 외부에서 들어오는 IPv6-in-IPv4 터널 패킷은 모두 허용함

    - 내부에서 외부로 나가는 모든 트래픽은 허용함

    - 외부에서 들어오는 모든 트래픽의 상태를 추적함(Keep State)

    - 내부에서 나가는 모든 트래픽의 상태를 추적함(Keep State)

    - Drop된 패킷에 대한 로그를 남김(Log all dropped packet)

     

     

    6. pf.conf 파일의 편집

     

    우선 OS 설치후 /etc/pf.conf 파일을 열어보면 아래와 같다. 간단하게 의미를 파악해 보자.

     

    사용자 삽입 이미지

     

    ext_if="fxp0"항목은 외부 인터페이스를 정의한 것이고,int_if="fxp1"은 내부 인터페이스를 정의한 것이다.

     

    pass in log quick on $ext_if all 의 의미는 $ext_if(fxp0)로 들어오는(in) IPv4 패킷에 대해 로그를 기록하고(log) 이 조건을 만족하면 더 이상 아래부분의 필터링 조건을 확인하지 않고(quick) 바로 통과(pass) 시킨다는 의미이다.

     

    pass out log quick on $ext_if all의 의미는 $ext_if(fxp0)에서 나가는 IPv4 패킷에 대해 로그를 기록하고 이 조건을 만족하면 더 이상 아래부분의 조건을 확인하지 않고 바로 통과 시킨다는 의미다..

     

    pass in log quick inet6 all의 의미는 외부에서 들어오는 모든 inet6, 즉 모든 IPv6 패킷을 통과시킨다는 의미이며, pass out log quick inet6 all 의 의미는 외부로 나가는 모든 IPv6 패킷을 통과시킨다는 의미이다.

     

    이처럼 pf.conf 파일 작성 규칙에 따라 자신이 원하는 패킷을 제어할 수 있다.

     

    구체적인 pf.conf 파일 작성법은관련 문서를 참고 하기 바람

     

     

    6. pf 세부 규칙(rule) 설정

     

    그러면, [5. pf 규칙 정의] 항목에서 설정한 필터링 규칙을 실제 작성하고 시스템에 적용해보자.

     

    /etc/pf.conf 파일에 들어갈 내용

     

    #######################################################################

    ## 브릿지를 중심으로 외부 인터페이스는 fxp0이므로

    $ext_if="fxp0"

     

    ## 브릿지를 중심으로 내부 인터페이스는 fxp1이므로

    $int_if="fxp1"

     

    ##패킷을 정규화 시키기 위해

    scrub in

     

    ## 브릿지 모드에서는 하나의 인터페이스만 통제를 하면 되므로, 외부 인터페이스는 통제를

    ## 하고, 내부 인터페이스는 모두 통과 시킴

    ## (특별하게 inet, inet6을 정의하지 않으면 IPv4, IPv6 모두 해당됨)

    pass in log quick on $int_if all
    pass out log quick on $int_if all keep state

    ## 악의적인 패킷을 걸러내기 위해
    # ipv4
    block in log quick inet proto tcp all flags FS/FS
    block in log quick inet proto tcp all flags /FSRPAU
    # ipv6
    block in log quick inet6 proto tcp all flags FS/FS
    block in log quick inet6 proto tcp all flags /FSRPAU

    ## Loopback 인터페이스(lo0)와 관련된 패킷은 모두 통과
    pass in quick on lo0 all
    pass out quick on lo0 all keep state

    ## ICMP, ICMP6 관련 패킷은 모두 허용
    pass in log quick on $ext_if inet proto icmp from any to any keep state
    pass in log quick on $ext_if inet6 proto icmp6 from any to any keep state

    ## 만약 ICMP6 관련 패킷을 모두 차단하면, IPv6 네트워크 동작에 문제가 발생할 수 있다.
    ## 예) RA 메시지를 못받는 경우

    ## 외부에서 들어오는 IPv4/IPv6 패킷중 ssh와 http는 웹서버(1.1.1.2, 2001:aaaa::2)에만 허용
    pass in log quick on $ext_if inet proto tcp from any to 1.1.1.2  port { 22, 80 } keep state

    pass in log quick on $ext_if inet6 proto tcp from any to 2001:aaaa::2  port { 22, 80 } keep state

     

    ## 외부에서 들어오는 IPv6 패킷중 ftp는 FTP 서버(2001:aaaa::3)에만 허용

    pass in log quick on $ext_if inet6 proto tcp from any to 2001:aaaa::3  port 21 keep state

     

    ## 외부에서 들어오는 IPv4 패킷중 DNS Lookup은 DNS 서버(1.1.1.4)에만 허용

    pass in log quick on $ext_if inet proto tcp from any to 1.1.1.4 port 53 keep state

    pass in log quick on $ext_if inet proto udp from any to 1.1.1.4 port 53 keep state

     

    ## 외부에서 들어오는 IPv6-in-IPv4 터널 패킷은 모두 허용함
    pass in log quick on $ext_if inet proto 41 from any to any keep state

     

    ## 외부에서 들어오는 모든 트래픽의 상태를 추적함(Keep State)

    ## 내부에서 나가는 모든 트래픽의 상태를 추적함(Keep State)
    block in log quick on $ext_if inet all
    pass out log quick on $ext_if inet all keep state
    block  in log quick on $ext_if inet6 all
    pass out log quick on $ext_if inet6 all keep state

     

    #######################################################################

     

     

    7. 테스트

     

    pf 관련 설정이 제대로 적용되고 있는지, pf 기능이 정상동작하고 있는지 확인하기 위해서는pfctl명령을 이용한다.[pfctl 참고 사이트]

     

    pf.conf 파일의 로딩 :: pfctl -f /etc/pf.conf

    pf 기능의 시작 :: pfctl -e

    pf 기능의 중지 :: pfctl -d

    pf 룰셋(규칙) 보기 :: pfctl -s rule

    pf 관련 통계보기 :: pfctl -sa

     

    또한, tcpdump를 이용하여 pf의 동작상태를 확인할 수 있다.

     

    tcpdump -i pflog0

     

     

    이상으로 pf를 이용한 IPv6 방화벽 구성에 대해 아주 간단히 알아 보았다. 위 내용은 오직 예제이며, 실제 사이트에 적용하기 위해서는 보다 구체적이고 정밀한 방화벽 룰 설정이 필요할 것이다.

     

    보다 상세한 내용은 아래 참고문서를 참고 하기 바란다.

     

     

    참고문서

    - Daemon News  HOWTO Transparent Packet Filtering with OpenBSD [다운로드]

    - Firewalling IPv6 with OpenBSD's pf (packet filter) [다운로드]

    - OpenBSD_install [다운로드]

    - OpenBSD Resources  how-to  invisible_firewall [다운로드]

     

  •   Comments,     Trackbacks