4 포트 스캐너 (Port Scanner)
서버나 호스트의 열린 포트(Open Ports)를 조사할 수 있는 포트 스캐너 앱을 만들어 봅시다. 네트워크가 어떻게 작동하는지, 포트를 어떻게 스캔하고 분류하는지에 대한 기술적 지식이 필요합니다.
이 프로젝트는 네트워크 보안과 시스템 관리의 기초를 익히기에 아주 좋습니다. 특히 특정 IP 주소에 대해 어떤 서비스(HTTP, FTP, SSH 등)가 활성화되어 있는지 확인하는 과정을 직접 설계해 보세요.
4.1 주요 개발 포인트
- TCP/UDP 포트 스캔: 소켓 연결을 시도하여 특정 포트가 열려 있는지 확인합니다.
- 다중 포트 동시 스캔 (Multi-threading):
threading이나asyncio를 활용하여 수천 개의 포트를 빠르게 스캔합니다. - 서비스 배너 그래빙 (Banner Grabbing): 열린 포트에서 응답하는 메시지를 분석하여 사용 중인 소프트웨어 정보를 파악합니다.
- 포트 분류 및 상태 판별: ‘열림(Open)’, ‘닫힘(Closed)’, ’필터링됨(Filtered)’으로 포트 상태를 구분합니다.
- 사용자 인터페이스 (GUI): 대상 IP 주소와 포트 범위를 입력하고 스캔 결과를 표로 보여주는 UI를 구축합니다.
4.2 Python 구현 예시 (간단한 소켓 기반 포트 스캔 로직)
import socket
def scan_port(host, port):
"""
대상 호스트의 특정 포트에 접속을 시도하여 열려 있는지 확인합니다.
"""
try:
# AF_INET: IPv4, SOCK_STREAM: TCP
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(1) # 1초 타임아웃 설정
# 연결 시도
result = s.connect_ex((host, port))
if result == 0:
print(f"포트 {port}번: 열림 (OPEN)")
return True
else:
# print(f"포트 {port}번: 닫힘 (CLOSED)")
return False
s.close()
except Exception as e:
print(f"오류 발생: {e}")
return False
if __name__ == "__main__":
target_host = "127.0.0.1" # 로컬 호스트 테스트
ports_to_scan = [80, 443, 8080, 22, 21] # 주요 포트들
print(f"'{target_host}' 호스트의 포트 스캔을 시작합니다...")
for p in ports_to_scan:
scan_port(target_host, p)
print("\n스캔이 완료되었습니다.")