
go-http-proxy-to-socks v1.15.6
CLI MITM-прокси, преобразующий SOCKS4/SOCKS5 в HTTP/HTTPS/HTTP2/HTTP3 с прозрачным перенаправлением TCP/UDP, спуфингом ARP/NDP/DNS, перехватом трафика и захватом пакетов. Чистый Go, без libpcap.
GoHPTS — прозрачный прокси HTTP(S) и TCP/UDP к SOCKS4/SOCKS5 прокси (цепочке), написанный на Go

Содержание
- Введение
- Возможности
- Установка
- Использование
- Прозрачный прокси
- Сниффинг трафика
- Поддержка HTTP2 и HTTP3
- Поддержка IPv4 и IPv6
- ARP-спуфинг
- NDP-спуфинг
- DNS-спуфинг
- Захват пакетов
- Сетевые пространства имён
- Смешанный сервер
- Ссылки
- Участие в разработке
- Лицензия
Введение
CLI-инструмент GoHPTS — это мост между HTTP-клиентами и SOCKS5-прокси-сервером или несколькими серверами (цепочкой). Он слушает локально как HTTP-прокси, принимает стандартные HTTP-
или HTTPS-запросы (через CONNECT) и перенаправляет соединение через SOCKS5-прокси. Вдохновлён http-proxy-to-socks и Proxychains
Возможный сценарий использования: вам нужно подключиться к внешнему API через Postman, но этот API доступен только с некоторого удалённого сервера. Следующие команды помогут вам выполнить такую задачу:
Создайте SOCKS5-прокси-сервер через ssh:```shell
ssh -D 1080 -Nf
Создайте HTTP-соединение с SOCKS5 с помощью `gohpts````shell
gohpts -s :1080 -l :8080
Укажите http-сервер в конфигурации прокси Postman
Возможности
-
Функциональность цепочки прокси
Поддерживает цепочкиstrict,dynamic,random,round_robinиз SOCKS4/SOCKS5 прокси -
Прозрачный прокси
Поддерживает режимы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-спуфинг
Проксирование IPv6-соединений с использованием Router/Neighbor Advertisement и инъекций RDNSS. -
DNS-спуфинг
Перенаправление клиентов на произвольные домены с помощью манипуляции DNS-записями -
Захват пакетов
Захват трафика в файлы txt/pcap/pcapng и анализ с помощью Wireshark -
Защита от утечек DNS
Разрешение DNS происходит на стороне сервера SOCKS5. -
Поддержка метода CONNECT
Поддерживает туннелирование HTTP CONNECT, обеспечивая работу HTTPS и других протоколов на основе TCP. -
Поддержка HTTP2/HTTP3
Поддерживает современный транспорт HTTP/2 и HTTP/3, обеспечивая эффективные мультиплексированные соединения поверх TLS 1.3 -
Поддержка сетевых пространств имён
Поддерживает пользовательские сетевые пространства имён Linux для слушающих сокетов и исходящих соединений -
Поддержка Trailer-заголовков
Обрабатывает HTTP trailer-заголовки -
Chunked Transfer Encoding
Обрабатывает chunked и потоковые ответы -
Поддержка аутентификации 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
I don't see any content to translate in your message. The "INPUT:" section is empty — no Markdown text was included after it.
Please send the actual chunk 21 content (the Markdown text you want translated from English to Russian), and I'll return only the translated Markdown, preserving all structure, code, paths, URLs, and identifiers exactly as required.```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`, вам будет предложено ввести данные дважды
Запуск HTTP-прокси через TLS-соединение```shell
gohpts -s 1080 -l 8080 -c "path/to/certificate" -k "path/to/private/key"
Запустите прокси как демон (для вывода логов нужен logfile, иначе вы ничего не увидите)```shell gohpts -D -logfile /tmp/gohpts.log
| `--no-color` | Отключить цветной вывод |
| `--debug` | Включить отладочный вывод |
| `--verbose` | Включить подробный вывод |
| `--silent` | Подавить весь вывод |
| `--version` | Показать версию и выйти |
| `--help` | Показать справку и выйти |```shell
# output
gohpts pid: <pid>
| --no-color | Отключить цветной вывод |
| --debug | Включить отладочный вывод |
| --verbose | Включить подробный вывод |
| --silent | Отключить весь вывод, кроме ошибок |
| --version | Показать версию и выйти |
| --help | Показать справку и выйти |```shell
kill the process
kill #or kill $(pidof gohpts)
Флаги `-u` и `-U` не работают в режиме демона (и, следовательно, при аутентификации), но вы можете указать файл конфигурации (см. ниже)
### Конфигурация через YAML-файл
[[Назад]](#table-of-contents)
Файлы конфигурации полезны, когда вы хотите предварительно настроить прокси, не слишком заморачиваясь с CLI, или просто хотите иметь несколько профилей для разных нужд.
Запуск HTTP-прокси в режиме цепочки SOCKS5-прокси (укажите настройки сервера через YAML-файл конфигурации)```shell
gohpts -f "~/gohtps.yaml" -d -j
Пример конфигурации:```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, но запускает http-сервер на 127.0.0.1:6969 вместо 127.0.0.1:8080, а также отключает цветной вывод в логах.
Некоторые настройки (например, proxy_chain и dns-фильтры) можно задать только через файл.
Полная версия конфигурации доступна здесь: example_gohpts.yaml
Чтобы узнать больше о цепочках прокси, посетите Proxychains Github
Прозрачный прокси
Также известный как
перехватывающий прокси,встроенный проксиилипринудительный прокси, прозрачный прокси перехватывает обычную коммуникацию на уровне приложений, не требуя какой-либо специальной конфигурации клиента. Клиентам не нужно знать о существовании прокси. Прозрачный прокси обычно располагается между клиентом и Интернетом, выполняя часть функций шлюза или маршрутизатора-- Из Wiki
Эта функциональность доступна только в системах Linux и Android (arm64) и требует дополнительной настройки (iptables, ip route и т. д.)
Флаг -T address задаёт адрес сервера прозрачного прокси
Существует три режима: redirect, tproxy и tlocal (то же, что tproxy, но также перехватывает локальный трафик), которые можно указать с помощью флага -M
redirect (через NAT и SO_ORIGINAL_DST)
В этом режиме проксирование происходит с помощью таблицы nat в iptables и цели REDIRECT. Адрес входящего пакета меняется на адрес запущенного прозрачного прокси redirect, но он также содержит исходный пункт назначения, который можно получить с помощью getsockopt(SO_ORIGINAL_DST)
Чтобы запустить GoHPTS в этом режиме, используйте флаг -T с -M redirect
Пример
[Назад]```shell
run the proxy
gohpts -s 1080 -T 1090 -M redirect -d
## Установка
### Требования
- Python 3.8+
- pip (менеджер пакетов Python)
### Шаги
1. **Клонируйте репозиторий:**
```bash
git clone https://github.com/yourusername/kitploit-tool.git
cd kitploit-tool
-
Создайте виртуальное окружение (рекомендуется):
python3 -m venv venv source venv/bin/activate # В Windows: venv\Scripts\activate -
Установите зависимости:
pip install -r requirements.txt -
Настройте параметры:
cp config.example.yaml config.yaml # Отредактируйте config.yaml под свои нужды -
Запустите инструмент:
python kitploit.py --help
Использование
Базовое использование
python kitploit.py -t example.com
Расширенные параметры
python kitploit.py -t example.com -o json -v --threads 10
Параметры командной строки
| Параметр | Описание | По умолчанию |
|---|---|---|
-t, --target | Целевой домен или IP-адрес | Обязательный |
-o, --output | Формат вывода (text, json, csv) | text |
-v, --verbose | Включить подробный вывод | False |
--threads | Количество потоков | 5 |
--timeout | Тайм-аут в секундах | 30 |
-h, --help | Показать справку |
Примеры
Пример 1: Базовое сканирование
python kitploit.py -t example.com
Вывод:
[*] Начало сканирования example.com
[+] Обнаружен открытый порт: 80
[+] Обнаружен открытый порт: 443
[*] Сканирование завершено
Пример 2: Вывод в формате JSON
python kitploit.py -t example.com -o json
Пример 3: Расширенное сканирование с несколькими потоками
python kitploit.py -t example.com --threads 20 -v
Конфигурация
Инструмент использует файл config.yaml для настройки. Пример конфигурации:
target:
timeout: 30
threads: 5
output:
format: text
verbose: false
scan:
ports: [21, 22, 80, 443, 8080]
services: true
Участие в разработке
Мы приветствуем вклад в развитие проекта! Пожалуйста, следуйте этим шагам:
- Форкните репозиторий
- Создайте ветку для новой функции (
git checkout -b feature/amazing-feature) - Зафиксируйте изменения (
git commit -m 'Add amazing feature') - Отправьте изменения в ветку (
git push origin feature/amazing-feature) - Откройте Pull Request
Лицензия
Этот проект распространяется под лицензией MIT — подробности см. в файле LICENSE.
Отказ от ответственности
Этот инструмент предназначен только для образовательных целей и тестирования на проникновение с разрешения. Используйте его ответственно и только в законных целях. Авторы не несут ответственности за любое неправомерное использование или ущерб, причинённый этим программным обеспечением.
Контакты
- Автор: Your Name
- GitHub: @yourusername
- Email: [email protected]
Благодарности
- Особая благодарность всем участникам проекта
- Вдохновлено различными инструментами безопасности с открытым исходным кодом
- Спасибо сообществу за постоянную поддержку```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
| `--list` | List all available modules |
| `--module <name>` | Run a specific module |
| `--output <file>` | Save results to a file |
| `--verbose` | Enable verbose output |
| `--threads <n>` | Number of concurrent threads |
| `--timeout <sec>` | Request timeout in seconds |
| `--proxy <url>` | Use a proxy for requests |
| `--user-agent <string>` | Set a custom User-Agent |
| `--no-color` | Disable colored output |
| `--config <file>` | Load configuration from file |
| `--version` | Show version information |
| `--help` | Show help message |
### Examples
```bash
# List all modules
python3 tool.py --list
# Run a specific module
python3 tool.py --module scan --target example.com
# Save output to file
python3 tool.py --module scan --target example.com --output results.txt
# Use a proxy
python3 tool.py --module scan --target example.com --proxy http://127.0.0.1:8080
Configuration
The tool can be configured using a configuration file. By default, it looks for config.yaml in the current directory.
# config.yaml
timeout: 30
threads: 10
user_agent: "Mozilla/5.0"
proxy: null
verbose: false
Modules
scan
The scan module performs a basic scan of the target.
Options:
--target- Target URL or IP address (required)--ports- Ports to scan (default: common ports)--full- Perform a full scan
enum
The enum module enumerates information about the target.
Options:
--target- Target URL or IP address (required)--subdomains- Enumerate subdomains--dns- Enumerate DNS records
exploit
The exploit module attempts to exploit known vulnerabilities.
Options:
--target- Target URL or IP address (required)--cve- CVE ID to exploit--payload- Custom payload to use
Output
The tool outputs results in a structured format. By default, results are printed to the console. Use the --output flag to save results to a file.
Example output:
[+] Target: example.com
[+] IP: 93.184.216.34
[+] Open ports: 80, 443
[+] Vulnerabilities found: 2
- CVE-2021-1234
- CVE-2021-5678
Troubleshooting
Common Issues
Module not found
Make sure the module name is correct. Use --list to see all available modules.
Connection timeout
Increase the timeout value using the --timeout flag.
Permission denied
Run the tool with appropriate permissions or use sudo.
Contributing
Contributions are welcome! Please follow these guidelines:
- Fork the repository
- Create a feature branch
- Commit your changes
- Push to the branch
- Open a Pull Request
License
This project is licensed under the MIT License. See the LICENSE file for details.
Disclaimer
This tool is intended for educational and authorized testing purposes only. The authors are not responsible for any misuse or damage caused by this tool.```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
Чтобы настроить систему автоматически, выполните следующую команду:```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)
В этом режиме проксирование происходит с помощью таблицы mangle в iptables и цели TPROXY. Прозрачный прокси видит адрес назначения как есть, он не перезаписывается ядром. Чтобы это работало, прокси привязывается с опцией сокета IP_TRANSPARENT, iptables перехватывает трафик с помощью цели TPROXY, а правила маршрутизации направляют помеченные пакеты к локальному прокси, не изменяя их исходное назначение.
Этот режим требует повышенных привилегий для запуска GoHPTS. Это можно сделать, выполнив следующую команду:```shell
sudo setcap 'cap_net_admin+ep' ~/go/bin/gohpts
Для запуска `GoHPTS` в этом режиме используйте флаг `-T` вместе с `-M tproxy`
### Пример
[[Назад]](#table-of-contents)```shell
# run the proxy
gohpts -s 1080 -T 0.0.0.0:1090 -M tproxy -d
| --no-color | Отключить цветной вывод |
| --debug | Включить отладочный вывод |
| --verbose | Включить подробный вывод |
| --silent | Включить тихий режим |
| --version | Показать версию программы и выйти |
| --help | Показать справку и выйти |```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
Чтобы настроить систему автоматически, выполните следующую команду (например, на отдельной виртуальной машине):```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
GoHPTS имеет поддержку UDP, которую можно включить в режимах tproxy и tlocal. Для работы этой конфигурации необходимо подключиться к серверу socks5, способному обслуживать UDP-соединения (UDP ASSOCIATE). Например, вы можете использовать https://github.com/wzshiming/socks5, чтобы развернуть socks5-сервер с поддержкой UDP на удалённой или локальной машине. После того как у вас есть сервер для подключения, выполните следующую команду:```shell
sudo env PATH=$PATH gohpts -s remote -Tu :8989 -M tproxy -auto -mark 100 -d
Эта команда настроит вашу операционную систему и запустит сервер по адресу `0.0.0.0:8989`.
Чтобы протестировать это локально, вы можете объединить прозрачный UDP-прокси с флагом `-arpspoof`. Например:
1. Настройте виртуальную машину в вашей системе с любым дистрибутивом Linux, поддерживающим `tproxy` (например, Kali Linux).
2. Включите `bridged` сеть, чтобы виртуальная машина могла получить доступ к вашей хост-машине.
3. Переместите бинарный файл `gohpts` на виртуальную машину (например, через `ssh`) или соберите его там, если ОС/архитектура отличаются.
4. На вашей виртуальной машине выполните следующую команду:```shell
# Do not forget to replace <socks5 server> and <your host> with actual addresses
sudo ./gohpts -s <socks5 server> -T 8888 -Tu :8989 -M tproxy -sniff -body -auto -mark 100 -d -arpspoof "targets <your host>;fullduplex true;debug false"
- Проверьте соединение на вашей хост-машине, трафик должен идти через машину Kali.
Поддержка Android
Прозрачный прокси можно включить на устройствах Android (arm64) с root-доступом. Вы можете установить Termux и запустить 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
[[Назад]](#table-of-contents)```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
Перехват трафика
Прокси GoHPTS позволяет захватывать и отслеживать трафик, проходящий через сервис. Этот процесс известен как traffic sniffing, packet sniffing или просто sniffing. В частности, прокси пытается определить, является ли трафик открытым текстом (HTTP) или TLS, и после завершения идентификации он разбирает метаданные запроса/ответа и записывает их в файл или консоль. В случае прокси GoHTPS разобранные метаданные выглядят следующим образом (TLS Handshake):
Формат JSON
[Назад]```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)" } } ]
И HTTP-запрос с помощью curl:```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
Цветной формат
Вы можете увидеть пример цветного вывода на изображении выше. В этом режиме 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
[[Назад]](#table-of-contents)
Прокси `GoHPTS` обрабатывает запросы HTTP/1.1, HTTP/2 и HTTP/3, используя один и тот же адрес сервера и TLS-сертификат. Это позволяет клиентам автоматически выбирать наилучший доступный протокол без изменения конфигурации. TLS-сертификат можно получить несколькими способами: у облачных провайдеров (Google, AWS, Cloudflare), бесплатный сертификат от Let's Encrypt, или вы можете создать самоподписанный сертификат с помощью `openssl` (Linux/macOS) или `New-SelfSignedCertificate` (Windows).
### Пример настройки с использованием самоподписанного сертификата
[[Назад]](#table-of-contents)
- Создайте файлы `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"
- Подготовьте сервер socks5 с поддержкой UDP ASSOCIATE ```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
Вы можете использовать другие методы, описанные в разделе Установка.
-
Наконец:
- Создайте минимальную конфигурацию для вашего прокси ```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
Дополнительную информацию можно найти здесь: 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:
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
Для этого ваш интернет-провайдер и удалённый прокси socks5 должны поддерживать активную поддержку IPv6; вы можете посетить https://test-ipv6.com/, чтобы узнать, есть ли у вас доступ к IPv6-адресам. Чтобы протестировать прокси в режиме IPv6, вы можете использовать любую виртуальную машину Linux:
- На вашей виртуальной машине:```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-спуфер, который можно использовать, чтобы заставить все 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` и отправлять им ARP-пакеты, представляясь шлюзом; если `fullduplex` имеет значение true,
proxy также будет отправлять ARP-пакеты шлюзу, чтобы заставить его поверить, что наш proxy владеет каждым IP в подсети.
После остановки proxy с помощью `Ctrl+C` он автоматически отменит спуфинг всех целей.
`GoHPTS` также можно использовать с такими инструментами, как [Bettercap](https://github.com/bettercap/bettercap), для проксирования трафика, подвергнутого ARP-спуфингу.
Запустите proxy:```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"
Проверьте логи прокси на наличие трафика с других устройств из вашей локальной сети
Для получения дополнительной информации об опциях arpspoof см. `gohpts -h` и [https://github.com/shadowy-pycoder/arpspoof](https://github.com/shadowy-pycoder/arpspoof)
## NDP-спуфинг
[[Назад]](#table-of-contents)
`GoHPTS` имеет встроенную функциональность для выполнения NDP-спуфинга в сетях IPv6 с помощью пакетов Router Advertisement (RA) и Neighbor Advertisement (NA). Он также включает опцию RDNSS в пакетах RA, чтобы назначить хост в качестве IPv6-сервера имён для затронутых клиентов. В сочетании с режимом прозрачного прокси (TCP/UDP) NDP-спуфинг позволяет `gohpts` проксировать трафик для клиентов в локальных сетях. Как и в случае с [ARP-спуфингом](#arp-spoofing), вы можете задать опции ndp-спуфинга с помощью одного флага `-ndpspoof`:
Пример:```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, должен стать шлюзом по умолчанию для устройств в локальной сети. Для этого достаточно запустить прозрачный прокси с включённым udp, а также запустить ARP/NDP-спуфинг, чтобы цели использовали ваш DNS-сервер.
DNS-ответы, создаваемые GoHPTS, выглядят как обычные пакеты, приходящие от роутера или доверенных DNS-серверов (Google, Cloudflare), в результате чего клиенты обновляют свой кэш тем, что вы им сообщаете. Однако имейте в виду, что это работает только для «стандартного» незашифрованного DNS-трафика (DOT/DOH не фильтруются и не подменяются).
DNS-фильтры и домены для спуфинга можно настроить в секции dns_filter конфигурационного yaml-файла. Все списки принимают 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
Сценарии использования:
- Блокировщик рекламы и трекеров для всех устройств в локальной сети
- Родительский контроль путём блокировки определённых категорий сайтов
- Блокировка известных фишинговых и вредоносных доменов
- Перенаправление трафика для анализа
- Сбор учётных данных путём перенаправления
- Перехват и манипуляция трафиком (внедрение рекламы, скриптов, трекинга)
- Слежка и профилирование
Минимальная конфигурация для этой настройки:```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`, чтобы предоставить прокси доступ к необработанному трафику
- Запускайте прокси с `sudo`, когда вам нужно указать флаг `-pcap` в CLI или `pcap.enabled` в конфигурационном файле.
Настройте прокси с помощью 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` работает в одном сетевом пространстве имён, но это можно переопределить. Слушающие сокеты (например, HTTP-сервер или сервер прозрачного прокси) и исходящие сокеты (SOCKS-прокси или прямой дозвон), создаваемые `GoHPTS`, можно изолировать с помощью 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` поддерживает соглашение [ip-netns (8)](https://man7.org/linux/man-pages/man8/ip-netns.8.html) для предоставления сетевой конфигурации через файлы, расположенные в каталоге `/etc/netns/NAME/`. Так, чтобы указать пользовательские серверы имён для сетевого пространства имён `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
Если конфигурация не найдена, для разрешения доменных имён будут использоваться DNS-серверы Google.
Если в вашей системе включён 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'
Настройка площадки
- Запустите сервер socks5 с поддержкой UDP ASSOCIATE ```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" - Создайте сетевой namespace
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 - Определите IP-адрес
wlan0, чтобы иметь возможность подключиться к локальному socks5 ```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` (маршрут по умолчанию, доступ в интернет)**
Добавьте правила NAT, чтобы разрешить `ns1` подключаться к интернету через `wlan0` ```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` можно настроить на прослушивание SOCKS-соединений на том же адресе, что и HTTP-сервер, просто добавьте флаг `-mixed`, чтобы запустить дополнительный SOCKS-сервер. Это позволяет `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)
`socks5` прокси с поддержкой `UDP ASSOCIATE`:
- [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`
- Отправьте pull request
## Лицензия
[[Назад]](#table-of-contents)
GPLv3