- Написание HTTP-прокси-сервера с плагинами
- 🛠 Как создать свой собственный VPN и прокси-сервер за 3 простых шага
- Мирослав Кунгуров
- Где найти иностранные VPN-сервисы?
- Где найти зарубежные сервера?
- 1. OpenVPN и Pritunl
- 1.1. Настроить Pritunl
- 1.2. Настройка Pritunl
- Создать сервер
- Создать организацию
- Создать пользователя
- 1.3. Передача ключей
- 2. Shadowsocks и Outline
- 2.1. Установите Docker
- 2.2. Установка Outline Manager
- 2.3. Передача ключей
Написание 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, вам необходимо:
- Создать сервер Pritunl.
- Создайте организацию и подключите ее к серверу.
- Создайте пользователя и прикрепите его к организации.
Создать сервер
Чтобы создать сервер, перейдите на вкладку Серверы → Добавить сервер и активируйте вкладку Дополнительно:
Создание сервер в Притунле
Создать организацию
Перейти на вкладку Пользователи →Добавить организацию и добавить новую организацию:
Создать организацию в 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 и прокси с другими пользователями.
Источник