ssh -R тогда выставить локальный порт через HTTP?

1631
weisjohn

Вот мой сценарий, у меня есть две машины, A и B. A находится за VPN, поэтому B не может добраться до A. У меня есть веб-сервер:

machine_a$ curl localhost:8088 "hello from machine_a"

Я выполнил удаленный туннель SSH следующим образом:

machine_a$ ssh -R 8088:machine_a:8088 machine_b -N &

На машине B я могу убедиться, что туннель действительно открыт:

machine_b$ curl localhost:8088 "hello from machine_a"

Как мне заставить machine_b прослушивать HTTP-трафик на 8089 и маршрутизировать / pipe / что-либо на этот локально доступный порт 8088, который, в свою очередь, является удаленным портом для HTTP-сервера на machine_a?

(Кроме того, я установил фиктивный сервер на machine_b: 8089 и убедился, что он открыт.

1
Не уверен, о чем ты говоришь. Вы пишете: «Как мне заставить machine_b обслуживать HTTP-трафик на 8089 и направлять / публиковать / что-либо еще на этот локально доступный порт 8088? Nc, socat?» порт 8088 недоступен, он используется SSH. И если вы отправляете HTTP-трафик на этот порт так, как хотите, то если этот сервер на компьютере A: 8088 не является HTTP-сервером и, похоже, это не так, то я думаю, что вы просто получите ошибки. И если вы хотите сделать HTTP через SSH, то -L или -R не сделают этого, если вы не хотите использовать только один веб-сайт. Вы хотите -D. barlop 11 лет назад 0
Извините, чтобы уточнить, HTTP-сервер живет на machine_a. Я просто хочу настроить порт (8089) на machine_b, который проксирует к локально связанному порту 8088, который является ssh -R для machine_b 8088. Таким образом, открывается сервер HTTP, который находится за брандмауэром. weisjohn 11 лет назад 0
ОК, так что это не для общего просмотра только для доступа к одному серверу HTTP. Тогда да -L или -R было бы для этого .. хорошо barlop 11 лет назад 0

2 ответа на вопрос

3
weisjohn

With socat, this serves my purposes:

machine_b$ socat TCP-LISTEN:8089,su=nobody,fork,reuseaddr TCP-CONNECT:127.0.0.1:8088

This tells socat to listen on TCP port 8889 and connect it to local 8088. It runs as the nobody user, for better security. The fork option means that it will renegotiate the incoming port, so that it doesn't block.

cURLing from my machine:

my_machine$ curl machine_b:8089 "hello from machine_a"

2
user189937
nc -l 8089 | nc localhost 8088 
Было бы неплохо немного больше объяснить, что именно происходит. KronoS 11 лет назад 0
@KronoS Он спросил: «Как мне заставить machine_b обслуживать HTTP-трафик на 8089 и маршрутизировать / передавать / что угодно в этот локально доступный порт 8088? Nc, socat?» Я бы сказал, что эта строка довольно проста. Очевидно, что прослушивает порт 8089 и передает его на локальный порт 8088. Это то, о чем просил парень. Я бы добавил, что некоторые версии nc могут быть nc -l -p, другие могут быть просто -l. немного в вопросе о ssh, так что мне пришлось бы много думать, но, просто глядя на эту маленькую строчку с вопросом, как это сделать ... этот ответ ответил на него, и объяснение в вопросе, который я цитировал в этом комментарии barlop 11 лет назад 0
Конечно, этот сервер на порту 8089 не будет «обслуживать http-трафик» (о чем спрашивал спрашивающий), это не http-сервер, но я думаю, что спрашивающий мог просто сказать, что ему отправляется http-трафик. (Я не вижу, как еще вопрос может иметь какой-либо смысл). Похоже, @user ... наверное, правильно понял. barlop 11 лет назад 0
@ barlop Я просто не фанат однострочных ответов. Если бы было возможно больше деталей, было бы неплохо. Также стараемся побудить нового пользователя быть максимально подробным, даже если одна строка решает проблему. Это все. KronoS 11 лет назад 0
В дополнение к моим комментариям я не уверен, что вопрос имеет смысл или дает достаточно информации, но эта строка пользователя может быть тем, что он искал. barlop 11 лет назад 0
@KronoS разъяснил мой комментарий выше? weisjohn 11 лет назад 0
этот ответ работает немного, это действительно близко. После настройки netcat для канала с 8089 на localhost 8088, при переходе к machine_b: 8089, HTTP-запрос успешно передается по туннелю ssh -R, и я вижу ответ, возвращаемый из machine_a, но ответ только заканчивается на консоль (stdout | stderr?). Я хочу, чтобы он был перенаправлен в браузер. weisjohn 11 лет назад 0
@weisjohn вы указали вашему браузеру HTTP на локальный хост-порт 8089 на machine_b (хост, на котором вы написали, запускал строку "nc -l 8089 | nc localhost 8088")? barlop 11 лет назад 0
@ barlop, да. Я сделал. Запрос перенаправляется через туннель ssh на machine_a. Ответ вернулся через туннель ssh и был просто направлен на терминал. Что на самом деле имеет смысл, потому что вы говорите что-то вроде: netcat, слушаете на 8089 и передаете (netcat, получаете от stdin и отправляете на localhost 8088), но второй netcat нигде не направляет свой вывод. weisjohn 11 лет назад 1

Похожие вопросы