• VLMI - форум по обмену информацией. На форуме можете найти способы заработка, разнообразную информацию по интернет-безопасности, обмен знаниями, курсы/сливы.

    После регистрации будут доступны основные разделы.

    Контент форума создают пользователи, администрация за действия пользователей не несёт ответственности, отказ от ответственности. Так же перед использованием форума необходимо ознакомиться с правилами ресурса. Продолжая использовать ресурс вы соглашаетесь с правилами.
  • Подпишись на наш канал в Telegram для информации о актуальных зеркалах форума: https://t.me/vlmiclub

Пишем прокси сервер на GO

rlySeatro

Местный
Сообщения
42
Реакции
74
0 руб.
Telegram
Решил попробовать написать небольшую статейку о том, как реализовать прокси сервер на хипстерском языке (норм язык вообще-то) - Golang
Итак, для начала постаим задачу: Реализовать прокси сервер с перехватом полного запроса.

Первый этап:
Для начала давайте определимся с архитектурой приложения.
Golang - достаточно специфиччный в этом плане.
Для нашего проекта она будет выглядить следующим образом:
Код:
|--MitmProxy/
|----src/
|------github.com/
|--------mitmproxy/
|----------main/

В нашей задаче будут использованы , только стандартные пакеты, что приятно )

Второй этап:

Теперь мы должны разобраться , какие пакеты нам понадобяться для реализации наешего кода.
Код:
import (
   "log"
   "net/http"
   "net/http/httputil"
   "net/url"
   "fmt"
)
  • log - понадобиться для логирования
  • net/http - базовый пакет для работы c HTTP протоколом
  • net/http/httputil - пакет, который имеет расширеный функционал для работы с HTTP
  • net/url - пакет для анализа URL
  • fmt - пакет для работы с вводом и выводом
Третий этап:

Приступим к написанию кода x)
Для начала мы должны решить , какой таргет у нас будет.
таргет - конечный ресурс , куда пойдет запрос
в моем случае это будет localhost:8000

Код:
target := &url.URL{Scheme: "http", Host: "localhost:8000"}

затем создадим нашу reverse proxy

Код:
np := httputil.NewSingleHostReverseProxy(target)

Ну и наконец-то запустим наш сервер, я буду поднимать его на 8088 порту

Код:
log.Fatal(http.ListenAndServe(":8088", nil))

И самый финальный штрих - получения всех запросов

Опишем функцию , которая будет перехватывать наши запросы и выводить в стандартный output

Код:
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
 dReq, err := httputil.DumpRequest(r, true)
 if err != nil {
  log.Println(err)
 }
 fmt.Println(string(dReq))
 np.ServeHTTP(w, r)
})

А теперь разберемся в мелочашь и что тут происходит:
  • http.HandleFunc - обработчик запросов по "/"
  • httputil.DumpRequest - функция , которая возвращает запрос в представлениее проводника HTTP
Четвертый этап:

Теперь давайте посмотри на результат нашей прокси)
Запускаем наш сервер с проксей

Код:
go run main.go

Запускаем наш сервер на 8000

Код:
python -m SimpleHTTPServer

037d0fd487e86cc97c41c.png

и делаем проверку:

Код:
curl http://localhost:8088

Теперь мы можем видеть:

f294eefd8056b5aa90d0f.png

6ecd936dfc2667e2217af.png

51168c872f2269af53e67.png

ПРОФИТ. Наша прокся работает

Заключение

В принципе писать софт подобного рода достаточно просто. Просто нужно явно понимать , что мы хотим увидеть в результате. Я рассмотрел вариант только с http. Скелет прокси - элементарный. Расти можно куда угодно имея хотя бы небольшое представление о программировании.

Исходник - https://pastebin.com/TPL0k9PS
 
Сверху Снизу