zodiak
Пользователь
- Регистрация
- 11.12.16
- Сообщения
- 236
- Реакции
- 191
- Баллы
- 63
- Нарушения
- 0 / 5
Пишем свой proxy-сервер
http://t.me/hackr_tg
Салют!
О том , как реализовать прокси сервер на хипстерском языке - Golang
Итак, для начала постаим задачу: Реализовать прокси сервер с перехватом полного запроса.
Первый этап:
Для начала давайте определимся с архитектурой приложения.
Golang - достаточно специфиччный в этом плане.
Для нашего проекта она будет выглядить следующим образом:
|--MitmProxy/
|----src/
|------github.com/
|--------mitmproxy/
|----------main/
В нашей задаче будут использованы , только стандартные пакеты, что приятно )
Второй этап:
Теперь мы должны разобраться , какие пакеты нам понадобяться для реализации наешего кода.
import (
"log"
"net/http"
"net/http/httputil"
"net/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)
})
А теперь разберемся в мелочашь и что тут происходит:
Четвертый этап:
Теперь давайте посмотри на результат нашей прокси)
Запускаем наш сервер с проксей
go run main.go
Запускаем наш сервер на 8000
python -m SimpleHTTPServer
и делаем проверку:
curl http://localhost:8088
Тепрь мы можем видеть:
Ура. Наша прокся работает
Заключение
В принципе писать софт подобного рода достаточно просто. Просто нужно явно понимать , что мы хотим увидеть в результате. Я рассмотрел вариант только с http. Скелет прокси - элементарный. Расти можно куда угодно имея хотя бы небольшое представление о программировании.
Исходник - https://pastebin.com/TPL0k9PS
http://t.me/hackr_tg
Салют!
О том , как реализовать прокси сервер на хипстерском языке - 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

и делаем проверку:
curl http://localhost:8088
Тепрь мы можем видеть:



Ура. Наша прокся работает
Заключение
В принципе писать софт подобного рода достаточно просто. Просто нужно явно понимать , что мы хотим увидеть в результате. Я рассмотрел вариант только с http. Скелет прокси - элементарный. Расти можно куда угодно имея хотя бы небольшое представление о программировании.
Исходник - https://pastebin.com/TPL0k9PS