English | Русский
Кроссплатформенная утилита командной строки для реализации SOCKS, HTTP и обратного прокси сервера на базе .NET. Поддерживается протокол SOCKS5 для туннелирования TCP трафика и HTTP протокол для прямого (классического) проксирования любого HTTPS трафика (CONNECT
запросы), а также TCP, UDP и HTTP/HTTPS протоколы для обратоного проксирования. Для переадресации веб-траффика через обратный прокси поддерживаются GET
и POST
запросы с передачей заголовков и тела запроса от клиента, что позволяет использовать API
запросы и проходить авторизацию на сайтах (передача cookie).
Какие задачи решает обратный прокси сервер:
-
Безопаснось, так как у клиента нет прямого доступа к целевой машине, на которой запущено приложение, например, веб-серверу.
-
Если ваше Web-приложение или
API
сервер не поддерживают авторизацию, то вы можете воспользоваться Base64 шифрованием, что обязует передавать в заголовке запроса авторизационные данные для всех клиентов, которые будут подключаться через Proxy. Если вы используете браузер, то будет предоставлена соответствующая форма для прохождения базовой авторизации. -
В отличии от классического Proxy вам не нужно указывать адрес прокси сервера на стороне клиента в настройках приложения или менять код и использовать внешние модули (например, proxy-agents) при каждом обращении через API клиент, а только изменить url на адрес proxy сервера.
-
Если вы пользуетесь VPN сервисом для доступа к конкретному url ресурсу в Интернете через протоколы
HTTP
илиHTTPS
на своей машине, вы можете предоставить к нему доступ другим машинам в сети, без необходимости устанавливать и использовать VPN на других клиентах (например, на мобильных устройствах адрес Proxy сервера можно прописать в конфигурации Wi-Fi подключения). -
Предоставить прямой доступ к другим хостам во второй подсети, если вы используете VPN сервер в режиме точка-точка (например, Radmin).
-
Возможность предоставить доступ внешнему клиенту в зоне DMZ (Demilitarized Zone) к приложениям, которое находится во внутренней сети, например, для протоколов
RTSP
,SSH
,RDP
,Syslog
и т.п., то достаточно установить прокси с сетевым доступом в обе подсети и предоставить доступ через него только к выбранным приложениям на разных хостах. -
Может выступать альтернативой настройки классического ssh туннелирования, как в
OpenSSH
,Putty
и других.
Существует много альтернатив, которые предоставляют схожий функционал по отдельности. Например, ncat в Windows (из состава nmap), socat в Linux для TCP
или ReverseProxy на Golang для перенаправления HTTP/HTTPS трафика. Весь вышеперечисленный функционал реализован в одной утилите.
-
Скачайте и установите среду выполнения приложений
.NET
версии 8.0. -
Загрузите исполняемый файл портативной версии из GitHub репозитория.
- Установите среду выполнения приложений
.NET
:
sudo apt-get install -y dotnet-runtime-8.0
- Загрузите исполняемый файл
froxy
в директорию/usr/local/bin/
и предоставьте права на выполнение:
arch="x64" # or "arm64"
sudo curl -s -L "https://github.com/Lifailon/froxy/releases/download/0.4.0/froxy-0.4.0-linux-$arch" -o /usr/local/bin/froxy
sudo chmod +x /usr/local/bin/froxy
💡 Протестирован в системе Ubuntu.
Если вы не хотите устанавливать среду выполнения .NET
, загрузите zip-архив с портативной версией self-contained, которая уже содержит в себе все зависимости (доступно для обеих платформ).
Вы можете установить приложение из менеджера пакетов NuGet:
dotnet tool install --global froxy
После установки, приложение станет доступно как исполняемый файл froxy
из любого расположения в системе.
Упаковать приложение для публикации на NuGet:
dotnet pack
- Клонируйте репозиторий:
git clone https://github.com/Lifailon/froxy
cd froxy/source
- Соберите и запустите приложение:
dotnet build && dotnet run [parameters]
- Собрать приложение в один исполняемый файл:
Windows:
dotnet publish -r win-x64 -c Release /p:PublishSingleFile=true
Linux:
dotnet publish -r linux-x64 -c Release /p:PublishSingleFile=true
- Собрать самодостаточное приложение (без необходимости в установке зависимостей платформы .NET на исполняемой системе):
Windows:
dotnet publish -r win-x64 -c Release --self-contained true
Linux:
dotnet publish -r linux-x64 -c Release --self-contained true
Загрузите собранный образ из DockerHub:
docker pull lifailon/froxy:latest
Для сборки образ контейнера из исходных файлов проекта, используйте dockerfile:
docker build -t lifailon/froxy .
Для предварительной сборки приложения (если этого не было сделано ранее в локальной системе) используйте dockerfile-pre-build:
docker build -t lifailon/froxy -f dockerfile-pre-build .
Пример запуска классического прокси сервера для протокола HTTP на порту 8080
с использованием авторизации в контейнере:
port=8080
docker run -d \
--name froxy \
-e SOCKS=0 \
-e FORWARD=$port \
-e LOCAL="" \
-e REMOTE="" \
-e USER="admin" \
-e PASSWORD="admin" \
-p $port:$port \
--restart=unless-stopped \
lifailon/froxy
Если вы планируете использовать обратный прокси сервер, установите значение SOCKS=0
и FORWARD=0
, вместо этого перейдайте значения в переменные LOCAL
и REMOTE
. Если не требуется авторизация, то передайте значение false
в параметры USER
и PASSWORD
.
Пример запуска обратного прокси сервера без авторизации:
port=8443
docker run -d \
--name froxy \
-e SOCKS=0 \
-e FORWARD="0" \
-e LOCAL="*:$port" \
-e REMOTE="https://kinozal.tv" \
-e USER="false" \
-e PASSWORD="false" \
-p $port:$port \
--restart=unless-stopped \
lifailon/froxy
Вы можете запустить несколько экземпляров приложения одновременно, пример docker-compose для веб-интерфейса TMDB на порту 8081
и api на порту 8082
без авторизации:
docker-compose -f docker-compose.yml up -d
В примере ниже у машины нет прямого доступа к api, по этому производится запрос через прокси и обратный прокси:
Что бы остановить все запущенные сервисы:
docker-compose down
Получите справку:
froxy --help
Forward and reverse proxy server base on .NET.
Parameters:
-h, --help Get help.
-v, --version Get version.
-s, --socks <port> Start SOCKS5 proxy server forwarding TCP and UDP traffic via port selected in the 1024-49151 range.
-f, --forward <port> Start HTTP proxy server forwarding HTTPS traffic (CONNECT method) via port selected in the 1024-49151 range.
-l, --local <port/address:port> The interface address and port for TCP or only the port for UDP, through which proxy requests will pass.
-r, --remote <address:port/url> TCP/UDP or HTTP/HTTPS (GET and POST methods) address of the remote resource to which requests will be proxy.
-u, --user <login> User name for authorization (supported for forward and reverse HTTP/HTTPS protocols only).
-p, --pass <password> User password for authorization.
Examples:
froxy --socks 1080
froxy --forward 8080
froxy --forward 8080 >> froxy.log &
froxy --local 5514 --remote 192.168.3.100:514
froxy --local 127.0.0.1:8443 --remote 192.168.3.101:80
froxy --local 127.0.0.1:8443 --remote https://example.com
froxy --local *:8443 --remote https://example.com --user admin --pass admin
Запуск прокси сервера c использованием протокола SOCKS5 на порту 7070
и проверка подключения на Android устройстве через клиент Super Proxy:
froxy --socks 7070 --user admin --pass admin
SOCKS5 proxy server running on port 7070
[16:10:55] Error authentication: 192.168.3.58:49962
Received username: admin, password: admin2
[16:10:59] Request: 192.168.3.58:49984 => 8.8.8.4:853
[16:11:06] Request: 192.168.3.58:50024 => kinozal.tv:443
[16:11:06] Request: 192.168.3.58:50036 => optimizationguide-pa.googleapis.com:443
[16:11:06] Request: 192.168.3.58:50040 => kinozal.tv:443
[16:11:06] Request: 192.168.3.58:50050 => myroledance.com:443
[16:11:06] Request: 192.168.3.58:57488 => tmfjas.com:443
[16:11:06] Request: 192.168.3.58:57484 => clientservices.googleapis.com:443
[16:11:06] Request: 192.168.3.58:57504 => i124.fastpic.org:443
[16:11:07] Request: 192.168.3.58:57518 => counter.yadro.ru:443
[16:11:07] Request: 192.168.3.58:57532 => klmainprost.com:443
[16:11:08] Request: 192.168.3.58:57546 => tmfjas.com:443
[16:11:09] Request: 192.168.3.58:57562 => fonts.gstatic.com:443
[16:11:09] Request: 192.168.3.58:57564 => readaloud.googleapis.com:443
[16:11:09] Request: 192.168.3.58:57572 => readaloud.googleapis.com:443
[16:11:10] Disconnect: 192.168.3.58:57572
[16:11:11] Disconnect: 192.168.3.58:49984
[16:11:12] Request: 192.168.3.58:57586 => nearbydevices-pa.googleapis.com:443
[16:11:25] Request: 192.168.3.58:46610 => clients4.google.com:443
[16:11:26] Disconnect: 192.168.3.58:57518
[16:11:36] Request: 192.168.3.58:43958 => userlocation.googleapis.com:443
[16:11:37] Disconnect: 192.168.3.58:50024
[16:11:37] Disconnect: 192.168.3.58:50040
...
Запуск прямого прокси на сервере для протокола HTTP
:
froxy --forward 8080 --user admin --pass admin
Forward proxy server running on port 8080
[14:58:18] Error authentication: 192.168.3.101:47156
[14:58:20] Connect: 192.168.3.101:47170 => kinozal.tv:443
[14:58:20] Disconnect: 192.168.3.101:47170
[14:58:35] Connect: 192.168.3.101:47522 => rutracker.org:443
[14:58:36] Disconnect: 192.168.3.101:47522
Отправка запросов на клиенте через прокси:
curl -x http://192.168.3.100:8080 --proxy-user adm:adm https://kinozal.tv/browse.php?s=the+rookie
curl -x http://192.168.3.100:8080 --proxy-user admin:admin https://kinozal.tv/browse.php?s=the+rookie
curl -x http://192.168.3.100:8080 --proxy-user admin:admin https://rutracker.org/forum/index.php
Вы также можете запустить прокси в режиме демона (фоновый процесс) и передать вывод логов в файл:
froxy --forward 8080 --user admin --pass admin >> froxy.log &
Синтаксис одинаков для обоих систем (Linux и Windows). Возможно запустить несколько экземпляров для обработки разных запросов в режиме реверсивного прокси.
Для остановки всех фоновых процессов в Windows:
Get-Process *froxy* | Stop-Process
Linux:
pkill froxy
В примере, принимает запросы на интерфейсе с ip-адресом 192.168.3.100
и порту 8443
для перенаправления на удаленный хост с ip-адресом 192.168.3.101
, где запущенно приложение на порту 80
.
froxy --local 192.168.3.100:8443 --remote 192.168.3.101:80
TCP protocol is used
Listening on 192.168.3.100:8443 for forwarding to 192.168.3.101:80
[15:52:01] 192.168.3.100:37865: [::ffff:192.168.3.101]:80
[15:52:04] 192.168.3.100:37160: [::ffff:192.168.3.101]:80
[15:52:21] 192.168.3.99:35036: [::ffff:192.168.3.101]:80
[15:52:22] 192.168.3.99:35037: [::ffff:192.168.3.101]:80
[15:52:25] 192.168.3.99:35035: [::ffff:192.168.3.101]:80
[15:52:30] 192.168.3.100:37162: [::ffff:192.168.3.101]:80
[15:52:34] 192.168.3.100:38970: [::ffff:192.168.3.101]:80
[15:52:35] 192.168.3.100:37999: [::ffff:192.168.3.101]:80
💡 Что бы прослушивать все сетевые интерфейсы, используйте символ *
вместо локального ip-адреса (требуется запустить консоль с правами администратора).
Такой способ подойдет для обработки большенства протоколов, которые работают на базе TCP, в том числе поддерживается передача данных в теле запроса через HTTP.
Но, такой способ не подойдет для проксирования запросов к удаленным ресурсам через Интернет.
$(Test-NetConnection 172.67.189.243 -Port 443).TcpTestSucceeded
True
froxy--local localhost:8443 --remote 172.67.189.243:443
TCP protocol is used
Error: An invalid IP address was specified.
Для решения такой задачи необходимо использовать проксирование через протокол HTTP или HTTPS.
Пример ssh подключения через прокси сервер:
froxy --local 192.168.3.100:3131 --remote 192.168.3.101:2121
На стороне клиента подключаемся к хосту 192.168.3.101
через прокси с адресом 192.168.3.100
:
ssh lifailon@192.168.3.100 -p 3131
Пример переадресации запросов от клиента (конфигурация rsyslog
клиента справа) по протоколу UDP (один символ @
в конфигурации) к серверу Visual Syslog слушающего запросы на порту 514
через прокси сервер, который слушает запросы на порту 5514
.
💡 При использовании протокола UDP
локальный адрес не указывается.
froxy --local 5514 --remote 192.168.3.100:514
При использовании проксирования с использованием протоколов HTTP или HTTPS, необходимо передать url адрес, который начинается с наименования протокола http://
или https://
.
💡 Поддерживается передача данных через GET
и POST
запросы.
В примере, прокси сервер принимает запросы на интерфейсе с ip-адресом 192.168.3.100
на порту 8443
для перенаправления на удаленный url-ресурс Кинозал. Подключение производится от клиента с ip-адресом 192.168.3.99
с использованием метода GET
. Указаны все конечные точки, к которым обращается клиент для загрузки главной страницы.
froxy --local 192.168.3.100:8443 --remote https://kinozal.tv
HTTP protocol is used
Listening on 192.168.3.100:8443 for forwarding to https://kinozal.tv
Not authorization is used
[16:03:43] 192.168.3.99 GET: /
[16:03:43] 192.168.3.99 GET: /pic/0_kinozal.tv.css?v=3.4
[16:03:43] 192.168.3.99 GET: /pic/jquery-3.6.3.min.js?v=1.1
[16:03:43] 192.168.3.99 GET: /pic/use.js?v=3.7
[16:03:43] 192.168.3.99 GET: /pic/logo3.gif
[16:03:43] 192.168.3.99 GET: /pic/emty.gif
[16:03:44] 192.168.3.99 GET: /pic/radio_ban.jpg
[16:03:44] 192.168.3.99 GET: /pic/knz_love.gif
[16:03:44] 192.168.3.99 GET: /i/poster/1/1/1718811.jpg
[16:03:44] 192.168.3.99 GET: /pic/cat/45.gif
[16:03:44] 192.168.3.99 GET: /pic/l_portiere.gif
[16:03:44] 192.168.3.99 GET: /pic/sbg.gif
[16:03:44] 192.168.3.99 GET: /pic/r_portiere.gif
[16:03:44] 192.168.3.99 GET: /pic/cat/17.gif
[16:03:44] 192.168.3.99 GET: /pic/dw2.png
[16:03:44] 192.168.3.99 GET: /pic/status_icons.png
[16:03:44] 192.168.3.99 GET: /pic/srch_l.png
[16:03:44] 192.168.3.99 GET: /pic/srch_r2.png
[16:03:44] 192.168.3.99 GET: /pic/flags_all.png?v=1
[16:03:44] 192.168.3.99 GET: /i/poster/4/1/1772641.jpg
[16:03:44] 192.168.3.99 GET: /i/poster/3/7/541437.jpg
[16:03:44] 192.168.3.99 GET: /pic/cat/11.gif
[16:03:44] 192.168.3.99 GET: /pic/cat/20.gif
[16:03:45] 192.168.3.99 GET: /i/poster/8/0/467680.jpg
[16:03:45] 192.168.3.99 GET: /i/poster/2/1/2040221.jpg
[16:03:45] 192.168.3.99 GET: /pic/cat/8.gif
[16:03:45] 192.168.3.99 GET: /pic/favicon.ico
Авторизация на сайте через POST
запрос:
[16:05:19] 192.168.3.99 POST: /takelogin.php
[16:05:20] 192.168.3.99 GET: /pic/0_kinozal.tv.css?v=3.4
[16:05:20] 192.168.3.99 GET: /pic/ava_m.jpg
[16:05:20] 192.168.3.99 GET: /pic/logo3.gif
[16:05:20] 192.168.3.99 GET: /pic/use.js?v=3.7
[16:05:20] 192.168.3.99 GET: /pic/jquery-3.6.3.min.js?v=1.1
[16:05:21] 192.168.3.99 GET: /pic/minus.gif
[16:05:21] 192.168.3.99 GET: /pic/plus.gif
[16:05:21] 192.168.3.99 GET: /pic/r5.gif
[16:05:21] 192.168.3.99 GET: /pic/bnr_pay_sm.jpg
[16:05:21] 192.168.3.99 GET: /pic/emty.gif
[16:05:21] 192.168.3.99 GET: /pic/srch_l.png
[16:05:21] 192.168.3.99 GET: /pic/r_portiere.gif
[16:05:21] 192.168.3.99 GET: /pic/sbg.gif
[16:05:21] 192.168.3.99 GET: /pic/bgmn.gif
[16:05:21] 192.168.3.99 GET: /pic/srch_r2.png
[16:05:21] 192.168.3.99 GET: /pic/l_portiere.gif
[16:05:21] 192.168.3.99 GET: /pic/flags_all.png?v=1
Для использования авторизации на стороне прокси сервера, необходимо заполнить соответствующие параметры при запуске. Если клиент передает неверные авторизационные данные, то это будет отображено в логе.
froxy --local 192.168.3.100:8443 --remote https://kinozal.tv --user proxy --pass admin
HTTP protocol is used
Listening on 192.168.3.100:8443 for forwarding to https://kinozal.tv
Authorization is used
[16:07:44] 192.168.3.100 GET: /
[16:07:44] 192.168.3.100 GET: Authorization form sent
[16:07:48] 192.168.3.100 GET: /
[16:07:48] 192.168.3.100 GET: Authorization error
[16:07:49] 192.168.3.100 GET: /
[16:07:49] 192.168.3.100 GET: Authorization form sent
[16:07:53] 192.168.3.100 GET: /
[16:07:54] 192.168.3.100 GET: /pic/0_kinozal.tv.css?v=3.4
[16:07:54] 192.168.3.100 GET: /pic/jquery-3.6.3.min.js?v=1.1
[16:07:54] 192.168.3.100 GET: /pic/use.js?v=3.7
[16:07:54] 192.168.3.100 GET: /pic/logo3.gif
[16:07:54] 192.168.3.100 GET: /pic/emty.gif
[16:07:55] 192.168.3.100 GET: /pic/radio_ban.jpg
[16:07:55] 192.168.3.100 GET: /pic/knz_love.gif
[16:07:55] 192.168.3.100 GET: /i/poster/1/1/1718811.jpg
[16:07:55] 192.168.3.100 GET: /pic/cat/45.gif
[16:07:55] 192.168.3.100 GET: /pic/dw2.png
[16:07:55] 192.168.3.100 GET: /pic/cat/17.gif
[16:07:55] 192.168.3.100 GET: /i/poster/4/1/1772641.jpg
[16:07:55] 192.168.3.100 GET: /i/poster/3/7/541437.jpg
[16:07:55] 192.168.3.100 GET: /pic/cat/11.gif
[16:07:55] 192.168.3.100 GET: /pic/cat/20.gif
[16:07:55] 192.168.3.100 GET: /i/poster/8/0/467680.jpg
[16:07:55] 192.168.3.100 GET: /i/poster/2/1/2040221.jpg
[16:07:55] 192.168.3.100 GET: /pic/cat/8.gif
[16:07:56] 192.168.3.100 GET: /pic/srch_l.png
[16:07:56] 192.168.3.100 GET: /pic/srch_r2.png
[16:07:56] 192.168.3.100 GET: /pic/l_portiere.gif
[16:07:56] 192.168.3.100 GET: /pic/r_portiere.gif
[16:07:56] 192.168.3.100 GET: /pic/sbg.gif
[16:07:56] 192.168.3.100 GET: /pic/status_icons.png
[16:07:56] 192.168.3.100 GET: /pic/flags_all.png?v=1
[16:07:57] 192.168.3.100 GET: /pic/favicon.ico
-
🧲 Kinozal Bot - Telegram бот, который позволяет автоматизировать процесс доставки контента до вашего телевизора, используя только телефон. Предоставляет удобный интерфейс для взаимодействия с торрент трекером Кинозал и базой данных TMDB для отслеживания даты выхода серий, сезонов и поиска актеров для каждой серии, а также возможность управлять торрент клиентом qBittorrent или Transmission на вашем компьютере, находясь удаленно от дома и из единого интерфейса.
-
✨ TorAPI - неофициальный
API
(backend) для торрент трекеров RuTracker, Kinozal, RuTor и NoNameClub. Используется для быстрого поиска раздач, а также получения torrent-файлов, магнитных ссылок и подробной информации о раздаче по названию фильма, сериала или идентификатору раздачи, а также предоставляет новостную RSS ленту для всех провайдеров. -
🔎 LibreKinopoisk - расширение Google Chrome, которое добавляет кнопки на сайт Кинопоиск и предоставляет интерфейс TorAPI в стиле Jackett (без необходимости устанавливать серверную часть и использовать VPN) для быстрого поиска фильмов и сериалов в открытых источниках.
-
❤️ WebTorrent Desktop api - форк клиента WebTorrent Desktop, в котором добавлен механизм удаленного управления через
REST API
на базе Express Framework.