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

обратный туннель ssh от сервера к ноутбуку

Вопрос Я хотел бы знать, как туннелировать запросы, сделанные на сервере (debian), на порт 80 на моем ноутбуке, используя ssh-туннелирование.

Проблема Я могу открыть туннель с помощью следующей команды, которая ведет себя не так, как хотелось бы:

ssh -R 4445:localhost:80 sam@example.com

После запуска и получения оболочки на example.com следующая команда выполняется, как ожидалось, и возвращает веб-страницу, размещенную на моем ноутбуке:

wget localhost:4445

Однако при попытке запустить эту же команду с использованием example.com:4445, а не localhost: 4445, я получаю отказ в соединении.

Дополнительная информация: Я также пробовал написать правило переадресации с помощью shorewall:

DNAT            net             $FW:127.0.0.1:4445        tcp     4446

а потом попробовал

wget example.com:4446

Когда wget не работает в любом из вышеперечисленных случаев, я получаю следующее:

--2011-02-16 13:48:26--  http://example.com:4446/
Resolving example.com... 70.90.XXX.XX
Connecting to example.com|70.90.XXX.XX|:4446... failed: Connection refused.

Есть идеи, куда идти дальше? Кроме того, если есть другой / лучший способ добиться этого эффекта, я полностью открыт для этой идеи.

РЕДАКТИРОВАТЬ Спасибо за предложения! Пробовал следующее:

ssh -R example.com:4445:localhost:80 sam@example.com

и

ssh -R :4445:localhost:80 sam@example.com

Затем при запуске того же wget, что и выше, возвращалась та же ошибка. Я должен, возможно, упомянуть, что у этого сервера есть два интерфейса (eth0 public eth1 private).

РЕДАКТИРОВАТЬ

Я дебил :( Пришлось поставить

GatewayPorts yes

в sshd_config. Спасибо всем за помощь!

Прежде всего следует помнить, что у туннелей есть определенная конечная точка. Эта конечная точка не иметь быть клиентом или сервером, но данные шифруются только тогда, когда они находятся между клиентом и сервером.

Если вы хотите, чтобы соединение на сервере туннелировалось к example.com, вы можете запустить

 ssh -R 4445:example.com:80 sam@example.com

когда кто-нибудь на сервере подключается к localhost: 4445 пакет будет зашифрован туннелем к вашему клиенту. От вашего клиента пакет в незашифрованном виде отправится на example.com:80. SSH не выполняет никакого анализа вашего протокола подключения, пакеты просто идут в один конец и выходят из другого.

Один туннель может идти только к одной конечной точке. Если вы хотите пойти куда-нибудь еще (например, example.org), вам нужно закрыть ssh-соединение и создать новое с помощью -R 4445:example.org:80. Если вы хотите подключиться как к example.com, так и к example.org, вам потребуется настроить два разных туннеля с разными локальными портами: -R 4445:example.com:80 -R 4446:example.com:80.

По умолчанию (очень хорошо) туннели могут "поступать" только из одного места (локальный хост сервера для туннелей -R, локальный хост клиента для туннелей -L). Для туннелей -R, если вы включите GatewayPorts в файле sshd_config сервера, вы можете указать ему, чтобы он прослушивал IP-адрес сервера для всех, кто может подключиться к серверу:

ssh -R server:4445:example.com:80 ...

Затем, кто угодно Кто может связаться с сервером: у 4445 пакет будет передаваться на сервер в незашифрованном виде, сервер будет передавать его зашифрованным по туннелю клиенту, затем клиент отправит его в незашифрованном виде на example.com:80.

ssh настроен по соображениям безопасности, чтобы новые туннели слушали на localhost. Вы должны использовать:

ssh -R :4445:localhost:80 sam@example.com

На странице руководства openssh:

 -R [bind_address:]port:host:hostport

Указывает, что данный порт на удаленном (серверном) хосте должен быть перенаправлен на данный хост и порт на локальной стороне. Это работает путем выделения сокета для прослушивания порта на удаленной стороне, и всякий раз, когда к этому порту устанавливается соединение, соединение пересылается по защищенному каналу, и устанавливается соединение с портом хоста с локальной машины.

Переадресацию портов также можно указать в файле конфигурации. Привилегированные порты могут быть перенаправлены только при входе в систему с правами root на удаленной машине. Адреса IPv6 можно указать, заключив адрес в квадратные скобки или используя альтернативный синтаксис: [bind_address /] host / port / hostport.

По умолчанию прослушивающий сокет на сервере будет привязан только к интерфейсу обратной связи. Это можно изменить, указав bind_address. Пустой bind_address или адрес «*» указывает, что удаленный сокет должен прослушивать все интерфейсы. Указание удаленного bind_address будет успешным только в том случае, если включена опция сервера GatewayPorts (см. Sshd_config (5)).

Проблема в том, что вы пытаетесь открыть порт на example.com:4445, который на самом деле не открыт.

Если вы хотите задействовать туннелируемый порт 4445 на локальном хосте при ссылке на example.com в команде wget или в браузере, вам нужно будет добавить запись в файл / etc / hosts

127.0.0.1 example.com

который затем позволит вам подключиться к туннельному порту на локальном хосте при выполнении

wget example.com:4445

Еще одна полезная вещь для установки туннеля: если вы собираетесь использовать его на регулярной основе, это настройка .ssh/config file и создайте такой блок.

Host example
Hostname example.com
User    someuser
LocalForward 4445 localhost:80

Это туннелирует порт 80 с example.com на localhost: 4445, просто вызывая ssh example