Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
go-http-proxy-to-socks — CLI MITM-прокси, преобразующий SOCKS4/SOCKS5 в HTTP/HTTPS/HTTP2/HTTP3 с прозрачным перенаправлением TCP/UDP, спуфингом ARP/NDP/DNS, перехватом трафика и захватом пакетов. Чистый Go, без libpcap. | Kitploit
Инструменты/GitHubGitHub/shadowy-pycoder/go-http-proxy-to-socks
Сниффинг и анализ пакетовВеб-прокси и перехватОбход IDS/IPSСетевая безопасностьТестирование на ПроникновениеУтилиты и фреймворкиDNS-ФаззингRed TeamingАнализ DNS
GitHubshadowy-pycoder/go-http-proxy-to-socks

go-http-proxy-to-socks

CLI MITM-прокси, преобразующий SOCKS4/SOCKS5 в HTTP/HTTPS/HTTP2/HTTP3 с прозрачным перенаправлением TCP/UDP, спуфингом ARP/NDP/DNS, перехватом трафика и захватом пакетов. Чистый Go, без libpcap.

Репозиторий
693182 месяцев назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

GoHPTS - HTTP(S) и TCP/UDP прозрачный прокси к SOCKS4/SOCKS5 прокси (цепочка), написанный на Go

License: GPL v3 Go Reference GitHub go.mod Go version AUR Version AUR Last Modified AUR Maintainer Docker Pulls GitHub Release GitHub Downloads (all assets, all releases)

GitHub Downloads (all assets, latest release)

GoHPTS - Пример цветов

Содержание

  • Введение
  • Возможности
  • Установка
  • Использование
    • Настройка через флаги CLI
    • Настройка через YAML-файл
  • Прозрачный прокси
    • redirect (через NAT и SO_ORIGINAL_DST)
    • Автонастройка для режима redirect
    • tproxy (через MANGLE и IP_TRANSPARENT)
    • Автонастройка для режима tproxy
    • Поддержка UDP
    • Поддержка Android
    • YAML-конфигурация
  • Перехват трафика
    • Формат JSON
    • Цветной формат
  • Поддержка HTTP2 и HTTP3
    • Пример настройки с самоподписанным сертификатом
    • Проверка соединения
    • Проверка соединения в браузере
  • Поддержка IPv4 и IPv6
  • ARP-спуфинг
  • NDP-спуфинг
  • DNS-спуфинг
  • Захват пакетов
  • Сетевые пространства имён
    • Настройка тестовой среды
    • Примеры использования
  • Смешанный сервер
  • Ссылки
  • Участие в разработке
  • Лицензия

Введение

[Назад]

GoHPTS CLI-инструмент — это мост между HTTP-клиентами и SOCKS5-прокси-сервером (или несколькими серверами в цепочке). Он слушает локально как HTTP-прокси, принимает стандартные HTTP- или HTTPS-запросы (через CONNECT) и перенаправляет соединение через SOCKS5-прокси. Вдохновлён http-proxy-to-socks и Proxychains.

Пример использования: вам необходимо подключиться к внешнему API через Postman, но этот API доступен только с определённого удалённого сервера. Следующие команды помогут выполнить эту задачу:

Создайте SOCKS5-прокси-сервер через ssh:```shell ssh -D 1080 -Nf

root@kitploit:~
Создайте HTTP-to-SOCKS5 соединение с помощью `gohpts````shell
gohpts -s :1080 -l :8080

Specify http server in proxy configuration of Postman

Возможности

[Back]

  • Функциональность цепочки прокси
    Поддерживает цепочки strict, dynamic, random, round_robin для прокси SOCKS4/SOCKS5

  • Прозрачный прокси
    Поддерживает режимы redirect (SO_ORIGINAL_DST) и tproxy (IP_TRANSPARENT)

  • Поддержка IPv4 и IPv6
    Работает в режимах только IPv4, только IPv6 или 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 для сокетов прослушивания и исходящих соединений

  • Поддержка трейлерных заголовков
    Обрабатывает трейлерные заголовки HTTP

  • Кодирование передачи частями
    Обрабатывает чанкованные и потоковые ответы

  • Поддержка аутентификации SOCKS5
    Поддерживает аутентификацию по имени пользователя/паролю для прокси SOCKS5

  • Поддержка аутентификации HTTP
    Поддерживает аутентификацию по имени пользователя/паролю для HTTP-прокси сервера

  • Легкий и быстрый
    Разработан с минимальными накладными расходами и эффективной обработкой запросов

  • Кроссплатформенность
    Совместим со всеми основными операционными системами

Установка

[Back]

  • Arch Linux/CachyOS/EndeavourOS ```shell yay -S gohpts
    root@kitploit:~

Или используя paru: ```shell paru -S gohpts

root@kitploit:~
- Загрузите бинарный файл для вашей платформы со страницы [Релизы](https://github.com/shadowy-pycoder/go-http-proxy-to-socks/releases):  ```shell
GOHPTS_RELEASE=v1.15.5; 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
    root@kitploit:~

Это установит бинарный файл 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
    root@kitploit:~
  • Запуск в Docker: ```shell docker run -it --privileged --network host -v "$PWD/gohpts.yaml:/config.yaml" shadowypycoder/gohpts:latest -f config.yaml
    root@kitploit:~

Использование

[Назад]```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) -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)

root@kitploit:~
### Настройка через флаги CLI

