nc - кто делал подобие прокси? поделитесь опытом

Тема в разделе "Raspberry Pi", создана пользователем Igor68, 30 сен 2017.

  1. Igor68

    Igor68 Гуру

    Доброго времени суток!
    Собственно вопрос в названии.
    Цель - подобие прокси сервера на bash (ну или python... предпочтительно bash). И вырезать ряд строк из web страниц на лету. По шаблону (или правилам скрипта) разумеется.
    Спасибо заранее!
     
  2. Igor68

    Igor68 Гуру

    Вот наткнулся на кое-что:
    Код (Bash):
    #!/bin/sh -e

    if [ $# != 3 ]
    then
        echo "usage: $0 <src-port> <dst-host> <dst-port>"
        exit 0
    fi

    TMP=`mktemp -d`
    BACK=$TMP/pipe.back
    SENT=$TMP/pipe.sent
    RCVD=$TMP/pipe.rcvd
    trap 'rm -rf "$TMP"' EXIT
    mkfifo -m 0600 "$BACK" "$SENT" "$RCVD"
    sed 's/^/ => /' <"$SENT" &
    sed 's/^/<=  /' <"$RCVD" &
    nc -l -p "$1" <"$BACK" | tee "$SENT" | nc "$2" "$3" | tee "$RCVD" >"$BACK"
    но пока не ясно как <dst-host> и <dst-port> подучать не при запуске вот такого вида(с выводом при подключении браузера):
    Код (Bash):
    igor@debian-i:~/coding/bash/proxy$ ./tcp-proxy.sh 8080 www.google.com 80
    => GET http://127.0.0.1:8080/ HTTP/1.1
    => Host: 127.0.0.1:8080
    => Proxy-Connection: keep-alive
    => User-Agent: Mozilla/5.0 (X11; Linux i686) KHTML/4.8.4 (like Gecko) Konqueror/4.8
    => Accept: text/html, text/*;q=0.9, image/jpeg;q=0.9, image/png;q=0.9, image/*;q=0.9, */*;q=0.8
    => Accept-Encoding: gzip, deflate, x-gzip, x-deflate
    => Accept-Charset: utf-8,*;q=0.5
    => Accept-Language: en-US,en;q=0.9
    =>
    <=  HTTP/1.1 301 Moved Permanently
    <=  Location: http://www.google.com:8080/
    <=  Content-Type: text/html; charset=UTF-8
    <=  Date: Sun, 01 Oct 2017 09:25:47 GMT
    <=  Expires: Tue, 31 Oct 2017 09:25:47 GMT
    <=  Cache-Control: public, max-age=2592000
    <=  Server: gws
    <=  Content-Length: 224
    <=  X-XSS-Protection: 1; mode=block
    <=  X-Frame-Options: SAMEORIGIN
    <=
    <=  <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
    <=  <TITLE>301 Moved</TITLE></HEAD><BODY>
    <=  <H1>301 Moved</H1>
    <=  The document has moved
    <=  <A HREF="http://www.google.com:8080/">here</A>.
    <=  </BODY></HTML>
    => GET http://127.0.0.1:8080/ HTTP/1.1
    => Host: 127.0.0.1:8080
    => Proxy-Connection: keep-alive
    => User-Agent: Mozilla/5.0 (X11; Linux i686) KHTML/4.8.4 (like Gecko) Konqueror/4.8
    => Accept: text/html, text/*;q=0.9, image/jpeg;q=0.9, image/png;q=0.9, image/*;q=0.9, */*;q=0.8
    => Accept-Encoding: gzip, deflate, x-gzip, x-deflate
    => Accept-Charset: utf-8,*;q=0.5
    => Accept-Language: en-US,en;q=0.9
    =>
    <=  HTTP/1.1 301 Moved Permanently
    <=  Location: http://www.google.com:8080/
    <=  Content-Type: text/html; charset=UTF-8
    <=  Date: Sun, 01 Oct 2017 09:25:53 GMT
    <=  Expires: Tue, 31 Oct 2017 09:25:53 GMT
    <=  Cache-Control: public, max-age=2592000
    <=  Server: gws
    <=  Content-Length: 224
    <=  X-XSS-Protection: 1; mode=block
    <=  X-Frame-Options: SAMEORIGIN
    <=
    <=  <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
    <=  <TITLE>301 Moved</TITLE></HEAD><BODY>
    <=  <H1>301 Moved</H1>
    <=  The document has moved
    <=  <A HREF="http://www.google.com:8080/">here</A>.
    <=  </BODY></HTML>
     
    а получать эти параметры из запроса браузера:
    Код (Bash):
    => GET http://127.0.0.1:8080/ HTTP/1.1
    => Host: 127.0.0.1:8080
    => Proxy-Connection: keep-alive
    => User-Agent: Mozilla/5.0 (X11; Linux i686) KHTML/4.8.4 (like Gecko) Konqueror/4.8
    => Accept: text/html, text/*;q=0.9, image/jpeg;q=0.9, image/png;q=0.9, image/*;q=0.9, */*;q=0.8
    => Accept-Encoding: gzip, deflate, x-gzip, x-deflate
    => Accept-Charset: utf-8,*;q=0.5
    => Accept-Language: en-US,en;q=0.9
    Заранее Спасибо!
     
    arkadyf нравится это.
  3. rkit

    rkit Гуру

    Берем любимый http прокси и ищем к нему соответствующий плагин.
    А на баше городить - себе жизнь усложнять.
     
  4. Igor68

    Igor68 Гуру

    Вообще-то утилита NetCat работает... испытал ряд примеров. И как прокси все прходит, правда на других примерах. Вопрос только в том, что в браузере набираем адрес и... в парметрах скрипта тоже надо указывать тот же адрес. Хотелось бы его получать из запроса браузера. Протестировал и такое:
    Код (Bash):
    #рабочий цикл
    function _fp1()
    {
        ((loop = 1))
        while( ((loop > 0)) )
         do
          echo "--test--"
          sleep 1
        done
    }
    _fp1 &
     
    скрипт... точнее его одна функция продолжает работать и после выхода из скрипта - а это GOOD!
    и такая конструкция в тени:
    Код (Bash):
    sed 's/^/ => /' <"$SENT" &
    sed 's/^/<=  /' <"$RCVD" &
     
    Очень понравилась - фильтрация потоков на лету.
    Пробую. Хотя Squid поставил, но не разобрался. А вообще хочу запустить на moxa или вообще роутере. В BASH универсально с программной точки зрения. Не даром же скачал и скомпилировал NC для moxa:
    https://www.moxa.ru/forum/index.php?/topic/25195-skazka-pro-nc-ili-kak-ego-ne-khvatalo/
     
    Последнее редактирование: 1 окт 2017
    arkadyf нравится это.
  5. rkit

    rkit Гуру

    Это не "работает как прокси". У прокси свой протокол, который решает эти проблемы, и писать его на баше - пустая трата времнеи.
     
  6. Igor68

    Igor68 Гуру

    Спорить никак не могу но вот:
    snapshot46.png
    Только запускал так :
    Код (Bash):
    /tcp-proxy.sh 8080 www.google.ru 80
     
    Браузер в свою очередь настроен на работу через прокси на локальной машине с портом 8080. Тоесть сделан один запрос и получен ответ. После чего скрипт завершил работу - он не цикличен, а просто пример. Понимаю, что это не прокси... будь у меня опыт с применением Squid и удачные результаты компиляции его из исходников для иных чем малина и ПК устройств... наверное и не трогал эту тему. По идее браузер должен послать и остальные запросы, если бы скрипт был доведён до ума.
     
    arkadyf нравится это.
  7. Igor68

    Igor68 Гуру

    Кстати вот посмотрите:
    Код (Bash):
    => GET http://www.google.ru/xjs/_/js/k=xjs.hp.en_US.xSVID3UgLuQ.O/m=sb_he,d/am=ABg/rt=j/d=1/t=zcms/rs=ACT90oEh2y26dtPEPoBVHRkD1LLulBcgmg HTTP/1.1
     
    Это была попытка браузера послать очередной запрос после того как в скрипте сделаны изменения:
    Код (Bash):
    (( work = 1))
    while( ((work == 1)) )
    do
    nc -l -p "$1" <"$BACK" | tee "$SENT" | nc "$2" "$3" | tee "$RCVD" >"$BACK"
    done
     
    вместо этого:
    Код (Bash):
    nc -l -p "$1" <"$BACK" | tee "$SENT" | nc "$2" "$3" | tee "$RCVD" >"$BACK"
     
    вот только параметры $2 и $3 изменить было некому в цикле потому, как они заданы
     
    arkadyf нравится это.