Обратный туннель SSH

8

Я пытаюсь перенаправить веб-трафик с удаленного сервера на мой локальный компьютер, чтобы проверить некоторую интеграцию API (tropo, paypal и т. Д.). По сути, я пытаюсь настроить что-то похожее на то, что предоставляет tunnlr.com.

Я инициировал SSH туннель с помощью команды

$ssh –nNT –R :7777:localhost:5000 user@server

Тогда я вижу, что сервер сейчас прослушивает порт 7777 с

user@server:$netstat -ant | grep 7777

tcp        0      0 127.0.0.1:7777          0.0.0.0:*               LISTEN     
tcp6       0      0 ::1:7777                :::*                    LISTEN  


$user@server:curl localhost:7777
Hello from local machine

Так что работает отлично. Запрос curl фактически подается с локальной машины.

Теперь, как я могу включить server.com:8888 для маршрутизации через этот туннель?

Я пытался использовать nginx так:

upstream tunnel {
    server 0.0.0.0:7777;
}
server {
  listen 8888;
  server_name server.com;
  location / {
    access_log /var/log/nginx/tunnel-access.log;
    error_log /var/log/nginx/tunnel-error.log;
    proxy_pass http://tunnel;
    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_redirect off;
  }
}

Из журнала ошибок nginx я вижу:

[error] 11389#0: *1 connect() failed (111: Connection refused)

Я пытался использовать iptables, но не добился никакого прогресса. iptablesкажется более элегантным решением, чем запуск nginx только для туннелирования. Любая помощь очень ценится. Спасибо!

РЕДАКТИРОВАТЬ (добавить информацию о сервере)

Детали сервера: Ubuntu 10.10 Maverick (стандартная установка)

РЕДАКТИРОВАТЬ (опция nginx)

Настройки nginx изменились с 0.0.0.0:7777 на 127.0.0.1:7777, как предложила @Marcel G. Тем не менее, все еще ищем не-nginx решение.

РЕДАКТИРОВАТЬ (обновление окончательного решения)

Как указал @sciurus, убедитесь, что GatewayPorts yesв вашем файле sshd_config. У меня изначально была эта строка в файле конфигурации, но мне нужно было выдать /etc/init.d/ssh reloadвместо restart(по крайней мере, так кажется в Ubuntu).

Последняя команда, используемая на локальной машине: ssh -nNT -R '*:8888:localhost:5000' user@server

Затем сервер должен указать, что он прослушивает *: 8888 с lsof -i tcp:888

user@server:~$ sudo lsof -i tcp:8888
COMMAND   PID     USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
sshd    14711 user    8u  IPv4 1791013      0t0  TCP *:8888 (LISTEN)
sshd    14711 user    9u  IPv6 1791014      0t0  TCP *:8888 (LISTEN)
Крис
источник

Ответы:

9

Нет необходимости использовать nginx.

В вашей конфигурации ssh-демона (это должен быть / etc / ssh / sshd_config ) установите GatewayPorts на указанное клиентом и перезагрузите его. Это необходимо для того, чтобы другие системы могли подключаться к вашему туннелю. Без этого только программы, работающие на вашем сервере, смогут использовать его.

Теперь все, что вам нужно сделать, это изменить команду ssh для прослушивания порта 8888 вместо порта 7777. Это может выглядеть так

ssh -nNT -R '*:8888:localhost:5000' user@server

Звездочка указывает sshd прослушивать порт 8888 на всех интерфейсах, а не только петлевой интерфейс. Это не получится, если вы не изменили GatewayPorts .

Sciurus
источник
Хорошо, я переключился на ваше предложение, и когда curl http://server.com:8888я получаю ошибку curl: (7) couldn't connect to host. Я все еще могу свернуть localhost: 8888 из оболочки сервера, и он попадает на локальную машину.
Крис
Кстати, я остановил nginx, прежде чем попробовать новую команду, которую вы предоставили.
Крис
@ chris Включены ли GatewayPorts в sshd_config вашего сервера? Если нет, включите его. После запуска туннеля убедитесь, что ssh прослушивает больше, чем просто адрес обратной связи; Вы можете заменить netstat и grep на lsof -i tcp:8888.
Sciurus
Потрясающие! Так что у меня был GatewayPorts yessshd_config, и я думаю, что я только сделал /etc/init.d/ssh перезапуск, но на этот раз я сделал reload. Я не уверен, в чем разница, но теперь это полностью работает !! Спасибо миллион @sciurus.
Крис
1

Я второй ответ sciurus, но если по какой-то причине вам нужно использовать nginx ... я думаю, что ваше определение выше по течению не работает.

При создании вашего обратного туннеля ssh он слушает только на локальном хосте (127.0.0.1 и :: 1), поэтому вы можете попробовать попробовать следующее определение восходящего потока:

upstream tunnel {
    server 127.0.0.1:7777;
}

Для справки: я никогда не настраивал nginx, так что это всего лишь предположение.

Марсель Г
источник
Спасибо! Это фактически заставило это работать. Если возможно, я бы все же предпочел не использовать nginx только для того, чтобы заработал туннель, но приятно знать, что это возможно
Крис