Обратный прокси для IP-камеры

Обратный прокси для IP-камеры

Я использую камеру Amcrest, для рендеринга потока которой требуется базовая аутентификация (документация- стр. 17). Доступ к камере осуществляется через http://admin:password@IP_CAMERA/cgi-bin/mjpg/video.cgi.

Когда я пытаюсь нажать :56700, мне предлагается пройти аутентификацию, хотя она жестко закодирована (ниже). Даже когда я ввожу правильные учетные данные, она не проходит. Что я делаю не так?

    server {
        listen 56700;
        location / {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://IP_CAMERA/cgi-bin/mjpg/video.cgi;
            proxy_set_header Authorization "Basic xxx";
        }
    }

Я также пробовал добавлять, proxy_pass_header Authorization;как описаноздесь.

решение1

Как сказано выше, это можно решить

proxy_set_header Authorization "Basic dXNlcjpwYXNzd29yZA==";

где dXNlcjpwYXNzd29yZA==результат команды:echo -n "user:password" | base64

я думаю, вы уже это попробовали

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

location / {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://IP_CAMERA;
    proxy_set_header Authorization "Basic dXNlcjpwYXNzd29yZA==";
    proxy_set_header Authorization "Basic $http_authorization"; # For interactive mode
}

без него /cgi-bin/mjpg/video.cgi, так как он будет передаваться на стороне браузера или http-клиента

ИЛИЕсли у вас это не работает, это может быть связано с этим случаем. https://stackoverflow.com/questions/14839712/nginx-reverse-proxy-passthrough-basic-authenication

Если у камеры есть какие-либо проверки области, вы можете узнать ожидаемую область с помощью инструментов разработчика на вкладке «Заголовки» — раздел «Заголовки ответа».

Но вам нужно будет скомпилировать nginx с помощьюheaders-more-nginx-module

Вы можете сделать это с помощью этого скрипта

cd /usr/src
NGINXFILE=$(wget -qO- http://nginx.org/en/download.html | tr ' ' '\n' | egrep -o 'nginx.+?tar.gz' | head -1)
wget http://nginx.org/download/${NGINXFILE}
tar zxvf ${NGINXFILE}
cd ${NGINXFILE%.*.*}

cp -r /etc/nginx /root/nginx_$(date +%F) #Backup current nginx configs

cd /usr/src
git clone https://github.com/openresty/headers-more-nginx-module.git

./configure --add-module=/usr/src/headers-more-nginx-module --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --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-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
make
make install

как только это будет сделано, вы можете попробовать такую ​​конфигурацию:

location / {
  proxy_http_version      1.1;
  proxy_pass_request_headers on;
  proxy_set_header        Host            $host;
  proxy_set_header        X-Real-IP       $remote_addr;
  proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

  more_set_input_headers  'Authorization: Basic dXNlcjpwYXNzd29yZA=='; 
  #more_set_input_headers  'Authorization: $http_authorization'; # For interactive mode
  proxy_set_header  Accept-Encoding  "";

  proxy_pass              http://IP_CAMERA;
  proxy_redirect          default;
  more_set_headers        -s 401 'www-authenticate: Basic realm="Authentication Required"';
}

где www-authenticate: Basic realm="Authentication Required"ваши фактические данные этого заголовка

Я проверил оба случая, у меня работает, я тестировал на кастомном приложении Flask. К сожалению, у меня нет такой камеры для личного отладки

решение2

Редактировать с помощью специального решения Amcrest

В какой-то момент (примерно в 2017 году?) Amcrestвыпустили обновление прошивки, котороеудалена базовая аутентификацияс IP-камер, оставляя единственным вариантом дайджест-аутентификацию.

Этот ответ Stack Overflowможет быть лучшим вариантом для удаления дайджест-аутентификации, как вы хотите, используя FastCGI и nginx.

Либо это так, либо, возможно, вы найдете способ понизить версию прошивки вашей камеры, чтобы снова поддерживать базовую аутентификацию.


Предыдущий ответ

Вы кодируете имя пользователя и пароль в Base64, разделяя их двоеточием?

ДляБазовая HTTP-аутентификация, вам необходимо сделать следующее:

proxy_set_header Authorization "Basic xxx";

Замените xxxна Base64(<username>:<password>). То есть найдите себе кодировщик Base-64, введите имя пользователя, символ двоеточия ( :) и пароль, а затем замените xxxна полученную строку.

Например, если имя пользователя — admin, а пароль — hunter2, мы можем выполнить в командной строке Bash следующее:

printf %s 'admin:hunter2' | base64

и поместите полученную строку в заголовок следующим образом:

proxy_set_header Authorization "Basic YWRtaW46aHVudGVyMg==";

решение3

Выстрел в темноте

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

Связанный контент