[[Назад]](#table-of-contents)```shell
gohpts -s 1080 -l 8080 -d -j

Вывод:```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"}

root@kitploit:~
Укажите имя пользователя и пароль для 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

root@kitploit:~
Когда присутствуют оба параметра `-u` и `-U`, будет дважды запрошен ввод

Запустить HTTP-прокси через TLS-соединение```shell
gohpts -s 1080 -l 8080 -c "path/to/certificate" -k "path/to/private/key"

Запустить прокси как демон (необходим файл журнала для вывода журнала, иначе вы ничего не увидите)```shell gohpts -D -logfile /tmp/gohpts.log

root@kitploit:~
[cybersectools.github.io](https://cybersectools.github.io/)```shell
# output
gohpts pid: <pid>

No content provided.```shell

kill the process

kill #or kill $(pidof gohpts)

root@kitploit:~
`-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

root@kitploit:~
Вы можете переопределить почти любые настройки, указанные в конфигурационном файле, с помощью соответствующих флагов командной строки:```shell
gohpts -l :6969 -f "~/gohtps.yaml" -nocolor

Proxy takes all the settings specified in ~/gohpts.yaml but spins up http server on 127.0.0.1:6969 insted of 127.0.0.1:8080 and also disables colored output in logs.

Some settings (e.g. proxy_chain and dns filters) can only be configured via file.

Full version of config can be found here: example_gohpts.yaml

To learn more about proxy chains visit Proxychains Github

Transparent proxy

[Back]

Also known as an intercepting proxy, inline proxy, or forced proxy, a transparent proxy intercepts normal application layer communication without requiring any special client configuration. Clients need not be aware of the existence of the proxy. A transparent proxy is normally located between the client and the Internet, with the proxy performing some of the functions of a gateway or router

-- From Wiki

This functionality available only on Linux systems and Android (arm64) and requires additional setup (iptables, ip route, etc)

-T address flag specifies the address of transparent proxy server

There are three modes redirect, tproxy and tlocal (same as tproxy but also intercepts local traffic) that can be specified with -M flag

redirect (via NAT and SO_ORIGINAL_DST)

[Back]

In this mode proxying happens with iptables nat table and REDIRECT target. Host of incoming packet changes to the address of running redirect transparent proxy, but it also contains original destination that can be retrieved with getsockopt(SO_ORIGINAL_DST)

To run GoHPTS in this mode you use -T flag with -M redirect

Example

[Back]```shell

run the proxy

gohpts -s 1080 -T 1090 -M redirect -d

root@kitploit:~
Пожалуйста, предоставьте Markdown-текст для перевода.```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

root@kitploit:~
Проверка соединения:```shell
#traffic should be redirected via 127.0.0.1:1090
curl http://example.com

Please provide the markdown content to translate.```shell #traffic should be redirected via 127.0.0.1:8080 curl --proxy http://127.0.0.1:8080 http://example.com

root@kitploit:~
Отменить всё:```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

[Back]

Чтобы настроить вашу систему автоматически, выполните следующую команду:```shell sudo env PATH=$PATH gohpts -d -T 8888 -M redirect -auto

root@kitploit:~
Обратите внимание, автоматическая конфигурация требует `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

root@kitploit:~
Для запуска `GoHPTS` в этом режиме используйте флаг `-T` с `-M tproxy`

### Пример

[[Назад]](#table-of-contents)```shell
# run the proxy
gohpts -s 1080 -T 0.0.0.0:1090 -M tproxy -d

INPUT:```shell

run socks5 server on 127.0.0.1:1080

ssh remote -D 1080 -Nf

root@kitploit:~
Настройте вашу операционную систему:```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

root@kitploit:~
Отменить всё:```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

root@kitploit:~
Выполните следующее на вашем хосте:```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

root@kitploit:~
Отменить всё:```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

[Back]

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

root@kitploit:~
Эта команда настроит вашу операционную систему и запустит сервер на адресе `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"
  1. Проверьте подключение на вашем хост-компьютере, трафик должен проходить через машину 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"

root@kitploit:~
### 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

Перехват трафика

[Back]

MrGopher

Прокси GoHPTS позволяет захватывать и мониторить трафик, проходящий через сервис. Этот процесс известен как сниффинг трафика, сниффинг пакетов или просто сниффинг. В частности, прокси пытается определить, является ли трафик обычным текстом (HTTP) или TLS, и после идентификации парсит метаданные запросов/ответов и записывает их в файл или консоль. В случае прокси GoHTPS распарсенные метаданные выглядят следующим образом (TLS Handshake):

Формат JSON

[Back]```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)" } } ]

root@kitploit:~
И 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

root@kitploit:~
Вы также можете указать файл, в который записывать перехваченный трафик:```shell
gohpts -sniff -snifflog ~/sniff.log -j

Цветной формат

Назад

Вы можете увидеть пример цветного вывода на картинке выше. В этом режиме GoHPTS пытается выделить важную информацию, такую как TLS Handshake, HTTP метаданные, то, что похоже на логины/пароли или различные типы аутентификации и секретные токены. Вывод ограничен по сравнению с JSON, но гораздо легче для чтения человеком.

Чтобы запустить GoHPTS в этом режиме, используйте следующие флаги:```shell gohpts -sniff -body

root@kitploit:~
Вы можете объединить сниффинг с прозрачным режимом:```shell
./gohpts -T 8888 -M redirect -sniff -body

Чтобы отключить цвета, добавьте -nocolor:```shell gohpts -sniff -body -nocolor

root@kitploit:~
## Поддержка HTTP2 и HTTP3

[[Back]](#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).

### Пример настройки с самоподписанным сертификатом

[[Back]](#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
    root@kitploit:~
  • Откройте другой терминал и установите прокси GoHPTS: ```shell go install github.com/shadowy-pycoder/go-http-proxy-to-socks/cmd/gohpts@latest
    root@kitploit:~

Вы можете использовать другие методы, описанные в разделе Installation.

  • Наконец:

    1. Создайте минимальную конфигурацию для вашего прокси ```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

    root@kitploit:~

Запустите прокси: ```shell gohpts -f ./gohpts_config.yaml

root@kitploit:~
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

root@kitploit:~
### Проверка соединения

[[Назад]](#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

    root@kitploit:~

Запустите следующую команду: ```shell ./bin/client -a 127.0.0.1:8080 www.google.com

root@kitploit:~
Вы должны увидеть бессмысленный набор символов, напоминающий 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 в системное хранилище доверенных сертификатов:
    1. Debian/Ubuntu: ```shell sudo cp rootCA.crt /usr/local/share/ca-certificates/rootCA.crt sudo update-ca-certificates
    root@kitploit:~
  1. Arch Linux/CachyOS/EndeavourOS: ```shell sudo trust anchor rootCA.crt
root@kitploit:~
- Запустите прокси с помощью `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"
    root@kitploit:~

IPv4 and IPv6 support

[Back]

Что касается обработки сетевого уровня, GoHPTS может работать в трёх режимах: dual stack, IPv4-only и IPv6-only. Пользователь может управлять режимом с помощью флагов -4 и -6. Когда установлен один из флагов, прокси запускается в соответствующем режиме; когда присутствуют оба флага или оба опущены, предполагается режим dual stack. Обратите внимание, что в режимах «only» разрешены только IP-адреса конкретной версии, все домены разрешаются в конкретную версию IP (если возможно), все адреса прослушивания должны использовать ту же версию и т.д.

Чтобы включить режим IPv4-only, просто добавьте флаг -4:```shell sudo ./gohpts -sniff -body -d -4

root@kitploit:~
Для тестирования прокси в режиме 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"
  1. На вашем хосте:```shell

run proxy on your host

sudo ./gohpts -T 8888 -Tu 8889 -M tproxy -sniff -body -auto -d -4

root@kitploit:~
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:

  1. На вашей виртуальной машине:```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

root@kitploit:~
2. На вашем хосте:```shell
# run proxy on your host
sudo ./gohpts -T 8888 -Tu 8889 -M tproxy -sniff -body -auto -d -6
  1. Посетите любой веб-сайт на вашей виртуальной машине и просмотрите трафик в логах прокси

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"

root@kitploit:~
Прокси будет сканировать устройства в подсети `192.168.10.0/24` и отправлять им ARP-пакеты, притворяясь шлюзом; если `fullduplex` равен `true`,
прокси также будет отправлять ARP-пакеты шлюзу, чтобы убедить его, что наш прокси имеет каждый IP в подсети.

После остановки прокси с помощью `Ctrl+C` он автоматически отменит подмену всех целей.

`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"

root@kitploit:~
Проверьте логи прокси на наличие трафика от других устройств из вашей локальной сети

Для получения дополнительной информации о параметрах 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-спуфинга:

  1. Подключитесь к VPS```shell ssh [email protected]
root@kitploit:~
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
  1. Настройка 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
root@kitploit:~
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
  1. Возьмите другое устройство (телефон, планшет и т.д.) и подключите его к той же сети. Попробуйте выйти в Интернет и проверьте, появляется ли какой-либо трафик на вашем хост-компьютере. Проверьте публичный IP-адрес с помощью онлайн-инструментов (в данном случае он должен совпадать с адресом вашего VPS 203.0.113.10 или глобальным IPv6-адресом).

  2. Остановите прокси, нажав Ctrl+C

  3. Профит!

DNS-спуфинг

[Back]

Для применения 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

root@kitploit:~
Варианты использования:

- Блокировщик рекламы и трекеров для всех устройств в локальной сети
- Родительский контроль через блокировку определенных категорий веб-сайтов
- Блокировка известных фишинговых и вредоносных доменов
- Перенаправление трафика для анализа
- Сбор учетных данных через перенаправление
- Перехват и манипуляция трафиком (внедрение рекламы, скриптов, отслеживание)
- Наблюдение и профилирование

Минимальная конфигурация для этой настройки:```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

root@kitploit:~
Дополнительную информацию можно найти здесь: [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"

root@kitploit:~
Эти команды создают три файла захвата пакетов с соответствующими форматами, которые впоследствии могут быть проанализированы с помощью различных инструментов.

Для получения дополнительной информации о параметрах pcap см. `gohpts -h` и [https://github.com/shadowy-pycoder/mshark](https://github.com/shadowy-pycoder/mshark)

## Сетевые пространства имён

[[Назад]](#table-of-contents)

По умолчанию прокси `GoHPTS` работает в рамках одного сетевого пространства имён, но это можно переопределить. Сокеты прослушивания (например, HTTP-сервер или прозрачный прокси-сервер) и исходящие сокеты (SOCKS-прокси или прямой дозвонщик), создаваемые `GoHPTS`, могут быть изолированы с помощью [network_namespaces (7)](https://man7.org/linux/man-pages/man7/network_namespaces.7.html) Linux/Android. При запуске процесса прокси пользователи могут указать флаги `-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'

root@kitploit:~
Или сделайте постоянным для конкретного экземпляра оболочки:```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
    root@kitploit:~
  • Загрузите и установите простой пример HTTP3-to-SOCKS5 прокси: ```shell git clone https://github.com/shadowy-pycoder/http3-socks-proxy.git cd http3-socks-proxy make
    root@kitploit:~
  • Склонируйте репозиторий и скомпилируйте ```shell git clone https://github.com/shadowy-pycoder/go-http-proxy-to-socks.git cd go-http-proxy-to-socks make
    root@kitploit:~
  • Создайте файлы 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"
    root@kitploit:~
  • Создайте сетевой 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
    root@kitploit:~
  • Определить IP-адрес wlan0, чтобы иметь возможность подключения к локальному socks5 ```shell WLAN_IP=$(ip -4 -c=never route get 8.8.8.8 | awk '{print $7}' | tr -d '\n')
    root@kitploit:~

Примеры использования

[Назад]

  1. HTTP прокси - прокси-слушатели в ns1 (нет маршрута по умолчанию, нет доступа в интернет), исходящие сокеты на хосте

    Запустите прокси: ```shell sudo ./bin/gohpts -s 0.0.0.0:1080 -l :8083 -4 -6 -d -sniff -body -in-netns ns1

    root@kitploit:~

Сделать запрос через ns1 ```shell sudo ip netns exec ns1 curl -Nv --proxy http://127.0.0.1:8083 https://example.com

root@kitploit:~
Запрос должен завершиться успешно

2. **HTTP2 proxy - прокси-слушатели в `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

root@kitploit:~
Запрос должен быть выполнен успешно

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

root@kitploit:~
Запрос должен быть успешным

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

root@kitploit:~
Запрос должен завершиться ошибкой

Добавить маршрут по умолчанию к `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

root@kitploit:~
Теперь запрос должен выполниться успешно

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

root@kitploit:~
Выполнить запрос через хост   ```shell
curl -Nv --proxy http://$WLAN_IP:8083 https://example.com

Запрос должен быть успешным

  1. HTTP3 proxy - прокси-слушатели на хосте, исходящие сокеты в ns1 (маршрут по умолчанию, доступ в интернет)

    Запуск прокси: ``` sudo ./bin/gohpts -s :1080 -l :8083 -4 -6 -d -sniff -body -out-netns ns1 -i wlan0 -c ./cert.pem -k ./key.pem

    root@kitploit:~

Выполнить запрос через хост ```shell ./http3-socks-proxy/bin/client -a $WLAN_IP:8083 www.google.com

root@kitploit:~
Запрос должен быть выполнен успешно

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

root@kitploit:~
Запрос должен быть успешным

8. **HTTP прокси - ЛВС (`ns2` (слушатели прокси), `ns3`, `ns4`), исходящие сокеты в `ns1` (маршрут по умолчанию, доступ в интернет)**

Создать ЛВС   ```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

root@kitploit:~
Создание запросов   ```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

Все запросы должны быть успешными

  1. HTTP3 proxy - 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

    root@kitploit:~

Отправлять запросы ```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

root@kitploit:~
Все запросы должны быть успешными

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
 ```

 Запрос должен быть успешным

## Смешанный сервер

[[Back]](#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"

root@kitploit:~
Или отключите вышестоящий SOCKS-прокси и подключайтесь напрямую, добавив `-nosocks`:```shell
gohpts -l :8080 -mixed -nosocks

Тест соединения:```shell curl -Nv --proxy socks5://127.0.0.1:8080 "https://example.com"

root@kitploit:~
Добавьте флаг `-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"

root@kitploit:~
## Ссылки

[[Назад]](#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
Скачать инструмент