Proxy inverso para cámara IP

Proxy inverso para cámara IP

Estoy usando una cámara Amcrest que requiere autenticación básica para representar su transmisión (documentación- página 17). Se accede a la cámara a través de http://admin:password@IP_CAMERA/cgi-bin/mjpg/video.cgi.

Cuando intento presionar :56700, se me solicita autenticación aunque esté codificada (a continuación). Incluso cuando ingreso las credenciales correctas, falla. ¿Qué estoy haciendo mal?

    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";
        }
    }

También intenté agregar proxy_pass_header Authorization;como se describeaquí.

Respuesta1

Como se dijo anteriormente, se puede resolver mediante

proxy_set_header Authorization "Basic dXNlcjpwYXNzd29yZA==";

donde dXNlcjpwYXNzd29yZA==está el resultado del comando:echo -n "user:password" | base64

Supongo que ya lo intentaste

De todos modos, creo que la ubicación correcta se verá así.

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
}

sin /cgi-bin/mjpg/video.cgiporque pasará en el lado del navegador o del cliente http

OSi no te funciona puede estar relacionado con este caso https://stackoverflow.com/questions/14839712/nginx-reverse-proxy-passthrough-basic-authenication

Si la cámara tiene algunas comprobaciones de dominio, puede conocer el dominio esperado a través de las herramientas de desarrollo en la pestaña Encabezados - sección Encabezados de respuesta.

Pero necesitarás compilar nginx conheaders-more-nginx-module

Puedes hacerlo con este script.

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

Una vez hecho esto, puedes probar dicha configuración:

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"';
}

donde están www-authenticate: Basic realm="Authentication Required"tus datos reales de este encabezado

Revisé ambos casos, funciona para mí, lo probé en una aplicación de matraz personalizada. Desafortunadamente no tengo esa cámara para depuración personal.

Respuesta2

Edite con una solución específica de Amcrest

En algún momento (¿alrededor de 2017?) Amcrestlanzó una actualización de firmware queSe eliminó la autenticación básica.desde sus cámaras IP, dejando la autenticación implícita como la única opción.

Esta respuesta de Stack Overflowpuede ser su mejor opción para eliminar la autenticación implícita como desea usar FastCGI y nginx.

O eso, o quizás puedas encontrar una manera de degradar el firmware de tu cámara para que admita la autenticación básica nuevamente.


Respuesta anterior

¿Está codificando en Base64 el nombre de usuario y la contraseña con dos puntos en el medio?

ParaAutenticación básica HTTP, deberá hacer lo siguiente:

proxy_set_header Authorization "Basic xxx";

Reemplace el xxxcon Base64(<username>:<password>). Es decir, busque un codificador Base-64, ingrese el nombre de usuario, dos puntos literales ( :) y la contraseña, y reemplace xxxcon la cadena resultante.

Por ejemplo, si el nombre de usuario es adminy la contraseña es hunter2, podríamos ejecutar lo siguiente en un indicador de Bash:

printf %s 'admin:hunter2' | base64

y ponga la cadena resultante en el encabezado así:

proxy_set_header Authorization "Basic YWRtaW46aHVudGVyMg==";

Respuesta3

Un tiro en la oscuridad

Sé que a veces, si los permisos del archivo no están configurados correctamente, puede aparecer un cuadro de inicio de sesión que en algunos casos es para el nivel de permiso del archivo y no para el nivel de conexión, si eso tiene sentido. ¿Quizás eso es lo que está sucediendo, algún tipo de problema de permiso de archivo en el extremo del servidor web? Puede terminar con dos credenciales diferentes, una basada en conexión/servicio y luego la de nivel de archivo si la conexión/servicio no tiene permiso de archivo.

información relacionada