Как открыть свой прокси сервер

Написание HTTP-прокси-сервера с плагинами

В какой-то момент была тема, что в одной из онлайн-игр есть такая надоедливая штука, как капча. Просто быть отбитым от игры за ввод капчи может быть не очень хорошими последствиями, особенно если вы не заходите с первого раза, враги тоже могут вас раздражать. Но дело не в этом. Что-то особенно плохое для тех, кто использует локальных ботов. Малыши спотыкаются о капчу и игра тут же штрафует их потерянными юнитами и ресурсами. Некрасивая штука.

Итак, задача такая:
Хотелось бы избежать ввода капчи. Даже если вы играете один, даже если за вас играет бот, пока вы спите.
Еще одно условие: 40 часов времени (на корабельную панику).
Требуемое состояние: установочный файл Windows.
Еще одно желательное условие: результат не должен быть больше одного мегабайта.

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

И что делать?

Попытка 1

Напишите системный инструмент, который собирает HTTP-запросы и ответы от всех установленных программ и фильтрует их для ответов, требующих проверки по слову, вводя их самостоятельно. Над программой, которую около полугода должны были решать два белорусских программиста, они сменили платформу с C на C#, а затем на Java и смирились с тем, что им может понадобиться установить OpenSSL на машины. Задание затемняется ненужными деталями. Ну, в общем, не сработало.

Тест 2: Только, только

Довольно понятно, что способов не так много, и выбор был только между SOCKS-прокси и HTTP-прокси . Через некоторое время стало ясно, что не все юзер-агенты поддерживают прокси SOCKS и выбор был очевиден.

Выбор платформы

Выбор был не сложным, особенно учитывая намерение 1. C и C# были быстро исключены из-за полного отсутствия опыта. Были определены следующие платформы, богатые основными библиотеками:

Java Трудно представить, что пользователи захотят установить JVM, которая очень много весит, для установки такого небольшого инструмента. десятки мегабайт. Java объявлен устаревшим.

Python Как вы знаете, он работает везде и все включено (включая батареи). Он весит 7 МБ. По современным меркам, конечно, немного, но все же хотелось покомпактнее. Остается вопрос, как внедрить этот установщик в мой установщик утилиты. Я не знаю, как это делается в приложениях Python, может быть, намного проще, но я один раз сделал установщик в установщике и больше не хочу.

Ruby Когда я начал глядя, не было одношаговой программы установки для Windows. Полностью. Сейчас есть, включает в себя установку MinGW, MSYS и прочего, при установке может напугать пользователя. Вес 7 Мб.
Остается вопрос про инсталлятор в установщике.

Lua Очень старый и популярный язык среди программистов игр на C++. Медленное сообщество, разрозненное библиотеки. Вес кастомной сборки ВМ с необходимыми библиотеками всего 800 Кб. Инсталлятор не предусмотрен, есть набор exe-файлов, которые передаются lua-скрипту в качестве параметра для его запуска. What You Need также скомпилирован для Win, MacOS, Linux, каждый в 32 и 64 версиях отдельно. Именно то, что нужно.

Читайте также:  Как получить кэшбэк уфанет

Так я начал изучать Lua (сбылось новогоднее желание, я выучил новый язык программирования).
Язык имеет отличные функции, такие как:
— Песочница (у Ruby есть патч только для версии 1.8.5): позволяет вам запускать сторонний код, что ограничивает вашу среду;
— сопрограммы (как рубиновые потоки начиная с 1.9): позволяет очень легкую совместную многозадачность;
— очень простая структура данных (точнее, простая, ассоциативное поле всего одно), которой оказалось достаточно для выполнения большинства задач по обработке данных;
…там еще много всего, сложно уместить в один пост.

Проще всего было сделать такую ​​систему в виде HTTP-прокси, который бы фильтровал запросы и ответы, что и решил сделать (от хорошего к хорошему, не к хорошему).

