pfSense를 이용한 OpenVPN-p2p

이번에는 pfSense를 이용하여 두개(혹은 2개이상)의 사이트를 VPN 터널을 이용하여 연결하는 과정을 알아보도록 하겠다.

아래처럼 Site A와B를 연결하여 사설망인 192.168.100.0 네트워크와 192.168.200.0  네트워크를 연결하여

원격지 네트워크의 리소스(프린터,팩스,전화 등등)을 이용하도록 하는 것이다.

아래 설명되는 IP 주소는 아래 그림을 기준으로 한다.

Site A의 pfSense 가 서버 Site B의  pfSense 가 클라이언트가 되어 서로 연동이 되는 과정을 살펴보도록 하자.

OpenVPN 말고도 ipsec등을 이용해서도 연동이 가능하나 일단 가장 간편하게 구성이 가능한  OpenVPN으로 구성해 보도록 하자.

OpenVPN 서버(Site A)

VPN->OpenVPN-> Servers -> Add  를 선택하여 서버를 추가해준다.

일반설정
Server Mode: Peer to Peer(Shared Key)

참고: OpenVPN의 서버모드

  • Peer to Peer (SSL/TLS) – Site to Site 연결모드로 6개 이상의 사이트들을 연동할 때 사용하기를 권장함
  • Peer to Peer(Shared Key) – Site to Site 연결모드로 6개 미만의 사이트들을 공유키를 가지고 연결함.
  • Remote Access (SSL/TLS) – 원격 접속 모드로 인증서를 이용하여 사이트에 연결
  • Remote Access (User Auth) –  원격 접속 모드로 사용자ID와 비번을 이용하여 연결
  • Remote Access (SSL/TLS + User Auth) – 인증서와 사용자 정보를 이용하여 연결

기타 나머지는 그대로 두도록 한다.

암호화 설정

공유키를 생성하도록 하며 여기서 생성된 공유키는  OpenVPN 클라이언트(site B)에서 사용된다.

Shared Key: Checked

아래처럼 shared key가 생성이 된다.

터널설정

Site to Site를 연결하기 위한 설정

IPv4 Tunnel Network: 10.0.0.0/24

* site A와 site B에서 사용하지 않는 네트워크를 하나 생성해서 터널네트워크로 사용한다.

IPv4 Remote Network(s): 192.168.200.0/24 (Site B의 사설망을 적어준다)
Compression: 터널을 통과하는 패킷 압축을 사용할 것인지 여부인데 모르면 그냥 기본값으로 둔다.

Save 를 눌러서 설정을 마친다.

마치고 나서 편집모드로 들어가서  암호화 과정에서 생성한 shared Key를 메모장이나 적당한 곳에 복사해두도록 하자.

이것으로 서버쪽 설정은 모두 마무리 되었다.

 

OpenVPN 클라이언트(Site B)

VPN->OpenVPN->Clients 에 가서 Add를 눌러서 클라이언트를 추가한다.

서버쪽 설정과 동일하게 Server Mode를 선택한다.

Server Mode: Peer to Peer (Shared Key)
Server Host or address: OpenVPN서버의 WAN  IP address 또는 도메인

 

암호화 설정

Auto generate: Uncheck

Shared key: 서버쪽에서 생성된 공유키를 복사해서 그대로 입력한다.(copy & paste)

터널 설정

IPv4 Tunnel Network: 10.0.0.0/24(Site A와 동일하게 적어준다)
IPv4 Remote Network(s): 192.168.100.0/24 (Site A의 사설망을 적어준다)

입력 후  Save 해서 종료한다. 저장 후 VPN->OpenVPN->Clients에 아래와 같이 Client가 추가가 된다.

Site to Site 연결하기

Site A의 pfSense-> Status->OpenVPN 에서 VPN서버 실행확인

Site B의 pfSense-> Status->OpenVPN 에서 VPN Client 실행확인

A와B사이트가 연결이 되면 위처럼 Status up 상태로 되며 에러가 난다면 로그등을 확인해 보도록 하자.

정상적으로 연결이 되었다면 192.168.100.0/24 네트워크와 192.168.200.0/24 네트워크와 통신이 되는 것을 확인할 수 있다.

 

pfSense를 이용한 OpenVPN 서버 구성하기

이 강좌는 OpenVPN을 이용하여 VPN을 구성한다.

VPN은 터널링을 통해서 데이터들이 암호화 되어 전송이 되므로 중간게 패킷을 가로채거나 수정하기가 어렵기 때문에

보호되어야 될 네트워크는 가급적 VPN을 이용하여 엑세스 하는 것이 조금 더 안전하다.

pfSense는 여러가지 VPN구성을 지원한다.(IPsec,L2TP,openVPN)

각각의 장단점들이 있고 구성에 따라서 속도들도 약간씩은 차이가 난다. 상황에 맞게 골라서 사용하면 된다.

