Вопрос или проблема
Я пытаюсь получить доступ к своему коммутатору через обратный прокси Nginx. Я могу получить доступ к коммутатору через локальный IP по http, но когда я пытаюсь сделать это с помощью доменного имени через мой обратный прокси с использованием https, я могу получить страницу входа, но когда я ввожу свои учетные данные и нажимаю “войти”, страница выдает тайм-аут (ошибка 502). Проблема, похоже, связана с страницей logon.cgi.
Кто-нибудь знает, как правильно настроить обратный прокси для этого коммутатора? (У меня есть аналогичная конфигурация, работающая для моего роутера TP-Link и многих других сервисов)
Вот моя простая конфигурация обратного прокси:
server {
listen 80 default_server;
listen [::]:80 default_server;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name switch.example.com
ssl_certificate ...
ssl_certificate_key ...
access_log /var/log/nginx/switch.access.log;
error_log /var/log/nginx/switch.error.log;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
client_max_body_size 0;
proxy_connect_timeout 3600s;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
send_timeout 3600s;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://192.168.1.2;
proxy_redirect http://192.168.1.2 https://switch.example.com;
}
Я пытался отладить, используя инструменты разработки браузера, но я действительно не понимаю, что не так. Использование жесткого отображения DNS с switch.example.com на 192.168.1.2 работает, и вот что я вижу в инструментах разработки для скрипта входа:
Request URL: http://switch.example.com/logon.cgi
Request Method: POST
Status Code: 200 OK
Remote Address: 192.168.1.2:80
Referrer Policy: strict-origin-when-cross-origin
Connection: close
Content-Type: text/html
Transfer-Encoding: chunked
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Cache-Control: max-age=0
Connection: keep-alive
Content-Length: 53
Content-Type: application/x-www-form-urlencoded
Host: switch.example.com
Origin: http://switch.example.com
Referer: http://switch.example.com/
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.67 Safari/537.36 OPR/87.0.4390.45
Но когда я пытаюсь получить доступ к коммутатору через мой обратный прокси (устанавливая CNAME, который указывает на мой сервер nginx), вот что я вижу:
Request URL: https://switch.example.com/logon.cgi
Referrer Policy: strict-origin-when-cross-origin
:authority: switch.example.com
:method: POST
:path: /logon.cgi
:scheme: https
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
accept-encoding: gzip, deflate, br
accept-language: en-US,en;q=0.9
cache-control: max-age=0
content-length: 53
content-type: application/x-www-form-urlencoded
origin: https://switch.example.com
referer: https://switch.example.com/
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="101", "Opera";v="87"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
sec-fetch-dest: document
sec-fetch-mode: navigate
sec-fetch-site: same-origin
sec-fetch-user: ?1
upgrade-insecure-requests: 1
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.67 Safari/537.36 OPR/87.0.4390.45
Кроме того, я использовал WireShark для захвата запроса, когда я успешно вошел в систему, используя локальный IP адрес (http://192.168.1.2):
Скриншот Wireshark
(Извините за ссылку, недостаточно репутации)
Смотрев на журнал ошибок Nginx, я вижу, что это ошибка таймаута:
ошибка от обратного прокси Nginx – это ошибка таймаута:
2022/06/10 16:53:54 [error] 3630#3630: *29 upstream timed out (110: Unknown error) while reading response header from upstream, client:
192.168.1.123, server: switch.example.com, request: "POST /logon.cgi HTTP/2.0", upstream: "http://192.168.1.2:80/logon.cgi", host: "switch.example.com", referrer: "https://switch.example.com/"
Если ваш случай использования похож на мой, вот мое решение для того, чтобы поместить коммутатор TP-Link за прокси Nginx. Вы можете быстро попробовать это, используя файл docker-compose
в этом проекте.
Ниже приведен краткий обзор конфигурации;
gzip off;
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_set_header X-Forwarded-Proto $scheme;
proxy_set_header Cookie $http_cookie;
proxy_set_header Referer https://switch1.my.home/;
Таким образом, мне потребовалось немного времени, чтобы разобраться, но моя проблема заключалась в том, что коммутатор TP-Link использовал http/1.1, который может иметь чувствительные к регистру заголовки. Nginx, похоже, использовал http/2, который автоматически переводит имена заголовков в нижний регистр, поскольку это часть спецификации http/2. Основной заголовок, который вызвал у меня проблему, был Content-Type. Сервер TP-Link ожидал Content-Type
, а не content-type
.
Этот момент решал мои проблемы
proxy_set_header Content-Type $http_content_type;
Надеюсь, это поможет кому-то!
Ответ или решение
Для успешного доступа к коммутатору TP-LINK TL-SG1016PE через обратный прокси-сервер Nginx необходимо правильно настроить ваш сервер, учитывая особенности работы оборудования и протокола HTTP/2.
1. Проблема и ее решение
Очевидно, что у вас возникла проблема при попытке войти в систему через обратный прокси, что вызывает тайм-аут при отправке запроса POST
на logon.cgi
. Причиной этой проблемы может быть несоответствие заголовков, ожидаемых коммутатором, и тех, которые отправляет Nginx.
В вашем случае, поскольку TP-LINK коммутатор использует протокол HTTP/1.1, проблема может заключаться в том, что заголовки, отправляемые в запросах, становятся нечувствительными к регистру в HTTP/2. Это означает, что сервер TP-LINK ожидает определенные заголовки с правильным регистром, например, Content-Type
, а не content-type
.
2. Настройка конфигурации Nginx
Для решения данной проблемы необходимо внести в конфигурацию Nginx соответствующие изменения. Ниже приведены рекомендации по настройке:
server {
listen 80 default_server;
listen [::]:80 default_server;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name switch.example.com;
ssl_certificate /path/to/your/certificate.crt;
ssl_certificate_key /path/to/your/private.key;
access_log /var/log/nginx/switch.access.log;
error_log /var/log/nginx/switch.error.log;
location / {
proxy_pass http://192.168.1.2; # локальный IP для вашего коммутатора
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Важно для TP-Link
proxy_set_header Content-Type $http_content_type; # Исправляем заголовок
proxy_set_header Cookie $http_cookie; # Передаем cookie
proxy_set_header Referer https://switch.example.com/; # Указываем реферер
# Тайм-ауты
client_max_body_size 0;
proxy_connect_timeout 3600s;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
send_timeout 3600s;
proxy_buffering off; # Отключаем буферизацию
}
}
3. Важно учесть
- Таймауты: Убедитесь, что таймауты настроены корректно для вашего сценария. Высокие значения, такие как
3600s
, могут быть полезны для отладки, но рекомендуется выставить их в разумные пределы по завершении. - Заголовки: Все заголовки, которые ваш коммутатор ожидает получить, необходимо передавать без изменений (с учетом регистра). Это может быть критически важно для успешного аутентификации.
- Логи Nginx: Использование логов доступа и ошибок поможет вам легче диагностировать дальнейшие проблемы.
4. Итоги
С учетом вышеизложенного, внесение изменений в конфигурацию Nginx должно помочь решить проблему с доступом к TP-LINK TL-SG1016PE через обратный прокси-сервер. Также рекомендуется тщательно тестировать каждое обновление конфигурации, чтобы убедиться в стабильной работе и доступности всех функций устройства. Надеюсь, описанные рекомендации помогут вам успешно настроить соединение!