Nmap Shot은 Nmap 스캔을 실행하고 그 결과를 XML 형태로 반환하는 Go 기반의 REST API 서비스입니다. 지정된 타겟과 포트에 대해 스캔을 수행하며, 보안을 위한 API 키 인증 및 허용 포트 설정 기능을 제공합니다.
- Nmap 스캔 실행:
/api/v1/scan엔드포인트를 통해 Nmap 스캔을 수행합니다. (최대 5분 타임아웃 적용) - XML 결과 반환: 스캔 결과를 원시 Nmap XML 형식으로 반환합니다.
- API 키 인증:
X-API-Key헤더를 통해 모든 스캔 요청을 안전하게 보호합니다. - 허용 포트 제어: 환경 변수를 통해 스캔 가능한 포트 또는 포트 범위를 제한할 수 있습니다.
- Swagger API 문서:
/docs또는/swagger엔드포인트를 통해 API 명세서를 확인할 수 있습니다.
- Go 1.x 이상
- 시스템에 Nmap 프로그램이 설치되어 있어야 합니다.
- Ubuntu/Debian:
sudo apt install nmap - macOS:
brew install nmap - CentOS/RHEL:
sudo yum install nmap
- Ubuntu/Debian:
서비스를 실행하기 전에 다음 환경 변수들을 설정할 수 있습니다. .env 파일을 생성하거나 직접 환경 변수를 설정하여 적용합니다.
| 환경 변수 | 설명 | 기본값 | 예시 |
|---|---|---|---|
API_KEY |
(필수) API 요청 시 사용할 인증 키입니다. 설정되지 않으면 서버가 500 에러를 반환합니다. | 없음 | my-secret-key |
ALLOWED_PORTS |
스캔을 허용할 포트 목록입니다. 단일 포트 및 -를 이용한 범위 지정이 가능합니다. 지정한 범위를 벗어난 포트 스캔을 요청하면 거부됩니다. |
1-65535 |
80,443,1000-2000 |
REST_API_PORT |
REST API 서버를 노출할 포트 번호입니다. | 8082 |
8082 |
API_KEY=your-secret-key
ALLOWED_PORTS=80,443,8080-8090
REST_API_PORT=8082# 종속성 다운로드
go mod tidy
# 서버 실행 (자동으로 .env 참조)
go run main.go서버는 기본적으로 :8082 포트에서 실행됩니다.
- Header:
X-API-Key: {API_KEY} - Content-Type:
application/json
요청 (Request Body):
{
"targets": ["127.0.0.1", "scanme.nmap.org"],
"ports": ["80", "443"]
}응답 (Response):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE nmaprun>
<?xml-stylesheet href="file:///usr/bin/../share/nmap/nmap.xsl" type="text/xsl"?>
<nmaprun scanner="nmap" args="nmap -p 80,443 127.0.0.1" ...>
<!-- Nmap scan results in XML -->
</nmaprun>브라우저에서 http://localhost:8082/docs에 접속하여 Swagger UI를 통해 API 문서를 확인하고 직접 테스트해 볼 수 있습니다.
400 Bad Request: 요청 JSON 형식이 잘못되었거나, 타겟이 없거나,ALLOWED_PORTS에 허용되지 않은 포트 스캔을 시도한 경우401 Unauthorized: API 요청 헤더에X-API-Key가 없는 경우403 Forbidden: 제공된 API 키가 서버의API_KEY와 일치하지 않는 경우499 Client Closed Request: 클라이언트가 요청을 취소한 경우500 Internal Server Error: 서버에 API 키가 설정되지 않았거나 Nmap 실행 중 오류가 발생한 경우504 Gateway Timeout: Nmap 스캔이 5분 이상 소요되어 타임아웃된 경우