TCP/UDP 패킷을 수신하여 원본 목적지로 전달하면서 동시에 지정된 여러 목적지로 복제하는 프록시 유틸리티
- TCP/UDP 지원: 두 프로토콜 모두 지원
- 패킷 미러링: 원본 목적지 전달 + 다중 복제 대상으로 동시 전송
- 웹 UI: 다이어그램 기반 노드-엣지 연결로 직관적인 규칙 설정
- 실시간 모니터링: 트래픽 통계 및 연결 상태 확인
- 다크/라이트 테마: 사용자 환경에 맞는 테마 선택
- 다국어 지원: 한국어(기본), 영어 지원
다이어그램 기반 규칙 편집기 - Listen, Target, Mirror 노드를 연결하여 패킷 미러링 규칙 설정
# 메인 프록시 빌드
go build -o packetDup .
# 테스트 유틸리티 빌드
go build -o sender ./cmd/sender
go build -o receiver ./cmd/receiver# 데몬 모드로 시작
./packetDup start
# 데몬 중지
./packetDup stop
# 데몬 상태 확인
./packetDup status
# 포그라운드 실행
./packetDup run
# 옵션과 함께 사용
./packetDup start -config my.yaml -pid /var/run/packetdup.pid -log /var/log/packetdup.log옵션:
| 옵션 | 설명 | 기본값 |
|---|---|---|
-config |
설정 파일 경로 | config.yaml |
-engine |
프록시 엔진 (go/ebpf) | go |
-base-path |
리버스 프록시 base path | (없음) |
-pid |
PID 파일 경로 | packetDup.pid |
-log |
로그 파일 경로 | packetDup.log |
-nginx |
nginx 설정 예시 출력 | - |
실행 후 웹 브라우저에서 http://localhost:8891 접속 (포트는 config.yaml에서 변경 가능)
-
노드 추가: 왼쪽 사이드바에서 노드를 캔버스로 드래그 앤 드롭
- Listen (녹색): 수신 포트 설정
- Target (파란색): 메인 대상 서버
- Mirror (분홍색): 미러링 대상 서버
-
연결 생성: Listen 노드의 출력 포트(오른쪽 원)에서 드래그하여 Target/Mirror 노드의 입력 포트(왼쪽 원)에 연결
-
노드 편집: 더블클릭 또는 우클릭 > Edit
-
규칙 적용: "Apply Rules" 버튼 클릭
-
기타 조작:
- 연결선 클릭: 연결 삭제
- Delete 키: 선택된 노드 삭제
- Clear All: 캔버스 초기화
- Reload: 서버에서 규칙 다시 불러오기
bind_addr: 0.0.0.0 # 바인딩 주소 (0.0.0.0: 모든 인터페이스, 127.0.0.1: 로컬만)
web_port: 8891
base_path: "" # nginx 리버스 프록시 사용 시 설정 (예: /packetdup)
rules:
- id: rule-1
name: HTTP Mirror
enabled: true
protocol: tcp
listen_port: 8000
target: 192.168.1.100:80
mirrors:
- 192.168.1.101:80
- 192.168.1.102:80| Method | Endpoint | 설명 |
|---|---|---|
| GET | /api/rules |
규칙 목록 조회 |
| POST | /api/rules |
규칙 추가 |
| PUT | /api/rules/:id |
규칙 수정 |
| DELETE | /api/rules/:id |
규칙 삭제 |
| POST | /api/rules/:id/toggle |
규칙 활성화/비활성화 |
| GET | /api/stats |
통계 정보 조회 |
지정된 주소로 패킷을 지속적으로 전송하는 유틸리티
./sender [옵션]
옵션:
-proto string 프로토콜: tcp 또는 udp (기본값: tcp)
-addr string 대상 주소 host:port (기본값: 127.0.0.1:8000)
-interval duration 전송 간격 (기본값: 1s)
-msg string 사용자 정의 메시지 (기본값: 자동 생성)
-count int 전송할 패킷 수, 0=무제한 (기본값: 0)
-size int 패킷 크기 바이트 (기본값: 메시지 길이)지정된 포트에서 패킷을 수신하여 출력하는 유틸리티
./receiver [옵션]
옵션:
-proto string 프로토콜: tcp 또는 udp (기본값: tcp)
-port int 수신 포트 (기본값: 8080)
-v 상세 출력 (전체 패킷 데이터 표시)
-hex 16진수 덤프 표시┌─────────┐ ┌───────────┐ ┌─────────────┐
│ Sender │────▶│ PacketDup │────▶│ Target:8080 │
│ :8000 │ │ :8000 │ └─────────────┘
└─────────┘ │ │ ┌─────────────┐
│ │────▶│ Mirror:8081 │
└───────────┘ └─────────────┘
1. Target 서버 실행 (터미널 1)
./receiver -port 80802. Mirror 서버 실행 (터미널 2)
./receiver -port 80813. PacketDup 실행 및 규칙 설정 (터미널 3)
./packetDup
# 웹 UI (http://localhost:8891)에서 규칙 설정:
# - Listen: TCP :8000
# - Target: 127.0.0.1:8080
# - Mirror: 127.0.0.1:8081
# - "Apply Rules" 클릭4. 패킷 전송 (터미널 4)
./sender -addr 127.0.0.1:8000 -interval 1s1. Target 서버
./receiver -proto udp -port 80802. Mirror 서버
./receiver -proto udp -port 80813. PacketDup 규칙 설정
- Protocol: UDP
- Listen Port: 8000
- Target: 127.0.0.1:8080
- Mirror: 127.0.0.1:8081
4. 패킷 전송
./sender -proto udp -addr 127.0.0.1:8000 -interval 500ms# 100ms 간격으로 100개 패킷 전송
./sender -addr 127.0.0.1:8000 -interval 100ms -count 100
# 커스텀 메시지 전송
./sender -addr 127.0.0.1:8000 -msg "Hello, World!"
# 1KB 크기 패킷 전송
./sender -addr 127.0.0.1:8000 -size 1024./receiver -port 8080 -v -hexpacketDup/
├── main.go # 엔트리 포인트 (start/stop/status/run)
├── daemon_unix.go # Unix 플랫폼 데몬 지원
├── daemon_windows.go # Windows 플랫폼 데몬 지원
├── go.mod # Go 모듈
├── config/
│ └── config.go # 설정 관리 (YAML)
├── proxy/
│ ├── proxy.go # 프록시 매니저
│ ├── tcp.go # TCP 프록시
│ └── udp.go # UDP 프록시
├── web/
│ ├── server.go # 웹 서버
│ ├── handlers.go # REST API 핸들러
│ └── static/
│ └── index.html # 웹 UI
├── cmd/
│ ├── sender/
│ │ └── main.go # Sender 유틸리티
│ └── receiver/
│ └── main.go # Receiver 유틸리티
└── config.yaml # 설정 파일
MIT License
