티스토리 뷰

스프링 기반의 패킷캡쳐 앱을 toy project 삼아 만드려고 한다. 

괜찮은 pCap 라이브러리가 어떤 것이 있나 좀 찾아봤는데, 처음에는 pCap4j를 사용하려고 했으나 튜토리얼이 너무 적은 거 같이 jNetPcap으로 우선 적응해보려 한다.

 

jNetPcap 라이브러리를 적용하는게 생각보다 까다로워서... 조금 헤매긴 했는데, 방법을 정리하자면 다음과 같다.

 

우선 windows 환경에서 jNetPcap을 사용하려면, WinPcap을 먼저 설치해줘야 한다. 

 

아래 링크로 접속하여 exe 파일을 받아 실행해주자.

https://www.winpcap.org/install/default.htm

 

WinPcap · Download

WinPcap Has Ceased Development. We recommend Npcap. The WinPcap project has ceased development and WinPcap and WinDump are no longer maintained. WE RECOMMEND USING Npcap INSTEAD. If you do insist upon using WinPcap, be aware that its installer Uses NDIS 5.

www.winpcap.org

 

jNetPcap이 Maven Dependency에 gradle이 올라온 게 있긴했는데, 이거 하나만 띡 dependency에 추가하니 영... 적용이 안되어서 아래 링크에서 직접 파일을 받아줬다.

https://sourceforge.net/projects/jnetpcap/

 

jNetPcap - Libpcap/WinPcap Java Wrapper

Download jNetPcap - Libpcap/WinPcap Java Wrapper for free. A java PCAP and DPI library. A java wrapper for popular "libpcap" and "WinPcap" libraries. Accurate full API translation.

sourceforge.net

 

jNetPcap을 받아서 압축을 풀어보면, jnetpcap.dll와 jnetpcap-pcap100.dll 파일이 존재하는데, 이 두 파일은 C:\Windows\System32 디렉토리에 복사해줘야 한다.

 

이후 프로젝트 WEB-INF-lib 에 jnetpcap.dll & jnetpcap.jar 파일을 옮겨주고, Project Structure 에서 외부 라이브러리를 적용시켜주기만 하면 셋팅은 끝이 난다. 

 

이제 스프링 환경에서 간단한 예제 코드를 한번 돌려보자.

 

◎PacketExServiceImpl.java

package com.toy.packet_capture.service;

import org.jnetpcap.Pcap;
import org.jnetpcap.PcapIf;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;


@Service
public class PacketExServiceImpl implements PacketExService {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Override
    public void listeningNet() {
        ArrayList<PcapIf> allDevs = new ArrayList<PcapIf>();

        StringBuilder errBuf = new StringBuilder();

        int r = Pcap.findAllDevs(allDevs, errBuf);

        if(r == Pcap.NOT_OK || allDevs.isEmpty()) {
            logger.error("네트워크 장치 찾기 실패" + errBuf.toString());
            return;
        }

        logger.info("네트워크 Device");

        int i = 0;

        for (PcapIf device : allDevs) {
            String description = (device.getDescription() != null) ? device.getDescription() : "장비에 대한 설명이 없습니다.";

            logger.info(++i +"번: " + device.getName() + "[" + device.getDescription() + "]");
        }
    }
}

 

 

반응형
Comments