Вопрос Я хотел бы знать, как туннелировать запросы, сделанные на сервере (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