IT/Python

[Python] 파이썬으로 네트워크 스캐너 구현하기

멋진 선배 2025. 1. 18. 12:00
반응형

오늘은 파이썬을 사용하여 네트워크 스캐너를 구현하는 방법에 대해서 알아보도록 하겠습니다. 네트워크 스캐너는 로컬 네트워크에 연결된 장치를 찾아내고 정보를 수집하는 도구로, 네트워크 관리와 보안 분양에서 매우 유용하게 사용 됩니다.

네트워크 스캐너란?

네트워크 스캐너는 다음과 같은 작업을 수행 합니다. 

  1. 호스트 검색 : 네트워크에 연결된 장치의 IP 주소를 탐지합니다.
  2. 포트 스캐닝 : 각 장치에서 열려 있는 포트를 확인 합니다.
  3. 서비스 탐지 : 열려 있는 포트에서 어떤 서비스가 실행 중인지 파악 합니다.
  4. MAC 주소 수집 : 각 장치의 물리적 주소(MAC 주소)를 수집 합니다.

이러한 기능을 통해 네트워크 관리자는 네트워크의 구조를 파악하고, 잠재적인 보안 취약점을 식별할 수 있습니다.

파이썬으로 네트워크 스케너 구현하기

파이썬은 네트워크 프로그래밍의 매우 적합한 언어 입니다. 'scapy' 라이브러리를 이용하여 네트워크 스캐너를 구현할 것입니다. 'scapy'는 패킷 조작과 네트워크 스캐닝을 위한 강력한 도구 입니다.

1. 필요한 라이브러리 설치

먼저, 'scapy' 라이브러리를 설치해야 합니다. 터미널에서 다음 명령어를 실행하세요.

pip install scapy

2.기본 구조 작성하기

이제 네트워크 스캐너의 기본 구조를 작성해 봅시다.

from scapy.all import ARP, Ether, srp
import sys

def scan(ip):
    # 여기에 스캐닝 로직을 구현할 예정입니다.
    pass

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("사용법: python network_scanner.py <IP>")
        sys.exit(1)
    
    target_ip = sys.argv[1]
    scan(target_ip)

이 코드는 명령줄에서 IP 주소를 입력받아 'scan' 함수를 호출 합니다.

3.ARP 요청 구현하기

ARP(address Resolution Protocol) 요청을 사용하여 네트워크의 장치들을 찾아낼 수 있습니다. 'scan' 함수를 다음과 같이 구현해 봅시다.

def scan(ip):
    arp_request = ARP(pdst=ip)
    broadcast = Ether(dst="ff:ff:ff:ff:ff:ff")
    arp_request_broadcast = broadcast/arp_request
    answered_list = srp(arp_request_broadcast, timeout=1, verbose=False)[0]
    
    devices = []
    for element in answered_list:
        device = {"ip": element[1].psrc, "mac": element[1].hwsrc}
        devices.append(device)
    
    return devices

이 함수는 다음과 같은 작업을 수행합니다.

  1. ARP 요청 패킷을 생성합니다.
  2. 이더넷 브로드캐스트 프레임을 생성합니다.
  3.  ARP 요청을 브로드캐스트합니다.
  4. 응답을 수집하고 IP주소와 MAC 주소를 추출 합니다.

4. 결과 출력하기

스캔 결과를 보기 좋게 출력하는 함수를 추가해 봅시다.

def print_result(devices):
    print("IP\t\t\tMAC Address")
    print("-----------------------------------------")
    for device in devices:
        print(f"{device['ip']}\t\t{device['mac']}")

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("사용법: python network_scanner.py <IP>")
        sys.exit(1)
    
    target_ip = sys.argv[1]
    devices = scan(target_ip)
    print_result(devices)

5.전체 코드

이제 모든 부분을 합쳐 완성된 네트워크 스캐너 코드를 살펴봅시다.

from scapy.all import ARP, Ether, srp
import sys

def scan(ip):
    arp_request = ARP(pdst=ip)
    broadcast = Ether(dst="ff:ff:ff:ff:ff:ff")
    arp_request_broadcast = broadcast/arp_request
    answered_list = srp(arp_request_broadcast, timeout=1, verbose=False)[0]
    
    devices = []
    for element in answered_list:
        device = {"ip": element[1].psrc, "mac": element[1].hwsrc}
        devices.append(device)
    
    return devices

def print_result(devices):
    print("IP\t\t\tMAC Address")
    print("-----------------------------------------")
    for device in devices:
        print(f"{device['ip']}\t\t{device['mac']}")

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("사용법: python network_scanner.py <IP>")
        sys.exit(1)
    
    target_ip = sys.argv[1]
    devices = scan(target_ip)
    print_result(devices)

사용 방법

이 스크립트를 실행하려면 관리자 권한이 필요할 수 있습니다. 다음과 같이 실행하세요.

sudo python network_scanner.py 192.168.1.0/24

여기서 '192.168.1.0/24'는 스캔하려는 네트워크 범위입니다. 여러분의 네트워크에 맞게 조정해 주세요.

주의사항

네트워크 스캐닝은 때에 따라 불법적인 활동으로 간주될 수 있습니다. 항상 자신의 네트워크나 허가 받은 네트워크에서만 사용해야 합니다. 또한 과도한 스캐닝은 네트워크 성능에 영향을 줄 수 있으므로 주의가 필요 합니다.

마무리

이렇게 해서 간단한 네트워크 스캐너를 구현해 보았습니다. 이 도구를 사용하면 로컬 네트워크의 구조를 쉽게 파악할 수 있고, 네트워크 관리와 보안 분석에 큰 도움이 될 것 입니다.

 

더 나아가 포트 스캐닝 기능을 추가하거나, GUI를 구현하여 사용자 친화적인 도구로 발전시킬수도 있습니다. 파이썬의 강력함과 유연성을 활용하여 여러분마느이 고유한 네트워크 도구를 만들어 보는 것은 어떨까요?

 

 

반응형