Вопрос или проблема
Мой локальный компьютер не имеет публичного 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 подхода для решения этой проблемы:
-
настроить правило iptables для tcp-перенаправления (я не профессионал в этом, но думаю это возможно)
-
настроить обратный прокси, перенаправляющий запросы на порт перенаправления 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:
- Установите nginx на вашем удаленном публичном сервере.
- Настройте конфигурационный файл 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-туннелями является эффективным и широко используемым решением для организаций, работающих с закрытыми сетями. Это дает вам гибкость и безопасность, необходимые для надежной работы с удаленными и локальными серверами.