Делаем анонимайзер на Nginx + Lua

Тема в разделе 'Разработка, техподдержка, инструкции', создана пользователем Roscenzura.com, 16 авг 2014.

  1. Roscenzura.com

    Roscenzura.com Администратор Staff Member

    Симпатии:
    198
    Репутация:
    0
    Сегодня, с развитием цензуры, анонимайзеры востребованы все больше. В этой статье мы расскажем, как сделать свой собственный анонимайзер на Nginx в связке с модулем Lua. Можно, конечно, поставить готовый скрипт, наподобие Glype Proxy, но решение на Nginx удобнее и производительнее.

    На Хабре есть статья Проксируем и Спасаем, где описано, как проксировать сайт через Nginx в связке с модулем ngx_http_substitutions_filter_module. Данное решение годится, только если требуется проксировать какие-то конкретные сайты, но не годится для нашей задачи. Дело в том, что функция subs_filter (для поиска и замены текста в содержимом страницы) модуля ngx_http_substitutions_filter_module не умеет искать по переменной и такая конструкция не сработает:
    Код:
    # $domain - проксируемый сайт, $mirror - наше зерало
    subs_filter $domain $mirror;
    
    Эта странная особенность модуля ngx_http_substitutions_filter_module делает его непригодным для создания анонимайзера, если, конечно, не найдутся желающие доработать модуль, либо появится новая версия, где поиск переменной будет работать.

    Вместо ngx_http_substitutions_filter_module для замены ссылок в содержимом страницы мы будем использовать модуль Lua.
    Скачиваем модуль по ссылке, либо через консоль:
    Код:
    wget http://www.lua.org/ftp/lua-5.2.3.tar.gz
    tar zxf lua-5.2.3.tar.gz
    cd lua-5.2.3
    make linux test
    Для сборки Nginx с новым модулем устанавливаем дополнительные пакеты.

    Для CentOS:
    Код:
    yum install gcc gcc-c++ kernel-devel
    yum groupinstall 'Development Tools'
    
    Для Debian/Ubuntu:
    Код:
    aptitude install build-essential
    Устанавливаем Lua.
    Код:
    yum install gcc* -y # обновляем репозиторий
    yum install libpcre3 libpcre3-dev libperl-dev lua liblua-dev
    
    Скачиваем новую версию Nginx:
    Код:
    wget http://nginx.org/download/nginx-1.6.1.tar.gz
    tar –xvf nginx-1.6.1.tar.gz
    cd nginx-1.6.1
    
    Смотрим, какие модули уже установлены:
    Код:
    nginx -V
    Теперь копируем вывод команды nginx -V в текстовой редактор, начиная от --prefix= и до первого --add-module= (все присутствующие в выводе --add_module= нам не нужны).
    Должно получиться примерно следующее:
    Код:
    --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_spdy_module --with-cc-opt='-O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic' --with-http_gzip_static_module --with-pcre-jit --with-http_ssl_module
    Теперь добавляем в конфигурацию запись --add-module=/root/lua-5.2.3, где /root/lua-5.2.3 - это пусть, куда мы распаковали модуль Lua.
    И собираем Nginx:
    Код:
    cd /root/nginx-1.6.1
    ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_spdy_module --with-cc-opt='-O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic' --with-http_gzip_static_module --with-pcre-jit --with-http_ssl_module --add-module=/home/ngx_http --add-module=/root/lua
    
    make
    make install
    

    Настраиваем конфиг Nginx.

    Для удобства, мы сделаем анонимайзер на поддоменах (по такому принципу работает известный анонимайзер hideme.ru). Так, если основной домен у нас domain.com, то проксируемый сайт будет выглядеть так: website.com.domain.com. Но есть одна проблема. Дело в том, что некоторые провайдеры блокируют запрещенные сайты по маске *website.com*, а значит, адрес вида website.com.domain.com нам не подходит. Необходимо зашифровать ссылку. Например, мы можем использовать вместо точки последовательность цифр 00100, таким образом, проксируемый сайт будет выглядеть так: website00100com.domain.com.

    Итак, для начала мы создадим скрипт на lua, который будем подключать в конфиг Nginx. Назовем его replace.lua и поместим в папку /etc/nginx/scripts/.
    Содержимое replace.lua:
    Код:
    #! usr/bin/lua
    -- /etc/nginx/scripts/subs.lua
    response_body = ngx.arg[1]
    response_body = response_body:gsub(ngx.var.domain, ngx.var.subdomain)
    ngx.arg[1]=response_body
    
    Редактируем конфиг Nginx (/etc/nginx/nginx.conf):
    Код:
    ...
    server
    {
      listen 80;
    
      server_name ~^(?<one>[a-z0-9-\.]+)00100(?<two>[a-z0-9\-]+)\..domain.com; # берем из адреса название домена и доменную зону проксируемого сайта
    
      location /
      {
           root /home/domain.com/www;
           try_files $uri @static;
      }
    
      location @static
      {
          set $domain $one.$two; # $domain - проксируемый сайт
          set $t 00100$two;
          set $subdomain $one$t.domain.com; # это наш поддомен вида  website00100com.domain.com
    
          body_filter_by_lua_file /etc/nginx/scripts/replace.lua; # скрипт lua заметит в проксируемом сайте все ссылки вида website.com на website00100com.domain.com
    
          proxy_set_header Host $domain;
          proxy_cookie_domain $domain $subdomain.domain.com;
    
          proxy_set_header Accept-Encoding "";
    
          resolver 8.8.8.8;
    
          set $backend $domain;
    
          proxy_pass http://$backend;
    
          proxy_redirect http://$domain http://$subdomain.domain.com;
          proxy_redirect https://$domain https://$subdomain.domain.com;
          proxy_redirect http://www.$domain http://$subdomain.domain.com;
          proxy_redirect https://www.$domain https://$subdomain.domain.com;
    
      }
    }
    
    Осталось перезагрузить Nginx командой:
    Код:
    service nginx restart
    Если у вас возникли сложности с настройкой, пишите в теме, постараемся помочь.

    Также могут пригодиться следующие материалы:
    http://firstwiki.ru/index.php/Добавление_модулей_nginx_в_Linux_(Debian/Ubuntu/CentOS)
    http://habrahabr.ru/post/130861/
     
    Last edited: 4 янв 2019
  2. Master

    Master Модератор

    Симпатии:
    81
    Репутация:
    0
    Last edited by a moderator: 24 сен 2014
  3. Roscenzura.com

    Roscenzura.com Администратор Staff Member

    Симпатии:
    198
    Репутация:
    0
    Сейчас hideme.ru использует другой алгоритм генерации ссылок.
     
  4. Igorkoff

    Igorkoff New Member

    Симпатии:
    0
    Репутация:
    0
    Нужно НАСТРОИТЬ простой proxy скрипт типа web анонимайзера чтобы работал наподобие cameleo (пример cameleo xyz) с возможностью заходить и авторизоваться на разных сайтах ( в основном Гугл).

    Для теста пробовалось скрипт Php-proxy и скрипт Glype (если по сайтам просто браузить то нормально, но при входе например в mail.google.com не реагирует при нажатии на кнопку "Далее"), а вот у других например как cameleo xyz скрипт работает и в гугл почту входишь нормально через него.

    Возможно нужно как-то подкорректировать популярный скрипт анонимайзер Glype или аналоги.

    Думаю работы там минут на 30!!!
    Оплата 3000руб сразу после выполнения (Webmoney или ЯндексДеньги)
    Мой Контакт ush_svp@mail.ru
     

Поделиться этой страницей