Идея проста: вешать TCP-сервер, слушать, что запрашивает клиент, анализировать HTTP-заголовки, искать HOST, удалять HTTP-заголовок «Proxy-Connection», отправить запрос, кому он предназначен, получить ответ, отправить клиенту и т. д.

Ответ от сервера должен быть отфильтрован, и вы можете, если сервер не используя HTTPS, чего, к счастью, нет. Все оказалось очень просто, оказывается, все, что вам нужно сделать, это написать аналог механизма для Ruby, лишенный 190 строк Lua, который делает все, что может придумать с заголовками и телом запроса, позволяя вам писать фильтры, которые вы хотите для HTTP-запросов.

Ну , в данном случае нам нужно было избавиться от вредоносной reCAPTCHA, для чего нам нужно было просто определить:
— если первоначальный запрос щелкнул на странице Travian (и была ли запрошена HTML-страница ):
string.find(request .uri() , ‘travian’) and mimetype и string.find(mimetype, ‘text/html’)

— если в результате страницы вместо » полезные» игровые данные:
локальная капча, captcha_key = string.match(response.body()), ‘

Как решить настоящую капчу (с помощью не очень современных индейцев и высокой производительности, но крайне дешёвые живые индусы) немного выходит за рамки нашей чисто технической темы, так что в другом месте.

В итоге изображение капчи было скачано и отправлено индусам (дважды для верности), ответы получены через 5-10 секунд сравнивались, и если они были одинаковыми, результат отправлялся на HTTP POST-запрос Travian, на который жертва отдавала страницу, бодро говоря, что мы люди и много «полезных» игровых данных. Эта страница ничего не показала подозрительному покупателю, который мог заметить только небольшую паузу. В пессимистическом случае несоответствия изображение отправляли обратно индусам, и так далее, пока не были получены хотя бы два одинаковых решения, остальные отправляли в поддержку для возврата (практически никакого подарка для индусов).

Вот оно, решение здесь.

Однако произошло то, чего никто не мог себе представить. По какой-то причине пользователям также нужен доступ к другим сайтам — немыслимо! Были даже сайты, доступ к которым осуществлялся через HTTPS, и с этим нужно было что-то делать без регулярного включения и выключения прокси.
Также необходимо было получать несколько запросов одновременно. Досадно, что Google Analytics иногда отправляет запрос, который занимает минуты, что убивает однопоточный прокси-сервер.

Кроме того, существовало до трех разных библиотек для создания асинхронного TCP-сервера. То есть ждем входящего подключения, получаем кусок данных, передаем управление диспетчеру, смотрим есть ли еще входящие подключения или открытые подключения по которым есть данные (select/kpoll/epoll), передаем управление по одному .

Читайте также:  Как получить зарплату на радмире крмп

Ах да, поскольку все эти типы соединений происходят на локальном компьютере, все происходит почти мгновенно. И медленные соединения уходят. Играться с существующими библиотеками (тигли, асок), предназначенными для мультиплексирования входящих подключений, было сложнее, чем писать свою. И я написал немного (272 строки) от себя. Кроме того, чтобы все входящие и исходящие соединения работали асинхронно, можно добавить в пул больше подпрограмм, работающих в общем цикле (поправьте меня, люди с профильным образованием).

Ну вот, все стало работать параллельно , а если по скорости, то чуть отстает от того, как работает без прокси.

Каково же было мое удивление, когда я получил от сервера страница с (включая) заголовками:
Content-encoding: gzip
Transfer-encoding: chunked
и собственно весь кракозябр в качестве тела ответа.

Первой мыслью было отключить кодирование для получение запроса, чтобы сервер не пытался упаковать данные и преобразовать HTTP 1.1 в HTTP 1.0, чтобы он не отправлял «фрагменты». Но подумал о падении скорости и росте трафика и пожалел пользователей.
Получилось так:
if headers(pipe, target)[‘Transfer-Encoding’] == ‘chunked’ then
target.body = dechunk(target.body)
end

функция dechunk(chunk)
локальный размер блока
локальный блок
локальные блоки = <>
chunk, chunk_size = readline(chunk)

, в то время как chunk_size и tonumber(chunk_size, 16) > от 0 до
чанк, чанк = прочитанные байты(чанк, номер_размера(размер_чанка, 16))

table.insert(чанки, чанк)
чанк, чанк_размер = строка чтения(чанк)
если не chunk_size или chunk_size == » then — иногда присутствует crlf, иногда нет
chunk, chunk_size = readline(chunk)
end
end

return table.concat ( chunks )
конец

Я пошел читать материал. Слава богу, достойные баллы в этой документации.
Вставляем «чанки», получаем gzip-файл (иногда лопается, но я пока не видел). Распаковать (спасибо Дэвиду Мануре за библиотеку).
Декомпрессия еще проще:
если headers(pipe, target)[‘Content-Encoding’] == ‘gzip’ и #target.body > 0, затем
локально декодируется = <>
gzip.gunzip
target.body = table.concat(decoded)
end

Осталось немного
: HTTPS-туннелирование для HTTPS-сайтов (слава богу, не нужно связывать OpenSSL, просто прозрачно передавайте данные туда и обратно):
if request.method() == ‘CONNECT’ then
sent_to_local_server , err = client.send(«Соединение HTTP/1.0 200 создано\r\nProxy-Agent: BotHQ-Agent/1.2\r\n\r\n»)
print(‘прозрачное соединение https’ )
https(клиент, сервер)
return
end

локальная функция https(client, server)
close_callback = function()
client.close()
server . close()
конец

client.receive_subscription(функция(данные)
server.send(данные)
завершение, close_callback)

server.receive_subscription(функция(данные) ))
client.send(data)
end, close_call)
end

: install the installer:
В общем приключения по запуску 7zip sfx на Heroku заслуживает отдельного поста. Радость победы затмевает все сложные моменты развития.

Ну, не знаю, как вам, а мне было интересно и увлекательно. Я не жалею о потраченном времени.

Резюме:
Собственный прокси-сервер Line 71 здесь.
Асинхронная библиотека TCP-сервер-клиент на 272 строки здесь.
Аналог HTTP-клиента на 190 строк.
Фильтр решения капчи на 150 строк здесь.
Размер установочного файла меньше одного мегабайта.

Источник

🛠 Как создать свой собственный VPN и прокси-сервер за 3 простых шага

Мирослав Кунгуров

В первую очередь блокируются крупные VPN-сервисы. Итак, у нас есть два варианта:

  • Воспользуйтесь услугами компаний среднего звена.
  • Узнайте, как самостоятельно настроить VPN и прокси.

Первый вариант удобнее: можно выбирать разные локации, есть подписки для разных устройств и удобные приложения для смартфонов. Но вместо VPN они могут проскочить на обычный прокси и слить личные данные. Второй вариант безопаснее и дешевле, но требует (очень мало) технических навыков.

Где найти иностранные VPN-сервисы?

На сайтах-агрегаторах VPN:

Таблица доступных VPN-сервисов в России:

VPN Количество сайтов Количество устройств<12
cyberghostvpn.com 60 7
perfect-privacy.com 23
torguard.net 53 5
hide .me 34 5
privatevpn .com 45 10
f-secure.com 23 7
vpnsecure.me 50 5
time4vps.com 13 6
airvpn.org 20 5
Читайте также:  Как получить личностный рост

Где найти зарубежные сервера?

На сайте агрегатора VPS/VDS:

После покупки сервер, вы можете начать установить VPN/прокси.

1. OpenVPN и Pritunl

Pritunl — это бесплатное программное обеспечение, предоставляющее веб-интерфейс для управления OpenVPN и Wireguard.

Простое видео руководство по установке OpenVPN (Pritunl) на Ubuntu:

1.1. Настроить Pritunl

Обновить список пакетов и систему (в этой статье используется Ubuntu 20):

Добавить Pritunl в репозиторий:

Запустить и активировать Pritunl:

Убедитесь, что Prtinul запущен:

Если все работает, мы увидим следующую запись:

Добавьте MongoDB в репозиторий:

Убедитесь, что MongoDB работает :

Если служба запущена, получаем следующий вывод:

Переходим на сервер с IP-адресом https://ip-адрес .

Чтобы получить ключ установки, введите в терминале:

Начать настройку

Сгенерируйте пару логин/пароль:

Вернемся назад к серверу по IP:

Вход в веб-интерфейс Pritunl

1.2. Настройка Pritunl

Чтобы начать использовать Pritunl, вам необходимо:

  1. Создать сервер Pritunl.
  2. Создайте организацию и подключите ее к серверу.
  3. Создайте пользователя и прикрепите его к организации.

Создать сервер

Чтобы создать сервер, перейдите на вкладку Серверы → Добавить сервер и активируйте вкладку Дополнительно:

Создание сервер в Притунле

Создать организацию

Перейти на вкладку Пользователи →Добавить организацию и добавить новую организацию:

Создать организацию в Pritunl

Подключим организацию к серверу. Для этого перейдите на вкладку Серверы → Подключить организацию:

Подключить организацию к серверу в Притуне

Нажмите кнопку Старт, чтобы запустить сервер.

Создать пользователя

Чтобы создать пользователя, перейдите на вкладку Пользователи → Добавить пользователя:

Создание пользователя в Pritunl

1.3. Передача ключей

Чтобы подключиться к VPN, загрузите и установите клиент для своей операционной системы с сайта pritunl.com/platforms. Вернёмся на сервер и перейдём во вкладку Пользователи → Добавить пользователя и нажмём на иконку с цепочкой:

Раздача ключей в Притунле

Раздача ключей в Притунле

Вставьте URI в клиент и подключитесь к VPN:

Подключение к серверу Pritunl

Мы подключились к серверу.

2. Shadowsocks и Outline

Outline был создан Jigsaw, стартапом, аффилированным с Google. В Outline используется протокол Shadowsocks, который маскирует данные под HTTPS-трафик.

Для установки Outline потребуется Docker.

2.1. Установите Docker

Обновите систему и список пакетов:

Установите пакеты, чтобы разрешить установку пакетов через HTTPS:

Добавьте ключ GPG для репозитория Docker в систему:

Добавить репозиторий Docker в систему:

Обновить список пакетов:

2.2. Установка Outline Manager

С помощью Outline Manager вы можете добавлять и удалять серверы и распространять ключи. Скачайте менеджер по ссылке getoutline.org/ru/get-started :

Установить диспетчер схем

Выберите собственную схему в любом месте:

Установите Outline на сервер

Если хотите для установки Outline введите команду из шага 1 на сервер:

Команда для установки Outline на сервер

После установки Schema мы получим строку с информацией о нашей схеме server в формате JSON:

Скопируйте строку JSON, вставьте ее во второе поле диспетчера схем и нажмите Готово.

Теперь мы можем поделиться ключом доступа с кем угодно:

Администратор схемы

2.3. Передача ключей

Загрузите и установите клиент схемы:

Установка клиента схемы

Откройте менеджер схемы и скопируйте ключ в клиент схемы Схема:

Подключение к серверу Outline Подключение к серверу Outline

Если клиент Outline не подключается к серверу в Windows 10, необходимо чтобы отключить Hyper V. Для этого откройте PowerShell от имени администратора и введите:

В этой статье мы узнали:

  • Создать VPN-подключение с помощью Притунла;
  • создать прокси по схеме;
  • Делитесь VPN и прокси с другими пользователями.

Источник

Поделиться с друзьями
Решатор
Adblock
detector