Назад | Перейти на главную страницу

Прямой доступ к серверу Python с переадресацией портов SSH не выполняется, но выполняется успешно с промежуточным nginx

Я использую переадресацию портов SSH - как ни удивительно проиллюстрировано и разработано здесь - для доступа к моему серверу.

Я потратил больше времени, чем хотел бы признать, на устранение неполадок, связанных с доступом к моему веб-серверу Python 404. Полный текст вопроса для заполнения здесь.

Моя проблема в том, что если я использую переадресацию портов для прямой пересылки моих запросов на порт, где работает сервер Python (например, 8282), все запросы 404.

Сервер Python для простоты (обслуживает index.html, содержащий строку hello):

python -m http.server 8282

Перенаправление порта SSH с хоста, к которому я хочу получить доступ:

ssh -L 8181:<farawayhost-ip>:8282 <sshuser>@<remotehost-ip>

Для последующих запросов на хост с curl, Я определил переменную среды http_proxy:

export http_proxy=127.0.0.1:8181

По-видимому, запросы неверны, так как им предшествует IP-адрес. Для сравнения, вот журнал Python http.server, сначала доступ к нему локально с сервера, затем с внешнего хоста с использованием переадресации портов SSH.

Serving HTTP on 0.0.0.0 port 8282 ...
<server-public-ip> - - [<timestamp>] "GET /index.html HTTP/1.1" 200 -
<proxy-ip> - - [<timestamp>] code 404, message File not found
<proxy-ip> - - [<timestamp>] "GET http://<server-public-ip>:8282/index.html HTTP/1.1" 404 - 

Мне удалось получить доступ к веб-службе Python с внешнего хоста, разместив прокси Nginx между веб-сервером Python и внешним хостом.

Nginx устанавливается на том же сервере, что и веб-сервис Python, и просто слушает порт 80 и прокси для localhost:8282.

Конфигурация Nginx:

server {
    listen      80 default_server;

    location / {
                proxy_pass http://127.0.0.1:8282;
    }

На внешнем хосте переадресация порта SSH настроена на порт 80 вместо 8282.

ssh -L 8181:<farawayhost-ip>:80 <sshuser>@<remotehost-ip>
export http_proxy=127.0.0.1:8181 # proxy for curl

Доступ к веб-службе теперь успешен.

Журнал Nginx:

<remotehost-ip> - - [<timestamp>] "GET http://<server-ip>/ HTTP/1.1" 200 6 "-" "<user-agent>"

Журнал http.server Python:

127.0.0.1 - - [<timestamp>] "GET / HTTP/1.0" 200 -

На мой вопрос:

Моя первоначальная проблема решена, но я хочу понять, почему.

Чем отличаются эти запросы, почему прямой доступ к серверу Python с переадресацией портов SSH не работает, а доступ через прокси-сервер Nginx завершается успешно?

Ваша проблема в том, что SSH-туннель не является HTTP-прокси (в то время как nginx это) так установка http_proxy указать на причины конечной точки туннеля SSH curl для отправки HTTP-запросов в формате, подходящем для HTTP-прокси, в то время как туннель SSH отправляет эти запросы непосредственно в ваше приложение python без какой-либо специальной обработки, как это делал бы HTTP-прокси. С туннелем SSH вам нужно удалить http_proxy переменной и получить доступ к своему приложению напрямую с помощью curl http://localhost:8181/.