Обходим блокировку сайта фильтрующим прокси при помощи скрипта во имя Луны

от автора

Блокировки продолжаются а я всё также не приветствую отдачу не шифрованного HTTP трафика в заморские прокси, Tor, анонимайзеры и включение экономии трафика в браузере. Пока есть возможность я буду пытаться ходить на сайты прямо. Заодно скорость связи с сайтом не будет зависеть от загруженности стороннего сервиса.

Я поставил на Firefox плагин RequestPolicy и обнаружил в HTTP хедерах на заблокированном сайте.

X-Squid-Error:"403 Access Denied" 

В этой статье я попробую обойти это ограничение при помощи локального прокси написанного на Lua (Вики)

Скачав LuaSocket 2.0.2 я написал небольшой скрипт локального прокси.

require "socket"  local cors = {} function main() 	local proxy_bind = socket.tcp() 	proxy_bind:setoption("reuseaddr", true) -- На всякий случай 	proxy_bind:bind("localhost", 8080) -- Принимаем подключения только от локального клиента 	proxy_bind:listen(100) -- 100 подключений в очереди 	proxy_bind:settimeout(0) -- 0s Позволяет не задерживаться ожидая данных и забрать из буфера сразу всё. 	repeat -- Главный цикл который принимает подключения 		local client, accept_err = proxy_bind:accept() 		if (client) then 			local new_cor = coroutine.create(new_client) 			local ok, err = coroutine.resume(new_cor, client) 			if (ok) then 				table.insert(cors, new_cor) 			end 		end 		local new_list = {} 		for id, cor in ipairs(cors) do 			local ok, err = coroutine.resume(cor) 			if (ok) then 				table.insert(new_list, cor) 			end 		end 		cors = new_list 		socket.sleep(0.001) -- Чтоб не сильно нагружать процессор 	until accept_err and (accept_err ~= "timeout") end 

-- Читаем хедеры и соединяемся с конечным сайтом сквозь фильтрующий прокси function new_client(client) 	client:settimeout(0) 	local headers, err = get_data(client:receive("*a")) 	local host, port = get_host_port(headers) 	local server = socket.connect(host, port) 	print("NC", host, port) 	if (server) then 		if (send_connect(server, string.format("%s:%s", socket.dns.toip(host), port))) then 			server:send(headers) 			cycle_data(server, client, host) 		end 	end 	print("CLOSED", host, port) 	server:close() 	client:close() end 

function get_data(data, err, part, marker) 	data = (data or part) 	return data, err end 

function get_host_port(headers) 	local _, _, host, port = headers:find(" HTTP/1.1\13\10Host: ([a-z0-9%.%-]+):?([0-9]*)\13\10") 	if (#port > 0) then 		port = tonumber(port) 	else 		port = 80 	end 	return host, port end 

-- Используем метод CONNECT который превращает фильтрующий прокси в TCP трубу local connect = "CONNECT %s HTTP/1.1\13\10Host: %s\13\10\13\10" function send_connect(server, address) 	server:send(string.format(connect, address, address)) 	server:settimeout(0.1) 	local headers, err = get_data(server:receive("*a")) 	return headers:find("^HTTP/1.[01] 200") end 

-- Пересылаем данные в обе стороны  function cycle_data(server, client, host, port) 	local _in_, out = server, client 	repeat 		_in_:settimeout(0) 		out:settimeout(1) 		 		local data, receive_err = get_data(_in_:receive("*a")) 		 		if data and (#data > 0) then 			local index, send_err = send_data(out, data) 		end 		 		coroutine.yield() -- Даём скрипту обработать другие подключения 		 		_in_, out = out, _in_ 	until (receive_err and (receive_err ~= "timeout")) or (send_err and (send_err ~= "timeout")) end 

function send_data(out, data) 	local index = 0 	repeat 		index = index +1 		index, err = get_index(out:send(data, index)) 	until index >= #data or (err and (err ~= "timeout")) 	 	return index, err end  function get_index(index, err, partial_index) 	return (index or partial_index), err end  main() 

Сохраняем скрипт как «proxy.lua» в распакованную папку с LuaSocket 2.0.2.

Создаём простой «proxy.bat» файл для запуска «proxy.lua», который сохраним там же.

%~d0 cd %~p0 lua5.1 proxy.lua pause 

Теперь подредактируем «proxy.pac» из прошлой статьи. (Адреса изменены)

function FindProxyForURL(url, host) {    if (shExpMatch(url, "http://*") && shExpMatch(host, "rutracker.og")) {     return "PROXY localhost:8080; DIRECT";   }    /*    Для HTTPS соединений через HTTP прокси метод CONNECT используется автоматически   */    if (shExpMatch(url, "https://*") && shExpMatch(host, "rutracker.og")) {     return "PROXY rutracker.og; DIRECT";   }    return "DIRECT"; } 

Запускаем прокси двойным кликом по «proxy.bat». Перезапускаем браузер и открываем rutracker.og.

Дополнительно:
На случай возможного разделегирования домена в файл hosts добавим строку (Адреса изменены):

#198.51.100.0       rutracker.og 

И если домен разделегируют можно раскоментировать строчку удалив "#" и вернуть доступ к серверу.

Так например можно вернуть доступ к серверу rutor.og (адрес изменён) взяв его ip из реестра или других источников.

Использована информация:
Lua 5.1 Reference Manual
LuaSocket: TCP/IP support
Обходим блокировку сайта DPI двумя скриптами
Proxy Auto Configuration (PAC)
hosts — Википедия

ссылка на оригинал статьи https://habrahabr.ru/post/276623/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *