Рейтинг:2

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

флаг it

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

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

    сервер {
        слушать 56700;
        место расположения / {
            proxy_set_header Хост $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 Авторизация "Базовый ххх";
        }
    }

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

CrazyTux avatar
флаг in
Я думаю, что вы смешали синтаксис `rtsp` с синтаксисом `http`, попробуйте `http:///cgi-bin/realmonitor.cgi?action=getStream&channel=&подтип=` для `http`, а затем выполните аутентификацию с именем пользователя и паролем ИЛИ используйте `rtsp` с `VLC` с этим синтаксисом `rtsp://:@:/cam/realmonitor?channel=&подтип=`
флаг it
@CrazyTux Я могу без проблем перейти по указанному выше URL-адресу в своем браузере.
Рейтинг:2
флаг us

Как сказано выше, это может быть решено с помощью

proxy_set_header Авторизация "Базовая dXNlcjpwYXNzd29yZA==";

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

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

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

место расположения / {
    proxy_set_header Хост $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 Авторизация "Базовая dXNlcjpwYXNzd29yZA==";
    proxy_set_header Авторизация "Базовая $http_authorization"; # Для интерактивного режима
}

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

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

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

Но вам нужно будет скомпилировать nginx с заголовки-больше-nginx-модуль

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

компакт-диск /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}
смола zxvf ${NGINXFILE}
cd ${NGINXFILE%.*.*}

cp -r /etc/nginx /root/nginx_$(date +%F) #Резервное копирование текущих конфигураций nginx

компакт-диск /USR/SRC
клон git 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_s tub_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,теперь -pie'
делать
сделать установку

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

место расположения / {
  прокси_http_версия 1.1;
  proxy_pass_request_headers включен;
  proxy_set_header Хост $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  more_set_input_headers 'Авторизация: Basic dXNlcjpwYXNzd29yZA=='; 
  #more_set_input_headers 'Авторизация: $http_authorization'; # Для интерактивного режима
  proxy_set_header Accept-Encoding "";

  proxy_pass http://IP_CAMERA;
  proxy_redirect по умолчанию;
  more_set_headers -s 401 'www-authenticate: Basic realm = "Требуется аутентификация"';
}

куда www-authenticate: Basic realm="Требуется аутентификация" ваши фактические данные этого заголовка

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

Рейтинг:1
флаг cl

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

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

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

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


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

Кодируете ли вы Base64 имя пользователя и пароль с двоеточием между ними?

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

proxy_set_header Авторизация "Базовый ххх";

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

Например, если имя пользователя администратор, а пароль охотник2, мы могли бы запустить следующее в командной строке Bash:

printf %s 'admin:hunter2' | base64

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

proxy_set_header Авторизация "Базовая YWRtaW46aHVudGVyMg==";

флаг it
Имя пользователя и пароль кодируются в Base64 с помощью `:`, да.
Рейтинг:0
флаг ne

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

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

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.