Proxy reverso para câmera IP

Proxy reverso para câmera IP

Estou usando uma câmera Amcrest que requer autenticação básica para renderizar seu stream (documentação- página 17). A câmera é acessada através de http://admin:password@IP_CAMERA/cgi-bin/mjpg/video.cgi.

Quando tento acertar :56700, sou solicitado auth, mesmo que esteja codificado (abaixo). Mesmo quando insiro as credenciais corretas, ele falha. O que estou fazendo de errado?

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

Eu também tentei adicionar proxy_pass_header Authorization;conforme descritoaqui.

Responder1

Como dito acima, pode ser resolvido por

proxy_set_header Authorization "Basic dXNlcjpwYXNzd29yZA==";

onde dXNlcjpwYXNzd29yZA==está o resultado do comando:echo -n "user:password" | base64

acho que você já tentou isso

de qualquer forma, acredito que a localização correta será semelhante

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
}

sem /cgi-bin/mjpg/video.cgiporque vai passar no navegador ou no lado do cliente http

OUSe não funcionar para você, pode estar relacionado a este caso https://stackoverflow.com/questions/14839712/nginx-reverse-proxy-passthrough-basic-authenication

Se a câmera tiver algumas verificações de domínio, você poderá saber o reino esperado por meio de ferramentas de desenvolvimento na guia Cabeçalhos - seção Cabeçalhos de resposta.

Mas você precisará compilar o nginx comheaders-more-nginx-module

Você pode fazer isso com 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

uma vez feito isso, você pode tentar essa configuração:

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

onde estão www-authenticate: Basic realm="Authentication Required"seus dados reais deste cabeçalho

Verifiquei os dois casos, funciona para mim, testei em um aplicativo de frasco personalizado. Infelizmente não tenho essa câmera para depuração pessoal

Responder2

Edite com solução específica da Amcrest

Em algum momento (por volta de 2017?) Amcrestlançou uma atualização de firmware queautenticação básica removidade suas câmeras IP, deixando a Autenticação Digest como a única opção.

Esta resposta do Stack Overflowpode ser sua melhor opção para remover a autenticação Digest como você deseja usando FastCGI e nginx.

Ou isso, ou talvez você possa encontrar uma maneira de fazer o downgrade do firmware da sua câmera para oferecer suporte à autenticação básica novamente.


Resposta Anterior

Você está codificando o nome de usuário e a senha em Base64 com dois pontos no meio?

ParaAutenticação básica HTTP, você precisará fazer o seguinte:

proxy_set_header Authorization "Basic xxx";

Substitua o xxxpor Base64(<username>:<password>). Ou seja, encontre um codificador Base-64, insira o nome de usuário, um :caractere literal de dois pontos ( ) e a senha e substitua xxxpela string resultante.

Por exemplo, se o nome de usuário for admine a senha for hunter2, poderíamos executar o seguinte em um prompt do Bash:

printf %s 'admin:hunter2' | base64

e coloque a string resultante no cabeçalho assim:

proxy_set_header Authorization "Basic YWRtaW46aHVudGVyMg==";

Responder3

Tiro no escuro

Sei que às vezes, se as permissões do arquivo não estiverem definidas corretamente, você poderá obter uma caixa de login que, em alguns casos, é para o nível de permissão do arquivo e não para o nível de conexão, se isso fizer sentido. Talvez seja isso que está acontecendo, algum tipo de problema de permissão de arquivo no servidor web? Você pode obter duas credenciais diferentes, uma baseada em conexão/serviço e, em seguida, a de nível de arquivo se a conexão/serviço não tiver permissão de arquivo.

informação relacionada