나름 비교가 잘되어 있는 사이트를 참고해보도록 하자.(https://ko.vpnmentor.com/blog/vpn-protocol-comparison-pptp-vs-l2tp-vs-openvpn-vs-sstp-vs-ikev2/)

pfSense에서는 정말 간단하게 VPN 서버를 구성할 수 있다.

pfSense가 설치되어 있다고 가정하고 기본적으로 WAN,LAN으로만 구성이 되어있는 환경을 기준으로 구성을 해보도록 한다.

대부분의 경우 VPN을 구성하는 경우 일반적으로 아래처럼 두가지 정도의 형태로 구성을 한다.

  1. 다수의 클라이언트에게 특정 네트워크에  VPN 터널을 이용해서 연결하는 형태
  2. Site to Site(원격 사무소와 메인사무소등을 하나의 네트워크로 연결하는 형태)

 

일단 첫 번째 형태의 원격접속용 OpenVPN서버를 구성해도록 하겠다.

기본 네트워크 구성은 아래와 같다고 가정하고 구성해보도록 하자.

OpenVPN 서버구성하기
pfSense에서 제공해주는 OpenVPN 마법사를 이용해서 간단히 10분 정도만 투자하면 훌륭한 VPN 서버를 구성할 수 있다.

  1. OpenVPN 구성마법사 실행(VPN->OpenVPN->Wizards)
  2. 인증 구성
    (Local database 말고 windows AD,LDAP,RADIUS등을 이용해서 유저인증이 가능하다.)
  3. CA 설치(인증서버)
  4. 서버인증서 추가
  5. OpenVPN 서버 셋업
    대부분은 기본값으로 두고 필요한 정보들만 입력해주면 된다.
    가장 중요한 부분은 터널 설정인데 Tunnel NetworkLocal Network만 잘 설정해주면 된다.
    터널 네트워크는 VPN클라이언트와 VPN서버와 터널로 연결할때 사용할 네트워크 대역이다.
    클라이언트,서버 양쪽 모두 사용하지 않고 있는 사설망으로 잡아주면 된다.
    로컬 네트워크는 VPN 서버를 통해서 접속할 내부 네트워크 대역을 적어주면 된다.
    즉  pfSense 방화벽의  LAN(혹은 추가적인 사설네트워크)를 적어주면 된다.




  6. 방화벽 설정
    자동으로 방화벽룰을 추가하는 부분이며 추가해주지 않는다면 나중에 수동으로 추가해 줘야 한다.
    위의 과정을 마치면 아래와 비슷한 화면을 만나게 될 것이다.
  7. VPN사용자 추가
    pfSense web config-> System->User Manager -> 사용자 추가
    보안을 강화하기 위해서 VPN서버 접속시 SSL/TLS + 사용자ID/PASSWD를 이용해서 접속하게 하는게 좋으므로
    사용자 인증서도 반드시 생성해두도록 한다.(Certificate 체크)
    Descriptive name 에는 사용자를 구분할 수 있는 정보를 넣어주도록 하자.
  8. VPN서버 설정 변경
    서버 인증 방식을 변경해 준다. (VPN->OpenVPN)
    Server Mode를 SSL/TLS+User Auth로 설정해주도록 한다.
  9. OpenVPN export툴 설치
    인증서와 서버 접속 정보를 쉽게 내보내기를 해주는 도구를 설치하도록 한다.
    System->Package Manager-> Available Packages-> Openvpn-client-export


    정상적으로 설치가 되었다면 VPN->OpenVPN메뉴에 아래와 같이 client export 탭이 생겨난다.
  10. VPN클라이언트 내보내기
    VPN->OpenVPN-> Client Export
    각 사용자 별로  인증서와 서버 접속정보(.ovpn) 파일을  PC의 적당한 곳에
    다운로드(Standard Configurations->Archive) 한 다음 압축을 풀어두고
    OpenVPN client를  PC에 설치하고 VPN서버에 접속하면 된다.
    OpenVPN 클라이언트 설치 URL도 링크가 되어 있으니 다운로드 받아서 설치하면 된다.
    필자의 경우 MacOS를 사용중이라 Tunnelblick 과 Viscosity 를 사용 중이다.
    Windows 사용자의 경우에는 Windows installer 버전을 받아서 설치하면 된다.

VPN client를 이용해서 OpenVPN서버에 접속 후 LAN서버와 통신이 된다면 모든 설정이 마무리가 된다.
VPN서버에 접속 후 서버에서 설정한  Tunnel network 가 클라이언트쪽에 생성이 되면 정상적으로 터널링이 된 것이다.

 

 

 

 

 

Suricata를 이용한 IDS/IPS 구축하기

Suricata란?

Suricata is a high performance Network IDS, IPS and Network Security Monitoring engine. Open Source and owned by a community run non-profit foundation, the Open Information Security Foundation (OISF). Suricata is developed by the OISF and its supporting vendors.

대충 요약하자면 OISF에서 개발되어진 고성능의 네트워크IDS,IPS,NSM 엔진이라는 이야기다.
정말 고성능인지는 각자 테스트 해보기를 바란다.
10Gbps트래픽에서 9000개의 룰로 운영되는 suricata IDS 시스템에서 약 4%의 packet drop 만 생기도록 구성한 사례들도 있다.

 

용어정리
*IDS – Intrusion detection system(침입탐지 시스템)
*IPS – Intrusion prevention systems(침입방지 시스템)

사전준비

suricata는 다양한 OS를 지원한다. 필자의 경우 CentOS6 Linux 시스템에 설치하였다.
리눅스를 이용해서 쓸만한 IDS/IPS시스템을 구축해 보도록 하자.
  • OS: CentOS6.6
  • Network Card:2EA 이상(단독 서버에서만 구동한다면 1개여도 상관은 없다)
  •  적절한 사양의 PC 또는 서버(실제 운영해 보면 알겠지만 트래픽에 따라 메모리나 CPU사용이 제법 많이 필요한 경우가 많다)

설치

  1. EPEL repository추가
    rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
    
  2. 소스빌드를 위한 기본 패키지 설치
    yum -y install libpcap libpcap-devel libnet libnet-devel pcre \ pcre-devel gcc gcc-c++ automake autoconf libtool make libyaml \ libyaml-devel zlib zlib-devel file-devel
    

     

     

  3. IPS mode(NFQUEUE) 지원을 위한 패키지 설치
    나중에 다시 설명하겠지만 suricata 를 IPS모드로 동작하는 방법은 리눅스에서는 2가지 방법이 있다.
    Netfilter queue를 이용하는 방식(iptables)과 AF_PACKET를 이용하는 방식이 있다.

    yum -y install libnetfilter_queue libnetfilter_queue-devel \
    libnfnetlink libnfnetlink-devel
  4. Suricata build & install

    wget http://www.openinfosecfoundation.org/download/suricata-2.0.8.tar.gz
    tar -xvzf suricata-2.0.8.tar.gz
    cd suricata-2.0.8
    ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var 
    make 
    make install-full
  5. 기본환경설정 확인 및 수정
    suricata 환경설정 파일은 기본적으로 /etc/suricata/suricata.yaml에 위치하고 있다.
    몇 가지 중요한 부분들을 수정하여 사용하도록 하자

    • host-mode:auto(suricata가 설치된 호스트를 IDS 모드 또는 IPS 모드로 사용할 것인지 지정한다)

      침입탐지용으로만 사용한다면 sniffer-only, 침입방지용으로 사용한다면 router로 지정해주면 된다.보통은 그냥 auto모드로 두고 데몬을 구동할 때 옵션으로 설정하는 경우가 많다.

    • pid-file: /var/run/suricata.pid(suricata 데몬의 pid 위치를 지정한다)
    • default-log-dir: /var/log/suricata/ (로그 디렉토리 설정)
    • ouputs: (로그 저장에 관련된 설정들이 들어있다.특히 나중에 mysql같은 데이터베이스에 로그를 남기고자 한다면 barnyard2 를 이용하여 남길 수 있다.이런 경우 unified2 형태로 로그를 남겨야 한다.)
    • drop: (IPS모드로 구동할때 룰에 의해서 drop된 로그를 저장하게 한다.)
    • af-packet: (IPS모드 중 하나인 af-packet 모드로 사용하고자 하는 경우 옵션들이다.)
    • cuda: (nvidia GPU을 이용해서 패킷 처리를 가속하기 위한 옵션이다.)
    • default-rule-path: (룰 파일의 위치를 지정한다.)
    • vars: (suricata 엔진에서 사용할 환경변수들이다. 이 변수들을 이용해서 룰파일에서도 사용한다.)
  6. 테스트 룰 삽입
    vi /etc/suricata/rules/drop.rules
    alert icmp 핑을 날릴호스트의 IP주소 any -> any any (msg:"ALERT test ICMP ping";
     icode:0; itype:8; classtype:trojan-activity; sid:99999998; rev:1;)
    192.168.2.126호스트에서 suricata로 ping 을 날리면 로그에 남는다
    alert icmp 192.168.2.126 any -> any any (msg:"ALERT test ICMP ping";
     icode:0; itype:8; classtype:trojan-activity; sid:99999998; rev:1;)

     

  7. suricata 실행 및 확인
    일단 기본적으로 IDS 모드로 구동해 본다.
    -i 다음에는 패킷들을 처리할 인터페이스를 넣어주도록 한다.

    suricata -c /etc/suricata/suricata.yaml -i eth0

    아래의 init파일을 /etc/init.d/suricata로 복사해두고 데몬 제어를 하는것이 편할 것 이다.
    suricata_init