privoxy + ssh перенаправление удаленного HTTP-запроса на локальный веб-сервер

Вопрос или проблема

Мой локальный компьютер не имеет публичного IP, и IT-отдел не может настроить NAT для меня. Я хочу настроить прокси на своем удаленном публичном сервере, который будет пересылать запросы на мой локальный сервер.

Я пробую использовать privoxy + ssh, но получаю сообщение о недопустимом заголовке.

Шаг 1:
открыть ssh-туннель командой

ssh -nNT -R 8081:localhost:8080 [email protected]

Шаг 2:
На удаленной машине настройте конфигурацию privoxy, я попробовал

forward-socks5 / 127.0.0.1:8081 .
listen-address 0.0.0.0:8080

и

forward / 127.0.0.1:8081
listen-address 0.0.0.0:8080

оба выдали ошибку недопустимого заголовка в браузере

Вы не открываете никакой туннель, используя:

ssh -R -nNT 8081:localhost:8080 [email protected]

но это должно завершиться ошибкой.

Правильный вариант:

ssh -nNT -R 8081:localhost:8080 [email protected]

и это называется удаленным перенаправлением портов.

После некоторых исследований я нашел причину:

Privoxy не подходит для такой задачи обратного проксирования,
а ssh перенаправление может принимать только локальный трафик.

Таким образом, есть 2 подхода для решения этой проблемы:

  1. настроить правило iptables для tcp-перенаправления (я не профессионал в этом, но думаю это возможно)

  2. настроить обратный прокси, перенаправляющий запросы на порт перенаправления ssh, это можно сделать через nginx, или написать простую программу самому, например, используя go:

например:

package main
import (
    "net/http/httputil"
    "net/http"
    "net/url"
    "log"
)

func main() {
    target, _ := url.Parse("http://localhost:8081")
    proxy := httputil.NewSingleHostReverseProxy(target);
    http.Handle("https://unix.stackexchange.com/", proxy)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

Ответ или решение

Для организации доступа к локальному серверу через удаленный публичный сервер, а также решения проблемы с заголовками HTTP при использовании Privoxy и SSH, давайте подробно рассмотрим возможные подходы.

Контекст задачи

Ваша локальная машина находится за NAT без публичного IP-адреса. Для обеспечения доступа к локальному серверу через публичный сервер вы используете ssh tunnel и пытаетесь настроить прокси через Privoxy, однако столкнулись с ошибкой «недопустимые заголовки» в браузере. Давайте рассмотрим правильное решение этой задачи.

SSH Forwarding

Шаг 1: Настройка SSH туннеля

Вы использовали команду для обратного проксирования портов:

ssh -nNT -R 8081:localhost:8080 [email protected]

Данная команда создает туннель, позволяя перенаправлять запросы с удаленного сервера на локальный сервер через порт 8081. Убедитесь, что SSH-сервер настроен корректно и позволяет использовать remote forwarding.

Privoxy Настройка (не подходит)

Вы пробовали две конфигурации Privoxy, но столкнулись с ошибкой заголовков. Это связано с тем, что Privoxy, как правило, не используется для обратного проксирования HTTP-запросов. Он предназначен больше для фильтрации веб-контента и работы с SOCKS-прокси.

Решение проблемы

Есть два подхода для решения задачи:

1. Настройка iptables для TCP-перенаправления

Если вы уверены в своих знаниях Linux iptables и умеете работать с правилами маршрутизации, можно попробовать использовать этот подход для перенаправления трафика. Однако этот метод требует глубокого понимания сетевых правил и конфигураций, и возможны ошибки, если что-то сделать неправильно.

2. Настройка обратного прокси с использованием Nginx

Наиболее простым и проверенным решением будет использование веб-сервера Nginx в качестве обратного прокси:

Шаги для настройки Nginx:

  1. Установите nginx на вашем удаленном публичном сервере.
  2. Настройте конфигурационный файл nginx, добавив следующий блок:
server {
    listen 80;
    server_name your-public-server.com;

    location / {
        proxy_pass http://localhost:8081;
        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;
    }
}

Это позволит nginx перенаправлять все запросы с вашего публичного IP на локальный сервер через созданный SSH туннель.

Заключение

Использование Nginx в связке с SSH-туннелями является эффективным и широко используемым решением для организаций, работающих с закрытыми сетями. Это дает вам гибкость и безопасность, необходимые для надежной работы с удаленными и локальными серверами.

Оцените материал
Добавить комментарий

Капча загружается...