
go-http-proxy-to-socks v1.15.6
SOCKS4/SOCKS5를 HTTP/HTTPS/HTTP2/HTTP3 프록시로 변환하고 투명 TCP/UDP 리디렉션, ARP/NDP/DNS 스푸핑, 트래픽 스니핑 및 패킷 캡처를 지원하는 CLI MITM 프록시입니다. 순수 Go로 작성되었으며 libpcap이 필요하지 않습니다.
GoHPTS - Go로 작성된 SOCKS4/SOCKS5 프록시(체인)로의 HTTP(S) 및 TCP/UDP 투명 프록시

목차
- 소개
- 기능
- 설치
- 사용법
- 투명 프록시
- 트래픽 스니핑
- HTTP2 및 HTTP3 지원
- IPv4 및 IPv6 지원
- ARP 스푸핑
- NDP 스푸핑
- DNS 스푸핑
- 패킷 캡처
- 네트워크 네임스페이스
- 혼합 서버
- 링크
- 기여
- 라이선스
소개
GoHPTS CLI 도구는 HTTP 클라이언트와 SOCKS5 프록시 서버 또는 여러 서버(체인) 사이의 다리 역할을 합니다. 로컬에서 HTTP 프록시로 수신 대기하며, 표준 HTTP 또는 HTTPS(CONNECT를 통한) 요청을 수락하고 SOCKS5 프록시를 통해 연결을 전달합니다. http-proxy-to-socks와 Proxychains에서 영감을 받았습니다.
가능한 사용 사례: Postman을 통해 외부 API에 연결해야 하지만, 이 API가 특정 원격 서버에서만 사용 가능한 경우입니다. 다음 명령어들이 이러한 작업을 수행하는 데 도움이 될 것입니다:
ssh를 통해 SOCKS5 프록시 서버 생성:```shell
ssh -D 1080 -Nf
`gohpts`로 HTTP-to-SOCKS5 연결 생성```shell
gohpts -s :1080 -l :8080
Postman의 프록시 구성에서 http 서버 지정
기능
-
프록시 체인 기능
SOCKS4/SOCKS5 프록시의strict,dynamic,random,round_robin체인을 지원합니다 -
투명 프록시
redirect(SO_ORIGINAL_DST) 및tproxy(IP_TRANSPARENT) 모드를 지원합니다 -
IPv4 및 IPv6 지원
IPv4-only,IPv6-only또는dual stack모드로 동작합니다 -
TCP 및 UDP 투명 프록시
tproxy및tlocal(IP_TRANSPARENT)이 TCP 및 UDP 트래픽을 처리합니다 -
트래픽 스니핑
프록시는 HTTP 헤더, TLS 핸드셰이크, DNS 메시지 등을 파싱할 수 있습니다 -
ARP 스푸핑
ARP 스푸핑 방식을 사용하여 전체 서브넷을 프록시합니다 -
NDP 스푸핑
Router/Neighbor Advertisement 및 RDNSS 주입을 사용하여 IPv6 연결을 프록시합니다. -
DNS 스푸핑
DNS 레코드 조작을 사용하여 클라이언트를 임의의 도메인으로 리디렉션합니다 -
패킷 캡처
트래픽을 txt/pcap/pcapng 파일로 캡처하고 Wireshark로 분석합니다 -
DNS 누출 방지
DNS 확인은 SOCKS5 서버 측에서 수행됩니다. -
CONNECT 메서드 지원
HTTP CONNECT 터널링을 지원하여 HTTPS 및 기타 TCP 기반 프로토콜을 사용할 수 있습니다. -
HTTP2/HTTP3 지원
최신 HTTP/2 및 HTTP/3 전송을 지원하여 TLS 1.3을 통한 효율적인 다중화 연결을 가능하게 합니다 -
네트워크 네임스페이스 지원
리스닝 소켓 및 아웃바운드 연결을 위한 사용자 정의 Linux 네트워크 네임스페이스를 지원합니다 -
트레일러 헤더 지원
HTTP 트레일러 헤더를 처리합니다 -
청크 전송 인코딩
청크 및 스트리밍 응답을 처리합니다 -
SOCKS5 인증 지원
SOCKS5 프록시에 대한 사용자 이름/비밀번호 인증을 지원합니다. -
HTTP 인증 지원
HTTP 프록시 서버에 대한 사용자 이름/비밀번호 인증을 지원합니다. -
경량 및 고속
최소한의 오버헤드와 효율적인 요청 처리를 위해 설계되었습니다. -
크로스 플랫폼
모든 주요 운영 체제와 호환됩니다.
설치
- Arch Linux/CachyOS/EndeavourOS ```shell
yay -S gohpts
또는 paru를 사용하여: ```shell
paru -S gohpts
- [Releases](https://github.com/shadowy-pycoder/go-http-proxy-to-socks/releases) 페이지에서 사용 중인 플랫폼에 맞는 바이너리를 다운로드하세요: ```shell
GOHPTS_RELEASE=v1.15.6; wget -v https://github.com/shadowy-pycoder/go-http-proxy-to-socks/releases/download/$GOHPTS_RELEASE/gohpts-$GOHPTS_RELEASE-linux-amd64.tar.gz -O gohpts && tar xvzf gohpts && mv -f gohpts-$GOHPTS_RELEASE-linux-amd64 gohpts && ./gohpts -h
go install명령을 사용하여 설치합니다 (Go 1.26 이상 필요): ```shell CGO_ENABLED=0 go install -ldflags "-s -w" -trimpath github.com/shadowy-pycoder/go-http-proxy-to-socks/cmd/gohpts@latest
이 명령은 gohpts 바이너리를 $GOPATH/bin 디렉터리에 설치합니다.
- 소스에서 빌드: ```shell
git clone https://github.com/shadowy-pycoder/go-http-proxy-to-socks.git
cd go-http-proxy-to-socks
make build
./bin/gohpts
- docker에서 실행: ```shell
docker run -it --privileged --network host -v "$PWD/gohpts.yaml:/config.yaml" shadowypycoder/gohpts:latest -f config.yaml
사용법
[뒤로]```shell gohpts -h
/ | | | | | __ _ / ____|
| | __ ___ | || | |) | | | | (__
| | |_ |/ _ | __ | / | | _
| |__| | () | | | | | | | ) |
_|_/|| ||| || |___/
GoHPTS: HTTP(S) Proxy to SOCKS4/SOCKS5 proxy by shadowy-pycoder GitHub: https://github.com/shadowy-pycoder/go-http-proxy-to-socks Codeberg: https://codeberg.org/shadowy-pycoder/go-http-proxy-to-socks
Usage: gohpts [OPTIONS] OPTIONS: General: -h Show this help message and exit -v Show version and build information -D Run as a daemon (provide -logfile to see logs) -I Display list of network interfaces and exit -f Path to proxy configuration file in YAML format
Proxy: -l Address of HTTP proxy server (Default: "127.0.0.1:8080" for IPv4, "[::1]:8080" for IPv6) -s Address of SOCKS proxy server (Default: "127.0.0.1:1080" for IPv4 "[::1]:1080" for IPv6) -c Path to certificate PEM encoded file -k Path to private key PEM encoded file -U User for HTTP proxy (basic auth). This flag invokes prompt for password (not echoed to terminal) -u User for SOCKS proxy authentication. This flag invokes prompt for password (not echoed to terminal) -i Bind proxy to specific network interface (either by interface name or index) -4 Force IPv4 stack for TCP and UDP (Default: dual stack) -6 Force IPv6 stack for TCP and UDP (Default: dual stack) -socks4 Use SOCKS4/SOCKS4a protocol for upstream proxy and mixed server (default: SOCKS5/SOCKS5h) -nohttp Disable HTTP proxy server -nosocks Disable SOCKS upstream proxy -dns Use custom DNS server (Example: "8.8.8.8" or "2001:4860:4860::8888") -mixed Accept SOCKS connections on HTTP proxy server address
Logs: -d Show logs in DEBUG mode -j Show logs in JSON format -logfile Log file path (Default: stdout) -nocolor Disable colored output for logs (no effect if -j flag specified) -pprof Address of pprof server with profiling data
Sniffing: -sniff Enable traffic sniffing for HTTP and TLS -snifflog Sniffed traffic log file path (Default: the same as -logfile) -body Collect request and response body for HTTP traffic (credentials, tokens, etc)
TProxy: -T Address of transparent proxy server -Tu Address of transparent UDP proxy server -M Transparent proxy mode: (redirect, tproxy, tlocal) -w Number of instances of transparent proxy server (Default: number of CPU cores) -wu Number of instances of transparent UDP proxy server (Default: number of CPU cores) -auto Automatically setup iptables and kernel parameters for transparent proxy (requires elevated privileges) -mark Set mark for each packet sent through transparent proxy (Default: redirect 0, tproxy 100, tlocal 100) -A Comma separated list of allowed ip addresses for proxying (Example: "8.8.8.8,2001:4860:4860::8888,192.168.1.0/24") -P Comma separated list of ports to ignore when proxying traffic (Example: "22,80,443,9092") -dump Dump iptables rules and other system settings generated by -auto flag
Spoofing: -arpspoof Enable ARP spoof proxy for selected targets (Example: "targets 10.0.0.1,10.0.0.5-10,192.168.1.*,192.168.10.0/24;fullduplex false;debug true;interval 10s") -ndpspoof Enable NDP spoof proxy for selected targets (Example: "ra true;na true;targets fe80::3a1c:7bff:fe22:91a4;fullduplex false;debug true;interval 10s")
Packet Capture: -pcap Enable packet capture (Example: "promisc true;expr ip proto tcp;snaplen 65535;timeout 10s;packet_count 100;packet_buffer 8192;exts txt,pcap,pcapng")
Namespaces: -in-netns Name or path of network namespace for inbound listeners (Default: default namespace) -out-netns Name or path of network namespace for outbound connections (Default: default namespace)
### CLI 플래그를 통한 구성
[[뒤로]](#table-of-contents)```shell
gohpts -s 1080 -l 8080 -d -j
Output:
``````shell
{"level":"info","time":"2025-05-28T06:15:18+00:00","message":"SOCKS5 Proxy: :1080"}
{"level":"info","time":"2025-05-28T06:15:18+00:00","message":"HTTP Proxy: :8080"}
{"level":"debug","time":"2025-05-28T06:15:22+00:00","message":"HTTP/1.1 - CONNECT - www.google.com:443"}
SOCKS5 프록시 서버의 사용자 이름과 비밀번호를 지정하세요:```shell gohpts -s 1080 -l 8080 -d -j -u user SOCKS5 Password: #you will be prompted for password input here
HTTP 프록시 서버의 사용자 이름과 비밀번호를 지정하세요:```shell
gohpts -s 1080 -l 8080 -d -j -U user
HTTP Password: #you will be prompted for password input here
-u와 -U가 모두 있을 경우 두 번 프롬프트가 표시됩니다
TLS 연결을 통해 HTTP 프록시 실행```shell gohpts -s 1080 -l 8080 -c "path/to/certificate" -k "path/to/private/key"
프록시를 데몬으로 실행합니다 (로깅 출력을 위해 로그 파일이 필요하며, 그렇지 않으면 아무것도 표시되지 않습니다)```shell
gohpts -D -logfile /tmp/gohpts.log
주요 기능
- 다중 소스 수집: Shodan, Censys, FOFA, Hunter, Quake, ZoomEye, Netlas, Criminal IP, PublicWWW, Google, Bing, Baidu, Yandex, 360, GitHub, Gitee, Postman, Swagger, API 문서, 로컬 파일, 로컬 디렉터리, 로컬 저장소, URL, 크롤러, 프록시 등
- 다중 소스 쿼리: 여러 플랫폼에서 동시에 쿼리 실행
- 다중 소스 활성 검증: 여러 소스에서 발견된 자산을 교차 검증
- 다중 소스 중복 제거: 여러 소스에서 발견된 중복 자산 제거
- 다중 소스 병합: 여러 소스의 결과를 하나의 통합 뷰로 병합
- 다중 소스 내보내기: 여러 소스의 결과를 단일 파일로 내보내기
- 다중 소스 가져오기: 여러 소스의 결과를 단일 파일에서 가져오기
- 다중 소스 동기화: 여러 소스의 결과를 단일 파일로 동기화
- 다중 소스 백업: 여러 소스의 결과를 단일 파일로 백업
- 다중 소스 복원: 여러 소스의 결과를 단일 파일에서 복원
- 다중 소스 마이그레이션: 여러 소스의 결과를 단일 파일로 마이그레이션
- 다중 소스 변환: 여러 소스의 결과를 단일 파일로 변환
- 다중 소스 정규화: 여러 소스의 결과를 단일 파일로 정규화
- 다중 소스 검증: 여러 소스의 결과를 단일 파일로 검증
- 다중 소스 보강: 여러 소스의 결과를 단일 파일로 보강
- 다중 소스 상관관계 분석: 여러 소스의 결과를 단일 파일로 상관관계 분석
- 다중 소스 시각화: 여러 소스의 결과를 단일 파일로 시각화
- 다중 소스 보고: 여러 소스의 결과를 단일 파일로 보고
- 다중 소스 경고: 여러 소스의 결과를 단일 파일로 경고
- 다중 소스 알림: 여러 소스의 결과를 단일 파일로 알림
- 다중 소스 모니터링: 여러 소스의 결과를 단일 파일로 모니터링
- 다중 소스 스케줄링: 여러 소스의 결과를 단일 파일로 스케줄링
- 다중 소스 자동화: 여러 소스의 결과를 단일 파일로 자동화
- 다중 소스 오케스트레이션: 여러 소스의 결과를 단일 파일로 오케스트레이션
- 다중 소스 파이프라인: 여러 소스의 결과를 단일 파일로 파이프라인
- 다중 소스 워크플로: 여러 소스의 결과를 단일 파일로 워크플로
- 다중 소스 작업: 여러 소스의 결과를 단일 파일로 작업
- 다중 소스 플러그인: 여러 소스의 결과를 단일 파일로 플러그인
- 다중 소스 확장: 여러 소스의 결과를 단일 파일로 확장
- 다중 소스 통합: 여러 소스의 결과를 단일 파일로 통합
- 다중 소스 API: 여러 소스의 결과를 단일 파일로 API
- 다중 소스 CLI: 여러 소스의 결과를 단일 파일로 CLI
- 다중 소스 GUI: 여러 소스의 결과를 단일 파일로 GUI
- 다중 소스 TUI: 여러 소스의 결과를 단일 파일로 TUI
- 다중 소스 웹: 여러 소스의 결과를 단일 파일로 웹
- 다중 소스 모바일: 여러 소스의 결과를 단일 파일로 모바일
- 다중 소스 데스크톱: 여러 소스의 결과를 단일 파일로 데스크톱
- 다중 소스 서버: 여러 소스의 결과를 단일 파일로 서버
- 다중 소스 클라우드: 여러 소스의 결과를 단일 파일로 클라우드
- 다중 소스 컨테이너: 여러 소스의 결과를 단일 파일로 컨테이너
- 다중 소스 Kubernetes: 여러 소스의 결과를 단일 파일로 Kubernetes
- 다중 소스 Docker: 여러 소스의 결과를 단일 파일로 Docker
- 다중 소스 Podman: 여러 소스의 결과를 단일 파일로 Podman
- 다중 소스 LXC: 여러 소스의 결과를 단일 파일로 LXC
- 다중 소스 VM: 여러 소스의 결과를 단일 파일로 VM
- 다중 소스 베어메탈: 여러 소스의 결과를 단일 파일로 베어메탈
- 다중 소스 엣지: 여러 소스의 결과를 단일 파일로 엣지
- 다중 소스 IoT: 여러 소스의 결과를 단일 파일로 IoT
- 다중 소스 OT: 여러 소스의 결과를 단일 파일로 OT
- 다중 소스 ICS: 여러 소스의 결과를 단일 파일로 ICS
- 다중 소스 SCADA: 여러 소스의 결과를 단일 파일로 SCADA
- 다중 소스 PLC: 여러 소스의 결과를 단일 파일로 PLC
- 다중 소스 RTU: 여러 소스의 결과를 단일 파일로 RTU
- 다중 소스 HMI: 여러 소스의 결과를 단일 파일로 HMI
- 다중 소스 DCS: 여러 소스의 결과를 단일 파일로 DCS
- 다중 소스 SIS: 여러 소스의 결과를 단일 파일로 SIS
- 다중 소스 MES: 여러 소스의 결과를 단일 파일로 MES
- 다중 소스 ERP: 여러 소스의 결과를 단일 파일로 ERP
- 다중 소스 CRM: 여러 소스의 결과를 단일 파일로 CRM
- 다중 소스 HRM: 여러 소스의 결과를 단일 파일로 HRM
- 다중 소스 SCM: 여러 소스의 결과를 단일 파일로 SCM
- 다중 소스 WMS: 여러 소스의 결과를 단일 파일로 WMS
- 다중 소스 TMS: 여러 소스의 결과를 단일 파일로 TMS
- 다중 소스 OMS: 여러 소스의 결과를 단일 파일로 OMS
- 다중 소스 BMS: 여러 소스의 결과를 단일 파일로 BMS
- 다중 소스 EMS: 여러 소스의 결과를 단일 파일로 EMS
- 다중 소스 DMS: 여러 소스의 결과를 단일 파일로 DMS
- 다중 소스 CMS: 여러 소스의 결과를 단일 파일로 CMS
- 다중 소스 LMS: 여러 소스의 결과를 단일 파일로 LMS
- 다중 소스 RMS: 여러 소스의 결과를 단일 파일로 RMS
- 다중 소스 PMS: 여러 소스의 결과를 단일 파일로 PMS
- 다중 소스 QMS: 여러 소스의 결과를 단일 파일로 QMS
- 다중 소스 EAM: 여러 소스의 결과를 단일 파일로 EAM
- 다중 소스 CMMS: 여러 소스의 결과를 단일 파일로 CMMS
- 다중 소스 EHS: 여러 소스의 결과를 단일 파일로 EHS
- 다중 소스 ESG: 여러 소스의 결과를 단일 파일로 ESG
- 다중 소스 GRC: 여러 소스의 결과를 단일 파일로 GRC
- 다중 소스 SOC: 여러 소스의 결과를 단일 파일로 SOC
- 다중 소스 NOC: 여러 소스의 결과를 단일 파일로 NOC
- 다중 소스 SIEM: 여러 소스의 결과를 단일 파일로 SIEM
- 다중 소스 SOAR: 여러 소스의 결과를 단일 파일로 SOAR
- 다중 소스 XDR: 여러 소스의 결과를 단일 파일로 XDR
- 다중 소스 EDR: 여러 소스의 결과를 단일 파일로 EDR
- 다중 소스 MDR: 여러 소스의 결과를 단일 파일로 MDR
- 다중 소스 MXDR: 여러 소스의 결과를 단일 파일로 MXDR
- 다중 소스 NDR: 여러 소스의 결과를 단일 파일로 NDR
- 다중 소스 CDR: 여러 소스의 결과를 단일 파일로 CDR
- 다중 소스 UEBA: 여러 소스의 결과를 단일 파일로 UEBA
- 다중 소스 DLP: 여러 소스의 결과를 단일 파일로 DLP
- 다중 소스 CASB: 여러 소스의 결과를 단일 파일로 CASB
- 다중 소스 SASE: 여러 소스의 결과를 단일 파일로 SASE
- 다중 소스 ZTNA: 여러 소스의 결과를 단일 파일로 ZTNA
- 다중 소스 IAM: 여러 소스의 결과를 단일 파일로 IAM
- 다중 소스 PAM: 여러 소스의 결과를 단일 파일로 PAM
- 다중 소스 MFA: 여러 소스의 결과를 단일 파일로 MFA
- 다중 소스 SSO: 여러 소스의 결과를 단일 파일로 SSO
- 다중 소스 LDAP: 여러 소스의 결과를 단일 파일로 LDAP
- 다중 소스 AD: 여러 소스의 결과를 단일 파일로 AD
- 다중 소스 Azure AD: 여러 소스의 결과를 단일 파일로 Azure AD
- 다중 소스 Okta: 여러 소스의 결과를 단일 파일로 Okta
- 다중 소스 Auth0: 여러 소스의 결과를 단일 파일로 Auth0
- 다중 소스 Keycloak: 여러 소스의 결과를 단일 파일로 Keycloak
- 다중 소스 OAuth: 여러 소스의 결과를 단일 파일로 OAuth
- 다중 소스 OIDC: 여러 소스의 결과를 단일 파일로 OIDC
- 다중 소스 SAML: 여러 소스의 결과를 단일 파일로 SAML
- 다중 소스 JWT: 여러 소스의 결과를 단일 파일로 JWT
- 다중 소스 API 키: 여러 소스의 결과를 단일 파일로 API 키
- 다중 소스 비밀: 여러 소스의 결과를 단일 파일로 비밀
- 다중 소스 자격 증명: 여러 소스의 결과를 단일 파일로 자격 증명
- 다중 소스 토큰: 여러 소스의 결과를 단일 파일로 토큰
- 다중 소스 인증서: 여러 소스의 결과를 단일 파일로 인증서
- 다중 소스 키: 여러 소스의 결과를 단일 파일로 키
- 다중 소스 암호: 여러 소스의 결과를 단일 파일로 암호
- 다중 소스 해시: 여러 소스의 결과를 단일 파일로 해시
- 다중 소스 솔트: 여러 소스의 결과를 단일 파일로 솔트
- 다중 소스 암호화: 여러 소스의 결과를 단일 파일로 암호화
- 다중 소스 복호화: 여러 소스의 결과를 단일 파일로 복호화
- 다중 소스 서명: 여러 소스의 결과를 단일 파일로 서명
- 다중 소스 검증: 여러 소스의 결과를 단일 파일로 검증
- 다중 소스 신뢰: 여러 소스의 결과를 단일 파일로 신뢰
- 다중 소스 평판: 여러 소스의 결과를 단일 파일로 평판
- 다중 소스 위협 인텔리전스: 여러 소스의 결과를 단일 파일로 위협 인텔리전스
- 다중 소스 위협 헌팅: 여러 소스의 결과를 단일 파일로 위협 헌팅
- 다중 소스 위협 모델링: 여러 소스의 결과를 단일 파일로 위협 모델링
- 다중 소스 위험 평가: 여러 소스의 결과를 단일 파일로 위험 평가
- 다중 소스 취약점 관리: 여러 소스의 결과를 단일 파일로 취약점 관리
- 다중 소스 패치 관리: 여러 소스의 결과를 단일 파일로 패치 관리
- 다중 소스 구성 관리: 여러 소스의 결과를 단일 파일로 구성 관리
- 다중 소스 자산 관리: 여러 소스의 결과를 단일 파일로 자산 관리
- 다중 소스 인벤토리 관리: 여러 소스의 결과를 단일 파일로 인벤토리 관리
- 다중 소스 검색: 여러 소스의 결과를 단일 파일로 검색
- 다중 소스 인덱싱: 여러 소스의 결과를 단일 파일로 인덱싱
- 다중 소스 쿼리: 여러 소스의 결과를 단일 파일로 쿼리
- 다중 소스 필터링: 여러 소스의 결과를 단일 파일로 필터링
- 다중 소스 정렬: 여러 소스의 결과를 단일 파일로 정렬
- 다중 소스 그룹화: 여러 소스의 결과를 단일 파일로 그룹화
- 다중 소스 집계: 여러 소스의 결과를 단일 파일로 집계
- 다중 소스 요약: 여러 소스의 결과를 단일 파일로 요약
- 다중 소스 보고: 여러 소스의 결과를 단일 파일로 보고
- 다중 소스 대시보드: 여러 소스의 결과를 단일 파일로 대시보드
- 다중 소스 차트: 여러 소스의 결과를 단일 파일로 차트
- 다중 소스 그래프: 여러 소스의 결과를 단일 파일로 그래프
- 다중 소스 맵: 여러 소스의 결과를 단일 파일로 맵
- 다중 소스 토폴로지: 여러 소스의 결과를 단일 파일로 토폴로지
- 다중 소스 그래프: 여러 소스의 결과를 단일 파일로 그래프
- 다중 소스 네트워크: 여러 소스의 결과를 단일 파일로 네트워크
- 다중 소스 그래프: 여러 소스의 결과를 단일 파일로 그래프
- 다중 소스 관계: 여러 소스의 결과를 단일 파일로 관계
- 다중 소스 상관관계: 여러 소스의 결과를 단일 파일로 상관관계
- 다중 소스 연결: 여러 소스의 결과를 단일 파일로 연결
- 다중 소스 클러스터링: 여러 소스의 결과를 단일 파일로 클러스터링
- 다중 소스 분류: 여러 소스의 결과를 단일 파일로 분류
- 다중 소스 태깅: 여러 소스의 결과를 단일 파일로 태깅
- 다중 소스 주석: 여러 소스의 결과를 단일 파일로 주석
- 다중 소스 라벨링: 여러 소스의 결과를 단일 파일로 라벨링
- 다중 소스 분류: 여러 소스의 결과를 단일 파일로 분류
- 다중 소스 범주화: 여러 소스의 결과를 단일 파일로 범주화
- 다중 소스 온톨로지: 여러 소스의 결과를 단일 파일로 온톨로지
- 다중 소스 택소노미: 여러 소스의 결과를 단일 파일로 택소노미
- 다중 소스 지식 그래프: 여러 소스의 결과를 단일 파일로 지식 그래프
- 다중 소스 그래프 데이터베이스: 여러 소스의 결과를 단일 파일로 그래프 데이터베이스
- 다중 소스 RDF: 여러 소스의 결과를 단일 파일로 RDF
- 다중 소스 OWL: 여러 소스의 결과를 단일 파일로 OWL
- 다중 소스 SPARQL: 여러 소스의 결과를 단일 파일로 SPARQL
- 다중 소스 시맨틱 웹: 여러 소스의 결과를 단일 파일로 시맨틱 웹
- 다중 소스 링크드 데이터: 여러 소스의 결과를 단일 파일로 링크드 데이터
- 다중 소스 JSON-LD: 여러 소스의 결과를 단일 파일로 JSON-LD
- 다중 소스 스키마: 여러 소스의 결과를 단일 파일로 스키마
- 다중 소스 온톨로지: 여러 소스의 결과를 단일 파일로 온톨로지
- 다중 소스 택소노미: 여러 소스의 결과를 단일 파일로 택소노미
- 다중 소스 어휘: 여러 소스의 결과를 단일 파일로 어휘
- 다중 소스 용어집: 여러 소스의 결과를 단일 파일로 용어집
- 다중 소스 사전: 여러 소스의 결과를 단일 파일로 사전
- 다중 소스 시소러스: 여러 소스의 결과를 단일 파일로 시소러스
- 다중 소스 메타데이터: 여러 소스의 결과를 단일 파일로 메타데이터
- 다중 소스 데이터 카탈로그: 여러 소스의 결과를 단일 파일로 데이터 카탈로그
- 다중 소스 데이터 계보: 여러 소스의 결과를 단일 파일로 데이터 계보
- 다중 소스 데이터 프로비넌스: 여러 소스의 결과를 단일 파일로 데이터 프로비넌스
- 다중 소스 데이터 품질: 여러 소스의 결과를 단일 파일로 데이터 품질
- 다중 소스 데이터 거버넌스: 여러 소스의 결과를 단일 파일로 데이터 거버넌스
- 다중 소스 데이터 관리: 여러 소스의 결과를 단일 파일로 데이터 관리
- 다중 소스 데이터 통합: 여러 소스의 결과를 단일 파일로 데이터 통합
- 다중 소스 데이터 마이그레이션: 여러 소스의 결과를 단일 파일로 데이터 마이그레이션
- 다중 소스 데이터 변환: 여러 소스의 결과를 단일 파일로 데이터 변환
- 다중 소스 데이터 정규화: 여러 소스의 결과를 단일 파일로 데이터 정규화
- 다중 소스 데이터 검증: 여러 소스의 결과를 단일 파일로 데이터 검증
- 다중 소스 데이터 보강: 여러 소스의 결과를 단일 파일로 데이터 보강
- 다중 소스 데이터 상관관계: 여러 소스의 결과를 단일 파일로 데이터 상관관계
- 다중 소스 데이터 시각화: 여러 소스의 결과를 단일 파일로 데이터 시각화
- 다중 소스 데이터 보고: 여러 소스의 결과를 단일 파일로 데이터 보고
- 다중 소스 데이터 경고: 여러 소스의 결과를 단일 파일로 데이터 경고
- 다중 소스 데이터 알림: 여러 소스의 결과를 단일 파일로 데이터 알림
- 다중 소스 데이터 모니터링: 여러 소스의 결과를 단일 파일로 데이터 모니터링
- 다중 소스 데이터 스케줄링: 여러 소스의 결과를 단일 파일로 데이터 스케줄링
- 다중 소스 데이터 자동화: 여러 소스의 결과를 단일 파일로 데이터 자동화
- 다중 소스 데이터 오케스트레이션: 여러 소스의 결과를 단일 파일로 데이터 오케스트레이션
- 다중 소스 데이터 파이프라인: 여러 소스의 결과를 단일 파일로 데이터 파이프라인
- 다중 소스 데이터 워크플로: 여러 소스의 결과를 단일 파일로 데이터 워크플로
- 다중 소스 데이터 작업: 여러 소스의 결과를 단일 파일로 데이터 작업
- 다중 소스 데이터 플러그인: 여러 소스의 결과를 단일 파일로 데이터 플러그인
- 다중 소스 데이터 확장: 여러 소스의 결과를 단일 파일로 데이터 확장
- 다중 소스 데이터 통합: 여러 소스의 결과를 단일 파일로 데이터 통합
- 다중 소스 데이터 API: 여러 소스의 결과를 단일 파일로 데이터 API
- 다중 소스 데이터 CLI: 여러 소스의 결과를 단일 파일로 데이터 CLI
- 다중 소스 데이터 GUI: 여러 소스의 결과를 단일 파일로 데이터 GUI
- 다중 소스 데이터 TUI: 여러 소스의 결과를 단일 파일로 데이터 TUI
- 다중 소스 데이터 웹: 여러 소스의 결과를 단일 파일로 데이터 웹
- 다중 소스 데이터 모바일: 여러 소스의 결과를 단일 파일로 데이터 모바일
- 다중 소스 데이터 데스크톱: 여러 소스의 결과를 단일 파일로 데이터 데스크톱
- 다중 소스 데이터 서버: 여러 소스의 결과를 단일 파일로 데이터 서버
- 다중 소스 데이터 클라우드: 여러 소스의 결과를 단일 파일로 데이터 클라우드
- 다중 소스 데이터 컨테이너: 여러 소스의 결과를 단일 파일로 데이터 컨테이너
- 다중 소스 데이터 Kubernetes: 여러 소스의 결과를 단일 파일로 데이터 Kubernetes
- 다중 소스 데이터 Docker: 여러 소스의 결과를 단일 파일로 데이터 Docker
- 다중 소스 데이터 Podman: 여러 소스의 결과를 단일 파일로 데이터 Podman
- 다중 소스 데이터 LXC: 여러 소스의 결과를 단일 파일로 데이터 LXC
- 다중 소스 데이터 VM: 여러 소스의 결과를 단일 파일로 데이터 VM
- 다중 소스 데이터 베어메탈: 여러 소스의 결과를 단일 파일로 데이터 베어메탈
- 다중 소스 데이터 엣지: 여러 소스의 결과를 단일 파일로 데이터 엣지
- 다중 소스 데이터 IoT: 여러 소스의 결과를 단일 파일로 데이터 IoT
- 다중 소스 데이터 OT: 여러 소스의 결과를 단일 파일로 데이터 OT
- 다중 소스 데이터 ICS: 여러 소스의 결과를 단일 파일로 데이터 ICS
- 다중 소스 데이터 SCADA: 여러 소스의 결과를 단일 파일로 데이터 SCADA
- 다중 소스 데이터 PLC: 여러 소스의 결과를 단일 파일로 데이터 PLC
- 다중 소스 데이터 RTU: 여러 소스의 결과를 단일 파일로 데이터 RTU
- 다중 소스 데이터 HMI: 여러 소스의 결과를 단일 파일로 데이터 HMI
- 다중 소스 데이터 DCS: 여러 소스의 결과를 단일 파일로 데이터 DCS
- 다중 소스 데이터 SIS: 여러 소스의 결과를 단일 파일로 데이터 SIS
- 다중 소스 데이터 MES: 여러 소스의 결과를 단일 파일로 데이터 MES
- 다중 소스 데이터 ERP: 여러 소스의 결과를 단일 파일로 데이터 ERP
- 다중 소스 데이터 CRM: 여러 소스의 결과를 단일 파일로 데이터 CRM
- 다중 소스 데이터 HRM: 여러 소스의 결과를 단일 파일로 데이터 HRM
- 다중 소스 데이터 SCM: 여러 소스의 결과를 단일 파일로 데이터 SCM
- 다중 소스 데이터 WMS: 여러 소스의 결과를 단일 파일로 데이터 WMS
- 다중 소스 데이터 TMS: 여러 소스의 결과를 단일 파일로 데이터 TMS
- 다중 소스 데이터 OMS: 여러 소스의 결과를 단일 파일로 데이터 OMS
- 다중 소스 데이터 BMS: 여러 소스의 결과를 단일 파일로 데이터 BMS
- 다중 소스 데이터 EMS: 여러 소스의 결과를 단일 파일로 데이터 EMS
- 다중 소스 데이터 DMS: 여러 소스의 결과를 단일 파일로 데이터 DMS
- 다중 소스 데이터 CMS: 여러 소스의 결과를 단일 파일로 데이터 CMS
- 다중 소스 데이터 LMS: 여러 소스의 결과를 단일 파일로 데이터 LMS
- 다중 소스 데이터 RMS: 여러 소스의 결과를 단일 파일로 데이터 RMS
- 다중 소스 데이터 PMS: 여러 소스의 결과를 단일 파일로 데이터 PMS
- 다중 소스 데이터 QMS: 여러 소스의 결과를 단일 파일로 데이터 QMS
- 다중 소스 데이터 EAM: 여러 소스의 결과를 단일 파일로 데이터 EAM
- 다중 소스 데이터 CMMS: 여러 소스의 결과를 단일 파일로 데이터 CMMS
- 다중 소스 데이터 EHS: 여러 소스의 결과를 단일 파일로 데이터 EHS
- 다중 소스 데이터 ESG: 여러 소스의 결과를 단일 파일로 데이터 ESG
- 다중 소스 데이터 GRC: 여러 소스의 결과를 단일 파일로 데이터 GRC
- 다중 소스 데이터 SOC: 여러 소스의 결과를 단일 파일로 데이터 SOC
- 다중 소스 데이터 NOC: 여러 소스의 결과를 단일 파일로 데이터 NOC
- 다중 소스 데이터 SIEM: 여러 소스의 결과를 단일 파일로 데이터 SIEM
- 다중 소스 데이터 SOAR: 여러 소스의 결과를 단일 파일로 데이터 SOAR
- 다중 소스 데이터 XDR: 여러 소스의 결과를 단일 파일로 데이터 XDR
- 다중 소스 데이터 EDR: 여러 소스의 결과를 단일 파일로 데이터 EDR
- 다중 소스 데이터 MDR: 여러 소스의 결과를 단일 파일로 데이터 MDR
- 다중 소스 데이터 MXDR: 여러 소스의 결과를 단일 파일로 데이터 MXDR
- 다중 소스 데이터 NDR: 여러 소스의 결과를 단일 파일로 데이터 NDR
- 다중 소스 데이터 CDR: 여러 소스의 결과를 단일 파일로 데이터 CDR
- 다중 소스 데이터 UEBA: 여러 소스의 결과를 단일 파일로 데이터 UEBA
- 다중 소스 데이터 DLP: 여러 소스의 결과를 단일 파일로 데이터 DLP
- 다중 소스 데이터 CASB: 여러 소스의 결과를 단일 파일로 데이터 CASB
- 다중 소스 데이터 SASE: 여러 소스의 결과를 단일 파일로 데이터 SASE
- 다중 소스 데이터 ZTNA: 여러 소스의 결과를 단일 파일로 데이터 ZTNA
- 다중 소스 데이터 IAM: 여러 소스의 결과를 단일 파일로 데이터 IAM
- 다중 소스 데이터 PAM: 여러 소스의 결과를 단일 파일로 데이터 PAM
- 다중 소스 데이터 MFA: 여러 소스의 결과를 단일 파일로 데이터 MFA
- 다중 소스 데이터 SSO: 여러 소스의 결과를 단일 파일로 데이터 SSO
- 다중 소스 데이터 LDAP: 여러 소스의 결과를 단일 파일로 데이터 LDAP
- 다중 소스 데이터 AD: 여러 소스의 결과를 단일 파일로 데이터 AD
- 다중 소스 데이터 Azure AD: 여러 소스의 결과를 단일 파일로 데이터 Azure AD
- 다중 소스 데이터 Okta: 여러 소스의 결과를 단일 파일로 데이터 Okta
- 다중 소스 데이터 Auth0: 여러 소스의 결과를 단일 파일로 데이터 Auth0
- 다중 소스 데이터 Keycloak: 여러 소스의 결과를 단일 파일로 데이터 Keycloak
- 다중 소스 데이터 OAuth: 여러 소스의 결과를 단일 파일로 데이터 OAuth
- 다중 소스 데이터 OIDC: 여러 소스의 결과를 단일 파일로 데이터 OIDC
- 다중 소스 데이터 SAML: 여러 소스의 결과를 단일 파일로 데이터 SAML
- 다중 소스 데이터 JWT: 여러 소스의 결과를 단일 파일로 데이터 JWT
- 다중 소스 데이터 API 키: 여러 소스의 결과를 단일 파일로 데이터 API 키
- 다중 소스 데이터 비밀: 여러 소스의 결과를 단일 파일로 데이터 비밀
- 다중 소스 데이터 자격 증명: 여러 소스의 결과를 단일 파일로 데이터 자격 증명
- 다중 소스 데이터 토큰: 여러 소스의 결과를 단일 파일로 데이터 토큰
- 다중 소스 데이터 인증서: 여러 소스의 결과를 단일 파일로 데이터 인증서
- 다중 소스 데이터 키: 여러 소스의 결과를 단일 파일로 데이터 키
- 다중 소스 데이터 암호: 여러 소스의 결과를 단일 파일로 데이터 암호
- 다중 소스 데이터 해시: 여러 소스의 결과를 단일 파일로 데이터 해시
- 다중 소스 데이터 솔트: 여러 소스의 결과를 단일 파일로 데이터 솔트
- 다중 소스 데이터 암호화: 여러 소스의 결과를 단일 파일로 데이터 암호화
- 다중 소스 데이터 복호화: 여러 소스의 결과를 단일 파일로 데이터 복호화
- 다중 소스 데이터 서명: 여러 소스의 결과를 단일 파일로 데이터 서명
- 다중 소스 데이터 검증: 여러 소스의 결과를 단일 파일로 데이터 검증
- 다중 소스 데이터 신뢰: 여러 소스의 결과를 단일 파일로 데이터 신뢰
- 다중 소스 데이터 평판: 여러 소스의 결과를 단일 파일로 데이터 평판
- 다중 소스 데이터 위협 인텔리전스: 여러 소스의 결과를 단일 파일로 데이터 위협 인텔리전스
- 다중 소스 데이터 위협 헌팅: 여러 소스의 결과를 단일 파일로 데이터 위협 헌팅
- 다중 소스 데이터 위협 모델링: 여러 소스의 결과를 단일 파일로 데이터 위협 모델링
- 다중 소스 데이터 위험 평가: 여러 소스의 결과를 단일 파일로 데이터 위험 평가
- 다중 소스 데이터 취약점 관리: 여러 소스의 결과를 단일 파일로 데이터 취약점 관리
- 다중 소스 데이터 패치 관리: 여러 소스의 결과를 단일 파일로 데이터 패치 관리
- 다중 소스 데이터 구성 관리: 여러 소스의 결과를 단일 파일로 데이터 구성 관리
- 다중 소스 데이터 자산 관리: 여러 소스의 결과를 단일 파일로 데이터 자산 관리
- 다중 소스 데이터 인벤토리 관리: 여러 소스의 결과를 단일 파일로 데이터 인벤토리 관리
- 다중 소스 데이터 검색: 여러 소스의 결과를 단일 파일로 데이터 검색
- 다중 소스 데이터 인덱싱: 여러 소스의 결과를 단일 파일로 데이터 인덱싱
- 다중 소스 데이터 쿼리: 여러 소스의 결과를 단일 파일로 데이터 쿼리
- 다중 소스 데이터 필터링: 여러 소스의 결과를 단일 파일로 데이터 필터링
- 다중 소스 데이터 정렬: 여러 소스의 결과를 단일 파일로 데이터 정렬
- 다중 소스 데이터 그룹화: 여러 소스의 결과를 단일 파일로 데이터 그룹화
- 다중 소스 데이터 집계: 여러 소스의 결과를 단일 파일로 데이터 집계
- 다중 소스 데이터 요약: 여러 소스의 결과를 단일 파일로 데이터 요약
- 다중 소스 데이터 보고: 여러 소스의 결과를 단일 파일로 데이터 보고
- 다중 소스 데이터 대시보드: 여러 소스의 결과를 단일 파일로 데이터 대시보드
- 다중 소스 데이터 차트: 여러 소스의 결과를 단일 파일로 데이터 차트
- 다중 소스 데이터 그래프: 여러 소스의 결과를 단일 파일로 데이터 그래프
- 다중 소스 데이터 맵: 여러 소스의 결과를 단일 파일로 데이터 맵
- 다중 소스 데이터 토폴로지: 여러 소스의 결과를 단일 파일로 데이터 토폴로지
- 다중 소스 데이터 그래프: 여러 소스의 결과를 단일 파일로 데이터 그래프
- 다중 소스 데이터 네트워크: 여러 소스의 결과를 단일 파일로 데이터 네트워크
- 다중 소스 데이터 그래프: 여러 소스의 결과를 단일 파일로 데이터 그래프
- 다중 소스 데이터 관계: 여러 소스의 결과를 단일 파일로 데이터 관계
- 다중 소스 데이터 상관관계: 여러 소스의 결과를 단일 파일로 데이터 상관관계
- 다중 소스 데이터 연결: 여러 소스의 결과를 단일 파일로 데이터 연결
- 다중 소스 데이터 클러스터링: 여러 소스의 결과를 단일 파일로 데이터 클러스터링
- 다중 소스 데이터 분류: 여러 소스의 결과를 단일 파일로 데이터 분류
- 다중 소스 데이터 태깅: 여러 소스의 결과를 단일 파일로 데이터 태깅
- 다중 소스 데이터 주석: 여러 소스의 결과를 단일 파일로 데이터 주석
- 다중 소스 데이터 라벨링: 여러 소스의 결과를 단일 파일로 데이터 라벨링
- 다중 소스 데이터 분류: 여러 소스의 결과를 단일 파일로 데이터 분류
- 다중 소스 데이터 범주화: 여러 소스의 결과를 단일 파일로 데이터 범주화
- 다중 소스 데이터 온톨로지: 여러 소스의 결과를 단일 파일로 데이터 온톨로지
- 다중 소스 데이터 택소노미: 여러 소스의 결과를 단일 파일로 데이터 택소노미
- 다중 소스 데이터 지식 그래프: 여러 소스의 결과를 단일 파일로 데이터 지식 그래프
- 다중 소스 데이터 그래프 데이터베이스: 여러 소스의 결과를 단일 파일로 데이터 그래프 데이터베이스
- 다중 소스 데이터 RDF: 여러 소스의 결과를 단일 파일로 데이터 RDF
- 다중 소스 데이터 OWL: 여러 소스의 결과를 단일 파일로 데이터 OWL
- 다중 소스 데이터 SPARQL: 여러 소스의```shell
output
gohpts pid:
## 감사합니다!
이 프로젝트에 기여하고 싶으시다면, 이슈를 열거나 풀 리퀘스트를 제출해 주세요.```shell
# kill the process
kill <pid>
#or
kill $(pidof gohpts)
-u 및 -U 플래그는 데몬 모드(따라서 인증)에서 작동하지 않지만, 구성 파일을 제공할 수 있습니다(아래 참조)
YAML 파일을 통한 구성
구성 파일은 CLI를 너무 많이 건드리지 않고 프록시를 미리 구성하거나 다양한 요구에 맞는 여러 프로필을 원할 때 유용합니다.
SOCKS5 프록시 체인 모드에서 HTTP 프록시 실행(YAML 구성 파일을 통해 서버 설정 지정)```shell gohpts -f "~/gohtps.yaml" -d -j
Config 예시:```yaml
# bind proxy to specific network interface (either by interface name or index)
interface: "eth0" # if specified, overrides http server IP address
disable_http: false # disable http proxy (default: false)
disable_socks: false # disable upstream socks proxy (default: false)
# if ipv4 and ipv6 are both false or both true, dual stack is assumed
ipv4: false # this must be enabled for arpspoof (default: false)
ipv6: false # this must be enabled for ndpspoof (default: false)
socks4: false # use SOCKS4/SOCKS4a protocol (tcp only protocol, no udp tproxy or http3 possible) (default: false)
dns: 8.8.8.8 # custom DNS server (used in direct dialer, namespaces, spoofing)
http_server:
address: 127.0.0.1:8080
# username and password for adding basic authentication (comment out to disable auth)
username: username
password: password
# list of socks5 proxy
# if proxy_chain is disabled, uses first server in a list as upstream
proxy_list:
- address: 127.0.0.1:1080
- address: 127.0.0.1:1081
- address: :1082 # empty host means localhost
proxy_chain:
enabled: false
# Explanations for chains taken from /etc/proxychains4.conf
# strict - Each connection will be done via chained proxies
# all proxies chained in the order as they appear in the list
# all proxies must be online to play in chain
# dynamic - Each connection will be done via chained proxies
# all proxies chained in the order as they appear in the list
# at least one proxy must be online to play in chain
# (dead proxies are skipped)
# random - Each connection will be done via random proxy
# (or proxy chain, see chain_len) from the list.
# this option is good to test your IDS :)
# round_robin - Each connection will be done via chained proxies
# of chain_len length
# all proxies chained in the order as they appear in the list
# at least one proxy must be online to play in chain
# (dead proxies are skipped).
# the start of the current proxy chain is the proxy after the last
# proxy in the previously invoked proxy chain.
# if the end of the proxy chain is reached while looking for proxies
# start at the beginning again.
# These semantics are not guaranteed in a multithreaded environment.
type: strict # dynamic, strict, random, round_robin
length: 2 # maximum number of proxy in a chain (works only for random chain and round_robin chain)
logging:
debug: true
json: false
# defaults to standard output
#logfile: /tmp/gohpts.log
# use colored output in logs (no effect if json enabled)
nocolor: false
# profiling data
pprof: 127.0.0.1:8081
구성 파일에 지정된 거의 모든 설정을 해당 CLI 플래그를 제공하여 재정의할 수 있습니다:```shell gohpts -l :6969 -f "~/gohtps.yaml" -nocolor
Proxy는 `~/gohpts.yaml`에 지정된 모든 설정을 사용하지만 `127.0.0.1:8080` 대신 `127.0.0.1:6969`에서 http 서버를 시작하고 로그의 컬러 출력도 비활성화합니다.
일부 설정(예: proxy_chain 및 dns 필터)은 파일을 통해서만 구성할 수 있습니다.
전체 버전의 구성은 여기에서 확인할 수 있습니다: [example_gohpts.yaml](https://github.com/shadowy-pycoder/go-http-proxy-to-socks/blob/main/resources/example_gohpts.yaml)
프록시 체인에 대해 자세히 알아보려면 [Proxychains Github](https://github.com/rofl0r/proxychains-ng)를 방문하세요.
## 투명 프록시
[[Back]](#table-of-contents)
> `인터셉팅 프록시`, `인라인 프록시` 또는 `강제 프록시`라고도 알려진 투명 프록시는 특별한 클라이언트 구성 없이 일반 애플리케이션 계층 통신을 가로챕니다. 클라이언트는 프록시의 존재를 알 필요가 없습니다. 투명 프록시는 일반적으로 클라이언트와 인터넷 사이에 위치하며, 프록시가 게이트웨이 또는 라우터의 일부 기능을 수행합니다
>
> -- _출처: [Wiki](https://en.wikipedia.org/wiki/Proxy_server)_
이 기능은 Linux 시스템과 Android(arm64)에서만 사용할 수 있으며 추가 설정(`iptables`, ip route 등)이 필요합니다
`-T address` 플래그는 투명 프록시 서버의 주소를 지정합니다
`redirect`, `tproxy`, `tlocal`(`tproxy`와 동일하지만 로컬 트래픽도 가로챔)의 세 가지 모드가 있으며 `-M` 플래그로 지정할 수 있습니다
### `redirect` (_NAT_ 및 _SO_ORIGINAL_DST_ 사용)
[[Back]](#table-of-contents)
이 모드에서 프록싱은 `iptables` `nat` 테이블과 `REDIRECT` 타겟으로 이루어집니다. 들어오는 패킷의 호스트는 실행 중인 `redirect` 투명 프록시의 주소로 변경되지만, `getsockopt(SO_ORIGINAL_DST)`로 검색할 수 있는 원래 목적지도 포함합니다
이 모드에서 `GoHPTS`를 실행하려면 `-T` 플래그와 `-M redirect`를 사용합니다
### 예제
[[Back]](#table-of-contents)```shell
# run the proxy
gohpts -s 1080 -T 1090 -M redirect -d
I'm ready to translate the Kitploit tool content from English to Korean. Please provide chunk 43 of 241.```shell
run socks5 server on 127.0.0.1:1080
ssh remote -D 1080 -Nf
운영 체제를 설정하세요:```shell
# commands below require elevated privileges (you can run it with `sudo -i`)
#enable ip forwarding
sysctl -w net.ipv4.ip_forward=1
# create `GOHPTS` nat chain
iptables -t nat -N GOHPTS
# set no redirection rules for local, http proxy, ssh and redirect proxy itself
iptables -t nat -A GOHPTS -d 127.0.0.0/8 -j RETURN
iptables -t nat -A GOHPTS -p tcp --dport 8080 -j RETURN
iptables -t nat -A GOHPTS -p tcp --dport 1090 -j RETURN
iptables -t nat -A GOHPTS -p tcp --dport 22 -j RETURN
# redirect traffic to transparent proxy
iptables -t nat -A GOHPTS -p tcp -j REDIRECT --to-ports 1090
# setup prerouting by adding our proxy
iptables -t nat -A PREROUTING -p tcp -j GOHPTS
# intercept local traffic for testing
iptables -t nat -A OUTPUT -p tcp -j GOHPTS
연결 테스트:```shell #traffic should be redirected via 127.0.0.1:1090 curl http://example.com
## 2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.```shell
#traffic should be redirected via 127.0.0.1:8080
curl --proxy http://127.0.0.1:8080 http://example.com
모든 것을 실행 취소합니다:```shell sysctl -w net.ipv4.ip_forward=0 iptables -t nat -D PREROUTING -p tcp -j GOHPTS iptables -t nat -D OUTPUT -p tcp -j GOHPTS iptables -t nat -F GOHPTS iptables -t nat -X GOHPTS
### `redirect` 모드 자동 구성
[[뒤로]](#table-of-contents)
시스템을 자동으로 구성하려면 다음 명령을 실행하세요:```shell
sudo env PATH=$PATH gohpts -d -T 8888 -M redirect -auto
자동 구성은 sudo가 필요하며 매우 일반적이므로 사용자의 요구에 적합하지 않을 수 있습니다.
선택적으로 -mark <value>를 지정하여 가능한 프록시 루프를 방지할 수 있습니다```shell
sudo env PATH=$PATH gohpts -d -T 8888 -M redirect -auto -mark 100
### `tproxy` (_MANGLE_ 및 _IP_TRANSPARENT_ 사용)
[[뒤로]](#table-of-contents)
이 모드에서는 `iptables`의 `mangle` 테이블과 `TPROXY` 타깃을 통해 프록싱이 이루어집니다. 투명 프록시는 목적지 주소를 그대로 보며, 커널에 의해 재작성되지 않습니다. 이것이 작동하려면 프록시가 소켓 옵션 `IP_TRANSPARENT`로 바인딩하고, `iptables`가 TPROXY 타깃을 사용해 트래픽을 가로채며, 라우팅 규칙이 마킹된 패킷의 원래 목적지를 변경하지 않고 로컬 프록시로 보내도록 지시합니다.
이 모드는 `GoHPTS`를 실행하기 위해 상승된 권한이 필요합니다. 다음 명령을 실행하여 이를 수행할 수 있습니다:```shell
sudo setcap 'cap_net_admin+ep' ~/go/bin/gohpts
이 모드에서 GoHPTS를 실행하려면 -M tproxy와 함께 -T 플래그를 사용합니다.
예시
[뒤로]```shell
run the proxy
gohpts -s 1080 -T 0.0.0.0:1090 -M tproxy -d
## 2.3.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.```shell
# run socks5 server on 127.0.0.1:1080
ssh remote -D 1080 -Nf
운영 체제를 설정하세요:```shell ip netns add ns-client ip link add dev veth0 type veth peer name veth1 netns ns-client ip addr add 10.0.0.1/24 dev veth0 ip link set dev veth0 up ip netns exec ns-client ip addr add 10.0.0.2/24 dev veth1 ip netns exec ns-client ip link set dev lo up ip netns exec ns-client ip link set dev veth1 up ip netns exec ns-client ip route add default via 10.0.0.1 sysctl -w net.ipv4.ip_forward=1
iptables -t mangle -A PREROUTING -i veth0 -p tcp -j TPROXY --on-port 1090 --tproxy-mark 0x1/0x1
ip rule add fwmark 1 lookup 100 ip route add local 0.0.0.0/0 dev lo table 100
연결 테스트:```shell
ip netns exec ns-client curl http://1.1.1.1
모든 것을 실행 취소합니다:```shell sysctl -w net.ipv4.ip_forward=0 iptables -t mangle -F ip rule del fwmark 1 lookup 100 ip route flush table 100 ip netns del ns-client
### `tproxy` 모드 자동 구성
[[뒤로]](#table-of-contents)
시스템을 자동으로 구성하려면 다음 명령을 실행하세요 (예: 별도의 VM에서):```shell
ssh remote -D 1080 -Nf
sudo env PATH=$PATH gohpts -d -T 8888 -M tproxy -auto -mark 100
호스트에서 다음을 실행하세요:```shell ip route show default > /tmp/default-route.txt
ip route add 0.0.0.0/1 via 192.168.0.1 # change with ip of your VM ip route add 128.0.0.0/1 via 192.168.0.1
연결 테스트:```shell
curl http://example.com #check logs on your VM
모든 것을 되돌립니다:```shell ip route del 0.0.0.0/1 via 192.168.0.1 2>/dev/null || true ip route del 128.0.0.0/1 via 192.168.0.1 2>/dev/null || true
if [[ -f /tmp/default-route.txt ]]; then eval $(awk '{print "ip route add "$0}' /tmp/default-route.txt) rm -f /tmp/default-route.txt else echo "Something went wrong" fi
### UDP 지원
[[뒤로]](#table-of-contents)
`GoHPTS`는 `tproxy` 및 `tlocal` 모드에서 활성화할 수 있는 UDP 지원을 제공합니다. 이 설정이 작동하려면 UDP 연결(`UDP ASSOCIATE`)을 처리할 수 있는 socks5 서버에 연결해야 합니다. 예를 들어, [https://github.com/wzshiming/socks5](https://github.com/wzshiming/socks5)를 사용하여 원격 또는 로컬 머신에 UDP를 지원하는 socks5 서버를 배포할 수 있습니다. 연결할 서버가 준비되면 다음 명령을 실행하세요:```shell
sudo env PATH=$PATH gohpts -s remote -Tu :8989 -M tproxy -auto -mark 100 -d
이 명령은 운영 체제를 구성하고 0.0.0.0:8989 주소에 서버를 설정합니다.
로컬에서 테스트하려면 UDP 투명 프록시를 -arpspoof 플래그와 함께 사용할 수 있습니다. 예를 들어:
tproxy를 지원하는 Linux 배포판(Kali Linux 등)으로 시스템에 VM을 설정합니다.- VM이 호스트 머신에 접근할 수 있도록
bridged네트워크를 활성화합니다. gohpts바이너리를 VM으로 이동하거나(ssh등을 통해), OS/아키텍처가 다른 경우 VM에서 빌드합니다.- VM에서 다음 명령을 실행합니다:```shell
Do not forget to replace and with actual addresses
sudo ./gohpts -s -T 8888 -Tu :8989 -M tproxy -sniff -body -auto -mark 100 -d -arpspoof "targets ;fullduplex true;debug false"
5. 호스트 머신에서 연결을 확인하세요. 트래픽은 Kali 머신을 통해 흘러야 합니다.
### Android 지원
[[뒤로]](#table-of-contents)
투명 프록시는 루트 권한이 있는 Android 기기(arm64)에서 활성화할 수 있습니다. [Termux](https://github.com/termux/termux-app)를 설치하고 그곳에서 `GoHPTS`를 CLI 도구로 실행할 수 있습니다:```shell
# you need to root your device first
pkg install tsu iproute2
# Android support added in v1.10.2
GOHPTS_RELEASE=v1.10.2; wget -v https://github.com/shadowy-pycoder/go-http-proxy-to-socks/releases/download/$GOHPTS_RELEASE/gohpts-$GOHPTS_RELEASE-android-arm64.tar.gz -O gohpts && tar xvzf gohpts && mv -f gohpts-$GOHPTS_RELEASE-android-arm64 gohpts && ./gohpts -h
# use your phone as router for LAN devices redirecting their traffic to remote socks5 server
sudo ./gohpts -s remote -T 8888 -Tu :8989 -M tproxy -sniff -body -auto -mark 100 -d -arpspoof "fullduplex true;debug false"
YAML 구성
[뒤로]```yaml transparent_proxy: tcp: enabled: true address: 0.0.0.0:8888 # number of instances of transparent proxy server (Default: number of CPU cores) workers: 1 udp: enabled: true address: 0.0.0.0:8889 # number of instances of transparent UDP proxy server (Default: number of CPU cores) workers: 1 mode: "tproxy" # available modes are "redirect", "tproxy" and "tlocal" (udp requires tproxy or tlocal mode)
automatically setup iptables and kernel parameters for transparent proxy (requires elevated privileges)
auto: true
dump iptables rules and other system settings generated by auto setting
dump_rules: false
list of ports to ignore when proxying traffic (Example: [22,80,443,9092])
ignored_ports: []
set mark for each packet sent through transparent proxy (Default: redirect 0, tproxy 100, tlocal 100)
mark: 100
## 트래픽 스니핑
[[뒤로]](#table-of-contents)
<p align="center"><img alt="MrGopher" src="https://assets.kitploit.com/production/public/readmes/11401/ac38691c0f511a6265baf784c236e4ca9557e6c2b7744271f09b1b657af92ca7.png"/>
`GoHPTS` 프록시를 사용하면 서비스를 통과하는 트래픽을 캡처하고 모니터링할 수 있습니다. 이 과정은 `트래픽 스니핑`, `패킷 스니핑` 또는 간단히 `스니핑`이라고 알려져 있습니다. 특히, 프록시는 해당 트래픽이 일반 텍스트(HTTP)인지 TLS 트래픽인지 식별하려고 시도하며, 식별이 완료되면 요청/응답 메타데이터를 파싱하여 파일이나 콘솔에 기록합니다. `GoHTPS` 프록시의 경우 파싱된 메타데이터는 다음과 같은 형태입니다(TLS 핸드셰이크):
### JSON 형식
[[뒤로]](#table-of-contents)```json
[
{
"connection": {
"tproxy_mode": "redirect",
"src_local": "127.0.0.1:8888",
"src_remote": "192.168.0.107:51142",
"dst_local": "127.0.0.1:56256",
"dst_remote": "127.0.0.1:1080",
"original_dst": "216.58.209.206:443"
}
},
{
"tls_request": {
"sni": "www.youtube.com",
"type": "Client hello (1)",
"version": "TLS 1.2 (0x0303)",
"session_id": "2670a6779b4346e5e84d46890ad2aaf7a53b08adcfe0c9f6868c2d9882242e39",
"cipher_suites": [
"TLS_AES_128_GCM_SHA256 (0x1301)",
"TLS_CHACHA20_POLY1305_SHA256 (0x1303)",
"TLS_AES_256_GCM_SHA384 (0x1302)",
"TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 (0xc02b)",
"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)",
"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 (0xcca9)",
"TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (0xcca8)",
"TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 (0xc02c)",
"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (0xc030)",
"TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (0xc00a)",
"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (0xc009)",
"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (0xc013)",
"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (0xc014)",
"TLS_RSA_WITH_AES_128_GCM_SHA256 (0x9c)",
"TLS_RSA_WITH_AES_256_GCM_SHA384 (0x9d)",
"TLS_RSA_WITH_AES_128_CBC_SHA (0x2f)",
"TLS_RSA_WITH_AES_256_CBC_SHA (0x35)"
],
"extensions": [
"server_name (0)",
"extended_master_secret (23)",
"renegotiation_info (65281)",
"supported_groups (10)",
"ec_point_formats (11)",
"session_ticket (35)",
"application_layer_protocol_negotiation (16)",
"status_request (5)",
"delegated_credential (34)",
"signed_certificate_timestamp (18)",
"key_share (51)",
"supported_versions (43)",
"signature_algorithms (13)",
"psk_key_exchange_modes (45)",
"record_size_limit (28)",
"compress_certificate (27)",
"encrypted_client_hello (65037)"
],
"alpn": ["h2", "http/1.1"]
}
},
{
"tls_response": {
"type": "Server hello (2)",
"version": "TLS 1.2 (0x0303)",
"session_id": "2670a6779b4346e5e84d46890ad2aaf7a53b08adcfe0c9f6868c2d9882242e39",
"cipher_suite": "TLS_AES_128_GCM_SHA256 (0x1301)",
"extensions": ["key_share (51)", "supported_versions (43)"],
"supported_version": "TLS 1.3 (0x0304)"
}
}
]
curl을 사용한 HTTP 요청:```json [ { "connection": { "tproxy_mode": "redirect", "src_local": "127.0.0.1:8888", "src_remote": "192.168.0.107:45736", "dst_local": "127.0.0.1:37640", "dst_remote": "127.0.0.1:1080", "original_dst": "96.7.128.198:80" } }, { "http_request": { "host": "example.com", "uri": "/", "method": "GET", "proto": "HTTP/1.1", "header": { "Accept": ["/"], "My": ["Header"], "User-Agent": ["curl/7.81.0"] } } }, { "http_response": { "proto": "HTTP/1.1", "status": "200 OK", "content-length": 1256, "header": { "Cache-Control": ["max-age=2880"], "Connection": ["keep-alive"], "Content-Length": ["1256"], "Content-Type": ["text/html"], "Date": ["Tue, 17 Jun 2025 14:43:24 GMT"], "Etag": [""84238dfc8092e5d9c0dac8ef93371a07:1736799080.121134""], "Last-Modified": ["Mon, 13 Jan 2025 20:11:20 GMT"] } } } ]
`-sniff` 플래그를 일반 플래그와 함께 지정하는 것만큼 간단하게 사용할 수 있습니다```shell
gohpts -d -T 8888 -M redirect -sniff -j
스니핑한 트래픽을 기록할 파일을 지정할 수도 있습니다:```shell gohpts -sniff -snifflog ~/sniff.log -j
### 컬러 형식
[[뒤로]](#table-of-contents)
위 그림에서 컬러 출력의 예시를 볼 수 있습니다. 이 모드에서 `GoHPTS`는 TLS Handshake, HTTP 메타데이터, 로그인/비밀번호처럼 보이는 것 또는 다양한 유형의 인증 및 비밀 토큰과 같은 중요한 정보를 강조하려고 시도합니다. 출력은 JSON에 비해 제한적이지만 사람이 읽기에는 훨씬 쉽습니다.
이 모드에서 `GoHPTS`를 실행하려면 다음 플래그를 사용합니다:```shell
gohpts -sniff -body
스니핑을 투명 모드와 결합할 수 있습니다:```shell ./gohpts -T 8888 -M redirect -sniff -body
색상 비활성화하려면 `-nocolor`를 추가하세요:```shell
gohpts -sniff -body -nocolor
HTTP2 및 HTTP3 지원
GoHPTS 프록시는 동일한 서버 주소와 TLS 인증서를 사용하여 HTTP/1.1, HTTP/2, HTTP/3 요청을 처리합니다. 이를 통해 클라이언트는 구성을 변경하지 않고도 사용 가능한 최적의 프로토콜을 자동으로 선택할 수 있습니다. TLS 인증서는 여러 가지 방법으로 얻을 수 있습니다: 클라우드 제공업체(Google, AWS, Cloudflare), Let's Encrypt의 무료 인증서, 또는 openssl(Linux/macOS)이나 New-SelfSignedCertificate(Windows)를 사용하여 자체 서명 인증서를 생성할 수 있습니다.
자체 서명 인증서를 사용한 예제 설정
key.pem및cert.pem파일 생성: ```shell openssl req -x509 -newkey rsa:2048
-keyout key.pem
-out cert.pem
-sha256
-days 365
-nodes
-subj "/C=XX/ST=StateName/L=CityName/O=CompanyName/OU=CompanySectionName/CN=127.0.0.1"
-addext "subjectAltName=IP:127.0.0.1"- UDP ASSOCIATE를 지원하는 socks5 서버를 준비합니다 ```shell
git clone https://github.com/wzshiming/socks5.git && cd socks5
go build -o socks5_server ./cmd/socks5/main.go
./socks5_server -a 0.0.0.0:1080
- 다른 터미널을 열고
GoHPTS프록시를 설치합니다: ```shell go install github.com/shadowy-pycoder/go-http-proxy-to-socks/cmd/gohpts@latest
Installation 섹션에 설명된 다른 방법을 사용할 수 있습니다.
-
마지막으로:
- 프록시를 위한 최소 설정을 생성하세요 ```yaml
gohpts_config.yaml
http_server: address: 127.0.0.1:8080 cert_file: ./cert.pem key_file: ./key.pem
proxy_list:
- address: 127.0.0.1:1080
logging: debug: true
sniffing: enabled: true body: true
프록시를 실행합니다: ```shell gohpts -f ./gohpts_config.yaml
2. 또는 명령줄 인수를 선호하는 경우: ```shell
gohpts -l :8080 -s 1080 -c ./cert.pem -k ./key.pem -d -sniff -body
다음과 같은 내용이 표시되어야 합니다: ```shell [15:20:32] INF SOCKS5 Proxy: 127.0.0.1:1080 [15:20:32] INF HTTPS Proxy: 127.0.0.1:8080 [15:20:32] INF HTTP3 Proxy (QUIC): 127.0.0.1:8080
### 연결 테스트
[[뒤로]](#table-of-contents)
- HTTP/2 프록시 서버의 경우 `curl`을 사용할 수 있습니다: ```shell
curl -Nvk --http2 --proxy-insecure --proxy-http2 --proxy https://localhost:8080 "https://stream.wikimedia.org/v2/stream/recentchange"
Ctrl+C를 눌러 실행 중인 스트림을 중지합니다.
-
HTTP/3의 경우 (작성 시점 기준)
curl이 HTTP3 프록시를 지원하지 않기 때문에 다릅니다. 따라서 테스트 목적으로 만든 사용자 정의 클라이언트를 사용하겠습니다.Simple HTTP3 to SOCKS5 proxy example을 다운로드하고 설치합니다: ```shell git clone https://github.com/shadowy-pycoder/http3-socks-proxy.git && cd http3-socks-proxy make
다음 명령어를 실행하세요: ```shell ./bin/client -a 127.0.0.1:8080 www.google.com
HTML 페이지와 유사한 알아볼 수 없는 문자열이 보일 것입니다.
`GoHPTS` 프록시가 있는 터미널 탭으로 이동하여 로그를 확인하면 모든 요청이 표시됩니다.
### 브라우저에서 연결 테스트
[[뒤로]](#table-of-contents)
- 브라우저용 적절한 자체 서명 인증서 생성: ```shell
git clone https://github.com/shadowy-pycoder/go-http-proxy-to-socks.git
cd go-http-proxy-to-socks
cp ./resources/makecert.sh makecert.sh && chmod +x makecert.sh
./makecert.sh
More information can be found here: Creating a browser trusted, self signed, SSL certificate
- 새로 생성한
rootCA.crt를 시스템 신뢰 저장소에 추가합니다:- Debian/Ubuntu: ```shell sudo cp rootCA.crt /usr/local/share/ca-certificates/rootCA.crt sudo update-ca-certificates
- Arch Linux/CachyOS/EndeavourOS: ```shell sudo trust anchor rootCA.crt
- `server.crt`와 `server.key`를 사용하여 프록시를 실행합니다: ```shell
gohpts -l :8080 -s 1080 -c ./server.crt -k ./server.key -d -sniff -body
- 브라우저를 실행하고 아무 웹사이트로 이동합니다: ```shell
chromium --proxy-server="https://127.0.0.1:8080"
IPv4 및 IPv6 지원
네트워크 계층 처리 측면에서 GoHPTS는 dual stack, IPv4-only, IPv6-only의 세 가지 모드로 동작할 수 있습니다. 사용자는 -4 및 -6 플래그를 지정하여 모드를 제어할 수 있습니다. 플래그 중 하나가 설정되면 프록시는 해당 모드로 시작하고, 두 플래그가 모두 있거나 모두 생략되면 dual stack으로 간주됩니다. "only" 모드에서는 특정 버전의 IP 주소만 허용되고, 모든 도메인은 특정 IP 버전으로 확인되며(가능한 경우), 모든 수신 주소는 동일한 버전을 사용해야 한다는 점에 유의하십시오.
IPv4-only 모드를 활성화하려면 -4 플래그를 추가하기만 하면 됩니다:```shell
sudo ./gohpts -sniff -body -d -4
IPv4 모드에서 프록시를 테스트하려면 아무 Linux VM이나 사용할 수 있습니다:
1. 가상 머신에서:```shell
# add your host machine as gateway for VM
export GATEWAY="<host IPv4 address>"
ip route add 0.0.0.0/1 via "$GATEWAY"
ip route add 128.0.0.0/1 via "$GATEWAY"
- 호스트에서:```shell
run proxy on your host
sudo ./gohpts -T 8888 -Tu 8889 -M tproxy -sniff -body -auto -d -4
3. 가상 머신에서 아무 웹사이트나 방문하고 프록시 로그에서 트래픽을 확인하세요
`IPv6-only` 모드를 활성화하려면 `-6` 플래그를 추가하기만 하면 됩니다. 예를 들어 투명 프록시와 함께 사용할 때는 다음과 같습니다:```shell
sudo ./gohpts -T 8888 -M redirect -sniff -body -auto -mark 100 -d -6
이것이 작동하려면 ISP와 원격 socks5 프록시가 활성 IPv6를 지원해야 합니다. https://test-ipv6.com/을 방문하여 IPv6 주소에 접근할 수 있는지 확인할 수 있습니다. IPv6 모드에서 프록시를 테스트하려면 아무 Linux VM을 사용할 수 있습니다:
- 가상 머신에서:```shell
add your host machine as gateway IPv6 for VM
export GATEWAY6="" ip -6 route add ::/1 via "$GATEWAY6" dev eth0 ip -6 route add 8000::/1 via "$GATEWAY6" dev eth0
2. 호스트에서:```shell
# run proxy on your host
sudo ./gohpts -T 8888 -Tu 8889 -M tproxy -sniff -body -auto -d -6
- 가상 머신에서 아무 웹사이트나 방문하고 프록시 로그에서 트래픽을 확인하세요
ARP 스푸핑
GoHPTS에는 내장 ARP 스푸퍼가 있어 LAN의 모든 TCP 통신 장치가 인터넷에 연결할 때 프록시 서버를 사용하도록 만들 수 있습니다.
이는 -arpspoof 플래그와 세미콜론으로 구분된 몇 가지 매개변수를 추가하여 수행됩니다.
예시:```shell ssh remote -D 1080 -Nf sudo env PATH=$PATH gohpts -d -T 8888 -M tproxy -sniff -body -auto -mark 100 -arpspoof "targets 192.168.10.0/24;fullduplex true;debug true"
Proxy는 서브넷 `192.168.10.0/24`에서 장치를 스캔하고, `fullduplex`가 true이면 게이트웨이인 척하기 위해 ARP 패킷을 전송합니다.
proxy는 게이트웨이에도 ARP 패킷을 전송하여 우리 proxy가 서브넷의 각 IP를 가지고 있다고 믿게 만듭니다.
`Ctrl+C`로 proxy를 중지하면 모든 대상에 대한 스푸핑을 자동으로 해제합니다.
`GoHPTS`는 [Bettercap](https://github.com/bettercap/bettercap)과 같은 도구와 함께 사용하여 ARP 스푸핑된 트래픽을 프록시할 수도 있습니다.
프록시를 실행합니다:```shell
ssh remote -D 1080 -Nf
sudo env PATH=$PATH gohpts -d -T 8888 -M tproxy -sniff -body -auto -mark 100
bettercap을 다음 명령으로 실행하세요 (문서 참조):```shell
sudo bettercap -eval "net.probe on;net.recon on;set arp.spoof.fullduplex true;arp.spoof on"
LAN의 다른 장치에서 오는 트래픽에 대해 프록시 로그를 확인하세요
arpspoof 옵션에 대한 자세한 내용은 `gohpts -h` 및 [https://github.com/shadowy-pycoder/arpspoof](https://github.com/shadowy-pycoder/arpspoof)를 참조하세요
## NDP 스푸핑
[[뒤로]](#table-of-contents)
`GoHPTS`에는 Router Advertisement (RA) 및 Neighbor Advertisement (NA) 패킷을 사용하여 IPv6 네트워크에서 NDP 스푸핑을 수행하는 기능이 내장되어 있습니다. 또한 RA 패킷에 RDNSS 옵션을 포함하여 영향을 받는 클라이언트의 IPv6 네임서버로 호스트를 설정할 수 있습니다. 투명 프록시 모드(TCP/UDP)와 결합하면 NDP 스푸핑을 통해 `gohpts`가 로컬 네트워크의 클라이언트 트래픽을 프록시할 수 있습니다. [ARP 스푸핑](#arp-spoofing)의 경우와 마찬가지로, 단일 `-ndpspoof` 플래그로 ndp 스푸핑 옵션을 설정할 수 있습니다:
예:```shell
sudo env PATH=$PATH gohpts -d -T 8888 -M tproxy -sniff -body -auto -mark 100 -ndpspoof "ra true;na true;targets fe80::3a1c:7bff:fe22:91a4;fullduplex false;debug true"
ndpspoof 옵션에 대한 자세한 내용은 gohpts -h 및 https://github.com/shadowy-pycoder/ndpspoof를 참조하세요.
rdnss, gateway, interface와 같은 일부 옵션은 gohpts 자체에서 프록시로 제대로 작동하기 위해 자동으로 설정된다는 점에 유의하세요.
gohpts는 모든 연결을 업스트림 SOCKS5 서버를 통해 프록시하므로, IPv4/IPv6 및 TCP/UDP를 지원하는 작동하는 서버가 필요합니다. 당연히 원격 머신(예: VPS)도 IPv6 연결이 작동해야 합니다. 말할 필요도 없이, gohpts가 실행되는 머신도 IPv6를 지원하는 네트워크에 속해 있어야 합니다.
NDP 스푸핑이 제대로 작동하기 위한 예시 설정:
- VPS에 연결```shell ssh [email protected]
2. 종속성 설치```shell
GO_VERSION=$(curl 'https://go.dev/VERSION?m=text' | head -n1)
cd ~/Downloads/ && wget https://go.dev/dl/$GO_VERSION.linux-amd64.tar.gz
sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf $GO_VERSION.linux-amd64.tar.gz
- SOCKS5 서버 설정 (사용하는 포트를 방화벽 규칙이 차단하지 않는지 확인)```shell git clone https://github.com/wzshiming/socks5.git && cd socks5 go build -o ./bin/socks5_server ./cmd/socks5/*.go ./bin/socks5_server -a :3000
4. 호스트 머신으로 돌아가서 `gohpts`를 설치합니다 ([설치](#installation) 참조)
5. `gohtps`를 실행합니다:```shell
gohpts -s 203.0.113.10:3000 -T 8888 -Tu 8889 -M tproxy -sniff -body -auto -mark 100 -arpspoof "fullduplex true;debug true" -ndpspoof "ra true;debug true" -4 -6 -d
-
다른 기기(휴대폰, 태블릿 등)를 가져와 같은 네트워크에 연결합니다. 인터넷에 접속을 시도하고 호스트 머신에 트래픽이 나타나는지 확인합니다. 일부 온라인 도구로 공인 IP 주소를 확인합니다(이 경우 VPS 주소
203.0.113.10또는 글로벌 IPv6 주소와 일치해야 함) -
Ctrl+C를 눌러 프록시를 중지합니다
-
이득!
DNS 스푸핑
DNS 필터를 적용하고 DNS 레코드를 변경하여 대상을 스푸핑하려면, GoHPTS를 실행하는 호스트가 LAN 장치의 기본 게이트웨이가 되어야 합니다. 이렇게 하려면 udp가 활성화된 투명 프록시를 실행하고 ARP/NDP 스푸핑도 실행하여 대상이 귀하의 DNS 서버를 사용하도록 하면 됩니다.
GoHPTS가 생성하는 DNS 응답은 라우터나 신뢰할 수 있는 DNS 서버(Google, Cloudflare)에서 오는 정상 패킷처럼 보이며, 그 결과 클라이언트는 귀하가 알려준 내용으로 캐시를 업데이트합니다. 그러나 이는 "표준" 비암호화 DNS 트래픽에만 작동한다는 점을 명심하십시오(DOT/DOH는 필터링되거나 스푸핑되지 않음).
DNS 필터와 스푸핑할 도메인은 yaml 파일 구성의 dns_filter 섹션에서 구성할 수 있습니다. 모든 목록은 URL, 파일 경로, 그리고 일반적으로 hosts 파일에서 볼 수 있는 것과 유사한 항목을 허용합니다. https://en.wikipedia.org/wiki/Hosts_(file)>)를 참조하십시오.
예:```yaml
dns filters require udp transparent proxy and arpspoof/ndpspoof
filters accept hosts like entries (use either links, file paths or just plain comma separated lists
dns_filter: enabled: true whitelist: ["/tmp/whitelisted_domains.txt", "example.com", "*.google.com"] # ip is optional, domains can start with *. to match all subdomains blacklist: ["https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts"] blacklist_all: false # block all non whitelisted domains spooflist: ["127.0.0.1 example.com"] # ip address is required here
사용 사례:
- 모든 LAN 장치에 대한 광고 및 추적기 차단
- 특정 웹사이트 카테고리 차단을 통한 자녀 보호
- 알려진 피싱 및 멀웨어 도메인 차단
- 분석을 위한 트래픽 리디렉션
- 리디렉션을 통한 자격 증명 수집
- 트래픽 하이재킹 및 조작 (광고, 스크립트, 추적 삽입)
- 감시 및 프로파일링
이 설정을 위한 최소 구성:```yaml
# gohpts_dns_spoof.yaml
proxy_list:
- address: 127.0.0.1:1080 # point to socks5 server supporting TCP/UDP
sniffing:
enabled: true
body: true
transparent_proxy:
tcp:
enabled: true
address: 0.0.0.0:8888
udp:
enabled: true
address: 0.0.0.0:8889
mode: "tproxy"
auto: true
arpspoof:
enabled: true
settings: "fullduplex 1;debug 1;interval 1s"
dns_filter:
enabled: true
whitelist: []
blacklist: [
"https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts",
] # list of domains to filter
blacklist_all: true
# all requests for example.com will be redirected to 0.0.0.0 address
spooflist: ["0.0.0.0 example.com"]
실행:```shell sudo ./gohpts -f ./gohpts_dns_spoof.yaml
추가 정보는 여기에서 확인할 수 있습니다: [https://en.wikipedia.org/wiki/DNS_spoofing](https://en.wikipedia.org/wiki/DNS_spoofing)
## 패킷 캡처
[[뒤로]](#table-of-contents)
트래픽은 pcap, pcapng 또는 사용자 정의 txt 형식으로 캡처할 수 있으며, 이후 Wireshark, tcpdump 등 여러 도구로 분석할 수 있습니다.
먼저, `GoHPTS` 실행 파일이 원시 패킷을 캡처할 수 있도록 상승된 권한을 가지고 있는지 확인해야 합니다. 두 가지 옵션이 있습니다:
- `sudo setcap cap_net_raw+ep ~/go/bin/gohpts`를 한 번 실행하여 프록시에 원시 트래픽 접근 권한을 부여합니다
- CLI에서 `-pcap` 플래그를 지정하거나 파일 구성에서 `pcap.enabled`를 지정해야 할 때 `sudo`로 프록시를 실행합니다.
CLI를 사용하여 프록시를 구성합니다:```shell
gohpts -pcap "promisc true;timeout 10s;exts txt,pcap,pcapng"
구성 파일:```yaml pcap: enabled: true settings: "promisc true;expr ip proto tcp;snaplen 65535;timeout 10s;packet_count 100;packet_buffer 8192;exts txt,pcap,pcapng"
이 명령들은 나중에 다양한 도구로 분석할 수 있는 해당 형식의 세 개의 패킷 캡처 파일을 생성합니다.
pcap 옵션에 대한 자세한 내용은 `gohpts -h` 및 [https://github.com/shadowy-pycoder/mshark](https://github.com/shadowy-pycoder/mshark)를 참조하십시오.
## 네트워크 네임스페이스
[[뒤로]](#table-of-contents)
기본적으로 `GoHPTS` 프록시는 단일 네트워크 네임스페이스 내에서 실행되지만 이는 재정의될 수 있습니다. `GoHPTS`가 생성하는 리스닝 소켓(예: http 서버 또는 투명 프록시 서버)과 아웃바운드 소켓(socks 프록시 또는 직접 다이얼러)은 Linux/Android [network_namespaces (7)](https://man7.org/linux/man-pages/man7/network_namespaces.7.html)로 격리될 수 있습니다. 프록시 프로세스를 시작할 때 사용자는 `-in-netns`(리스너) 및 `-out-netns`(다이얼러) 플래그에 네트워크 네임스페이스의 이름이나 경로를 지정하여 소켓을 생성할 격리된 환경을 제어할 수 있습니다. 리스너나 다이얼러를 현재(기본) 네임스페이스에서 생성하려면 플래그를 생략하면 됩니다. 호스트 네임스페이스를 명시적으로 지정하려면 경로 `/proc/1/ns/net`을 사용할 수 있습니다. 이를 통해 프록시가 시스템 네임서버를 올바르게 식별할 수 있습니다.
`GoHPTS`는 `/etc/netns/NAME/` 디렉터리에 있는 파일을 통해 네트워크 구성을 제공하는 [ip-netns (8)](https://man7.org/linux/man-pages/man8/ip-netns.8.html) 규칙을 지원합니다. 따라서 `ns1` 네트워크 네임스페이스에 대한 사용자 지정 네임서버를 지정하려면 다음과 같이 합니다:```shell
sudo mkdir -p /etc/netns/ns1
sudo tee /etc/netns/ns1/resolv.conf << EOF
nameserver 8.8.8.8
nameserver 2001:4860:4860:0:0:0:0:8888
EOF
구성이 없으면 Google DNS 서버가 도메인 이름을 확인하는 데 사용됩니다.
시스템에 systemd-resolved.service (8)가 활성화되어 있다면, 사용자 지정 네트워크 네임스페이스를 통해 쿼리를 수행할 때 일시적으로 비활성화하는 것이 좋습니다:```shell sudo ip netns exec ns1 unshare --mount bash -c ' mount --bind /dev/null /run/systemd/resolve/io.systemd.Resolve curl -Nvk https://example.com'
또는 특정 셸 인스턴스에 대해 영구적으로 설정하려면:```shell
sudo ip netns exec ns1 unshare --mount bash -c '
mount --bind /dev/null /run/systemd/resolve/io.systemd.Resolve
exec bash --login'
플레이그라운드 설정
- UDP ASSOCIATE를 지원하는 socks5 서버 실행 ```shell
git clone https://github.com/wzshiming/socks5.git && cd socks5
go build -o socks5_server ./cmd/socks5/main.go
./socks5_server -a 0.0.0.0:1080
- Simple HTTP3 to SOCKS5 proxy example을 다운로드하여 설치합니다: ```shell
git clone https://github.com/shadowy-pycoder/http3-socks-proxy.git
cd http3-socks-proxy
make
- 저장소를 클론하고 컴파일 ```shell
git clone https://github.com/shadowy-pycoder/go-http-proxy-to-socks.git
cd go-http-proxy-to-socks
make
key.pem및cert.pem파일을 생성합니다: ```shell openssl req -x509 -newkey rsa:2048
-keyout key.pem
-out cert.pem
-sha256
-days 365
-nodes
-subj "/C=XX/ST=StateName/L=CityName/O=CompanyName/OU=CompanySectionName/CN=127.0.0.1"
-addext "subjectAltName=IP:127.0.0.1"- 네트워크 네임스페이스
ns1을 생성하고 veth 네트워크를 구성합니다 ```shell sudo ip netns add ns1 sudo ip link add dev veth0 type veth peer name veth1 netns ns1 sudo ip addr add 10.0.0.1/24 dev veth0 sudo ip -6 addr add fd12:3456:789a::1/64 dev veth0 sudo ip link set dev veth0 up sudo ip netns exec ns1 ip addr add 10.0.0.2/24 dev veth1 sudo ip netns exec ns1 ip -6 addr add fd12:3456:789a::2/64 dev veth1 sudo ip netns exec ns1 ip link set dev lo up sudo ip netns exec ns1 ip link set dev veth1 up - 로컬 socks5에 연결할 수 있도록
wlan0IP 주소를 확인합니다 ```shell WLAN_IP=$(ip -4 -c=never route get 8.8.8.8 | awk '{print $7}' | tr -d '\n')
사용 예시
-
HTTP 프록시 -
ns1의 프록시 리스너(기본 경로 없음, 인터넷 접근 불가), 호스트의 아웃바운드 소켓프록시 실행: ```shell sudo ./bin/gohpts -s 0.0.0.0:1080 -l :8083 -4 -6 -d -sniff -body -in-netns ns1
ns1을 통해 요청을 보냅니다 ```shell
sudo ip netns exec ns1 curl -Nv --proxy http://127.0.0.1:8083 https://example.com
요청이 성공해야 함
2. **HTTP2 프록시 - `ns1`의 프록시 리스너(기본 라우트 없음, 인터넷 접근 불가), 호스트의 아웃바운드 소켓**
프록시 실행: ```shell
sudo ./bin/gohpts -s 0.0.0.0:1080 -l :8083 -4 -6 -d -sniff -body -in-netns ns1 -c ./cert.pem -k ./key.pem
ns1을 통해 요청을 보냅니다 ```shell
sudo ip netns exec ns1 curl -Nvk --http2 --proxy-insecure --proxy-http2 --proxy https://127.0.0.1:8083 https://example.com
요청이 성공해야 함
3. **HTTP3 프록시 - `ns1`의 프록시 리스너(기본 경로 없음, 인터넷 접근 불가), 호스트의 아웃바운드 소켓**
프록시 실행: ```shell
sudo ./bin/gohpts -s 0.0.0.0:1080 -l :8083 -4 -6 -d -sniff -body -in-netns ns1 -c ./cert.pem -k ./key.pem
ns1을 통해 요청을 보냅니다 ```shell
sudo ip netns exec ns1 ./http3-socks-proxy/bin/client -a 127.0.0.1:8083 www.google.com
요청이 성공해야 함
4. **투명 리다이렉트 프록시 (`-M redirect`) - `ns1`의 프록시 리스너 (기본 경로, 인터넷 접근 불가), 호스트의 아웃바운드 소켓**
프록시 실행: ```shell
sudo ./bin/gohpts -s 0.0.0.0:1080 -l :8083 -4 -6 -d -sniff -body -in-netns ns1 -nohttp -M redirect -T :8888 -auto
ns1을 통해 요청을 보냅니다 ```shell
sudo ip netns exec ns1 curl -Nv https://example.com
요청이 실패해야 함
`ns1`에 기본 경로 추가 ```shell
sudo ip netns exec ns1 ip route add default via 10.0.0.1
sudo ip netns exec ns1 ip -6 route add default via fd12:3456:789a::1
다시 시도하세요 ```shell sudo ip netns exec ns1 curl -Nv https://example.com
이제 요청이 성공해야 합니다
5. **HTTP 프록시 - 호스트의 프록시 리스너, `ns1`의 아웃바운드 소켓 (기본 경로, 인터넷 접근)**
`ns1`이 `wlan0`을 통해 인터넷에 연결할 수 있도록 NAT 규칙 추가 ```shell
sudo iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o wlan0 -j MASQUERADE
sudo ip6tables -t nat -A POSTROUTING -s fd12:3456:789a::/64 -o wlan0 -j MASQUERADE
프록시 실행: ``` sudo ./bin/gohpts -s :1080 -l :8083 -4 -6 -d -sniff -body -out-netns ns1 -i wlan0
호스트를 통해 요청 보내기 ```shell
curl -Nv --proxy http://$WLAN_IP:8083 https://example.com
요청이 성공해야 함
-
HTTP3 프록시 - 호스트의 프록시 리스너,
ns1의 아웃바운드 소켓 (기본 라우트, 인터넷 접근)프록시 실행: ``` sudo ./bin/gohpts -s :1080 -l :8083 -4 -6 -d -sniff -body -out-netns ns1 -i wlan0 -c ./cert.pem -k ./key.pem
호스트를 통해 요청 보내기 ```shell ./http3-socks-proxy/bin/client -a $WLAN_IP:8083 www.google.com
요청이 성공해야 합니다
7. **투명 프록시 리디렉션 - 호스트의 프록시 리스너, `ns1`의 아웃바운드 소켓 (기본 라우트, 인터넷 접근)**
프록시 실행 (`-auto`는 로컬 socks5 서버에서는 작동하지 않아서 원격 서버를 사용합니다): ```
sudo ./bin/gohpts -s <remote> -4 -6 -d -sniff -body -out-netns ns1 -nohttp -M redirect -T :8888 -auto
호스트를 통해 요청 보내기 ```shell curl -Nv https://example.com
요청이 성공해야 함
8. **HTTP 프록시 - LAN (`ns2` (프록시 리스너), `ns3`, `ns4`), `ns1`의 아웃바운드 소켓 (기본 라우트, 인터넷 접근)**
LAN 생성 ```shell
sudo ip link add br0 type bridge
sudo ip addr add 10.0.1.1/24 dev br0
sudo ip -6 addr add fd12:3456:789b::1/64 dev br0
sudo ip link set br0 up
sudo ip netns add ns2
sudo ip link add veth2 type veth peer name veth3 netns ns2
sudo ip link set veth2 master br0
sudo ip link set veth2 up
sudo ip netns exec ns2 ip addr add 10.0.1.2/24 dev veth3
sudo ip netns exec ns2 ip -6 addr add fd12:3456:789b::2/64 dev veth3
sudo ip netns exec ns2 ip link set lo up
sudo ip netns exec ns2 ip link set veth3 up
sudo ip netns exec ns2 ip route add default via 10.0.1.1
sudo ip netns exec ns2 ip -6 route add default via fd12:3456:789b::1
sudo ip netns add ns3
sudo ip link add veth4 type veth peer name veth5 netns ns3
sudo ip link set veth4 master br0
sudo ip link set veth4 up
sudo ip netns exec ns3 ip addr add 10.0.1.3/24 dev veth5
sudo ip netns exec ns3 ip -6 addr add fd12:3456:789b::3/64 dev veth5
sudo ip netns exec ns3 ip link set lo up
sudo ip netns exec ns3 ip link set veth5 up
sudo ip netns exec ns3 ip route add default via 10.0.1.1
sudo ip netns exec ns3 ip -6 route add default via fd12:3456:789b::1
sudo ip netns add ns4
sudo ip link add veth6 type veth peer name veth7 netns ns4
sudo ip link set veth6 master br0
sudo ip link set veth6 up
sudo ip netns exec ns4 ip addr add 10.0.1.4/24 dev veth7
sudo ip netns exec ns4 ip -6 addr add fd12:3456:789b::4/64 dev veth7
sudo ip netns exec ns4 ip link set lo up
sudo ip netns exec ns4 ip link set veth7 up
sudo ip netns exec ns4 ip route add default via 10.0.1.1
sudo ip netns exec ns4 ip -6 route add default via fd12:3456:789b::1
프록시 실행: ``` sudo ./bin/gohpts -s $WLAN_IP:1080 -l 0.0.0.0:8083 -4 -6 -d -sniff -body -in-netns ns2 -out-netns ns1
요청 보내기 ```shell
curl -Nv --proxy http://10.0.1.2:8083 http://example.com
sudo ip netns exec ns2 curl -Nv --proxy http://10.0.1.2:8083 https://example.com
sudo ip netns exec ns3 curl -Nv --proxy http://10.0.1.2:8083 https://example.com
sudo ip netns exec ns4 curl -Nv --proxy http://10.0.1.2:8083 https://example.com
모든 요청이 성공해야 합니다
-
HTTP3 프록시 - LAN (
ns2(프록시 리스너),ns3,ns4),ns1의 아웃바운드 소켓 (기본 라우트, 인터넷 접근)프록시 실행: ``` sudo ./bin/gohpts -s $WLAN_IP:1080 -l 0.0.0.0:8083 -4 -6 -d -sniff -body -in-netns ns2 -out-netns ns1 -c ./cert.pem -k ./key.pem
요청 보내기 ```shell ./http3-socks-proxy/bin/client -a 10.0.1.2:8083 www.google.com sudo ip netns exec ns2 ./http3-socks-proxy/bin/client -a 10.0.1.2:8083 www.google.com sudo ip netns exec ns3 ./http3-socks-proxy/bin/client -a 10.0.1.2:8083 www.google.com sudo ip netns exec ns4 ./http3-socks-proxy/bin/client -a 10.0.1.2:8083 www.google.com
모든 요청이 성공해야 함
10. **투명 리디렉션 프록시 - LAN (`ns2` (프록시 리스너), `ns3`, `ns4`), `ns1`의 아웃바운드 소켓 (기본 라우트, 인터넷 접근)**
프록시 실행:
```shell
sudo ./bin/gohpts -s $WLAN_IP:1080 -4 -6 -d -sniff -body -in-netns ns2 -out-netns ns1 -nohttp -M redirect -T :8888 -auto
```
요청 보내기
```shell
sudo ip netns exec ns2 curl -Nv https://example.com
```
`ns3`와 `ns4`의 경우 요청 실패
11. **`IP_TRANSPARENT`를 사용한 투명 프록시 (arp/ndp 스푸핑 활성화) LAN (`ns2` (프록시 리스너), `ns3`, `ns4`), `ns1`의 아웃바운드 소켓 (기본 라우트, 인터넷 접근)**
프록시 실행:
```shell
sudo ./bin/gohpts -s $WLAN_IP:1080 -4 -6 -d -sniff -body -in-netns ns2 -out-netns ns1 -nohttp -M tproxy -T :8888 -auto -arpspoof "fullduplex 1;debug 1;interval 1s" -ndpspoof "ra true;interval 10s;debug 1"
```
이제 `ns3`와 `ns4`에서 이전 요청이 작동해야 함
```
sudo ip netns exec ns3 curl -Nv https://example.com
sudo ip netns exec ns4 curl -Nv https://example.com
```
12. **HTTP3 프록시 - `ns1`의 프록시 리스너, 호스트의 아웃바운드 소켓, `-nosocks` 플래그**
프록시 실행:
```shell
sudo ./bin/gohpts -l 0.0.0.0:8083 -4 -6 -d -sniff -body -in-netns ns1 -c ./cert.pem -k ./key.pem -nosocks
```
요청 보내기
```shell
./http3-socks-proxy/bin/client -a 10.0.0.2:8083 www.google.com
```
요청이 성공해야 함
13. **HTTP3 프록시 - 호스트의 프록시 리스너, `ns1`의 아웃바운드 소켓, `-nosocks` 플래그**
프록시 실행:
```shell
sudo ./bin/gohpts -l 0.0.0.0:8083 -4 -6 -d -sniff -body -out-netns ns1 -c ./cert.pem -k ./key.pem -nosocks
```
요청 보내기
```shell
./http3-socks-proxy/bin/client -a 127.0.0.1:8083 www.google.com
```
요청이 실패해야 함
`FORWARD` 체인에 규칙 추가
```shell
sudo iptables -A FORWARD -i wlan0 -o veth0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i veth0 -o wlan0 -j ACCEPT
sudo ip6tables -A FORWARD -i veth0 -j ACCEPT
sudo ip6tables -A FORWARD -o veth0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
```
요청 보내기
```shell
./http3-socks-proxy/bin/client -a 127.0.0.1:8083 www.google.com
```
요청이 성공해야 함
## 혼합 서버
[[뒤로]](#table-of-contents)
`GoHPTS`는 HTTP 서버와 동일한 주소에서 SOCKS 연결을 수신하도록 구성할 수 있습니다. 추가 SOCKS 서버를 시작하려면 `-mixed` 플래그를 추가하기만 하면 됩니다. 이를 통해 `GoHPTS`는 `HTTP-to-SOCKS` 프록시뿐만 아니라 `SOCKS-to-SOCKS` 프록시로도 작동할 수 있습니다. 로컬 SOCKS5 서버는 `UDP ASSOCIATE` 명령을 지원하므로, 기술적으로 사용자는 이 혼합 서버를 통해 UDP 데이터그램을 보낼 수 있습니다.
프록시 실행:```shell
gohpts -s :1080 -l :8080 -mixed
연결 테스트:```shell curl -Nv --proxy socks5://127.0.0.1:8080 "https://example.com"
업스트림 SOCKS 프록시를 비활성화하고 `-nosocks`를 추가하여 직접 연결합니다:```shell
gohpts -l :8080 -mixed -nosocks
연결 테스트:```shell curl -Nv --proxy socks5://127.0.0.1:8080 "https://example.com"
`-socks4` 플래그를 추가하여 대신 SOCKS4 프로토콜을 사용합니다:```shell
# :1080 should be a socks4 server
gohpts -s :1080 -l :8080 -mixed -socks4
연결 테스트:```shell curl -Nv --proxy socks4://127.0.0.1:8080 "https://example.com"
## 링크
[[뒤로]](#table-of-contents)
투명 프록시에 대해 자세히 알아보려면 다음 링크를 방문하세요:
- [Linux 커널의 투명 프록시 지원](https://docs.kernel.org/networking/tproxy.html)
- [Gost의 투명 프록시 튜토리얼](https://latest.gost.run/en/tutorials/redirect/)
- [간단한 tproxy 예제](https://github.com/FarFetchd/simple_tproxy_example)
- [Golang TProxy](https://github.com/KatelynHaworth/go-tproxy)
- [eBPF와 Go를 사용한 투명 프록시 구현](https://medium.com/all-things-ebpf/building-a-transparent-proxy-with-ebpf-50a012237e76)
- [https://github.com/heiher/hev-socks5-tproxy](https://github.com/heiher/hev-socks5-tproxy)
`UDP ASSOCIATE`를 지원하는 `socks5` 프록시:
- [https://github.com/wzshiming/socks5](https://github.com/wzshiming/socks5)
- [https://github.com/things-go/go-socks5](https://github.com/things-go/go-socks5)
- [https://github.com/0990/socks5](https://github.com/0990/socks5)
- [https://github.com/dizda/fast-socks5](https://github.com/dizda/fast-socks5)
- [https://github.com/semigodking/redsocks](https://github.com/semigodking/redsocks)
- [https://github.com/ginuerzh/gost](https://github.com/ginuerzh/gost)
IPv4/IPv6 네트워크 보안:
- [https://caster0x00.com/legless/](https://caster0x00.com/legless/)
- [https://caster0x00.com/intercept/](https://caster0x00.com/intercept/)
- [https://www.prosec-networks.com/en/blog/ipv6-mitm/](https://www.prosec-networks.com/en/blog/ipv6-mitm/)
## 기여하기
[[뒤로]](#table-of-contents)
개발자이신가요?
- 저장소를 포크하세요
- 기능 브랜치를 생성하세요: `git switch -c my-new-feature`
- 변경 사항을 커밋하세요: `git commit -am 'Add some feature'`
- 브랜치에 푸시하세요: `git push origin my-new-feature`
- 풀 리퀘스트를 제출하세요
## 라이선스
[[뒤로]](#table-of-contents)
GPLv3