Можно ли пересылать ssh-запросы, поступающие через определенный порт, на другую машину? - PullRequest
5 голосов
/ 05 сентября 2008

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

Да, и все эти машины работают под управлением Ubuntu или OS X.

Ответы [ 6 ]

11 голосов
/ 05 сентября 2008

Другим способом было бы использование туннелирования ssh (что происходит на стороне клиента).

Вы бы сделали команду ssh так:

ssh -L 8022:myinsideserver:22 paul@myoutsideserver

Это соединяет вас с машиной, доступной извне (myoutsideserver), и создает туннель через это соединение ssh с портом 22 (стандартный порт ssh) на сервере, который доступен только изнутри.

Затем вы должны выполнить еще одну команду ssh, как эта (оставив первую подключенную):

ssh -p 8022 paul@localhost

Это соединение с портом 8022 на вашем локальном хосте будет туннелироваться через первое ssh-соединение, переправляющее вас через myinsideserver.

Возможно, вам нужно что-то сделать на myoutsideserver, чтобы разрешить переадресацию порта ssh. Я проверяю это дважды.

Редактировать

Хм. Страница ssh говорит следующее: ** Только суперпользователь может пересылать привилегированные порты. **

Это намекает на то, что первое ssh-соединение должно быть как root. Может быть, кто-то еще может уточнить это.

Похоже, что права суперпользователя не требуются, если переадресованный порт (в данном случае 8022) не является привилегированным портом (например, 22). Спасибо за разъяснения Майк Стоун .

4 голосов
/ 05 сентября 2008

(В этом примере я предполагаю, что порт 2222 перейдет на ваш внутренний хост. $ Externalip и $ internalip - это ip-адреса или имена хостов видимого и внутреннего компьютера соответственно.)

У вас есть несколько вариантов, в зависимости от того, как долго вы хотите, чтобы прокси был:

  • Какой-то TCP-прокси. В Linux основная идея состоит в том, что до входящего пакета обрабатывается, вы хотите изменить его назначение - т.е. NAT назначения предварительной маршрутизации:

    iptables -t nat -A PREROUTING -p tcp -i eth0 -d $externalip --dport 2222 --sport 1024:65535 -j DNAT --to $internalip:22

  • Использование SSH для установления временной переадресации портов. Отсюда у вас снова есть два варианта:

    • Прозрачный прокси, где клиент думает, что ваш видимый хост (на порту 2222) является просто обычным сервером SSH и не понимает, что он проходит через него. В то время как вы теряете некоторый детальный контроль, вы получаете удобство (особенно если вы хотите использовать SSH для пересылки VNC или X11 вплоть до внутреннего хоста).

      • с внутренней машины: ssh -g -R 2222:localhost:22 $externalip
      • Тогда из внешнего мира: ssh -p 2222 $externalip

      Обратите внимание, что «внутренние» и «внешние» машины не обязательно должны находиться в одной локальной сети. Таким образом, вы можете перемещаться вперед по всему миру.

    • Сначала принудительный вход на внешнюю машину. Это действительно «пересылка», а не «проксирование»; но основная идея заключается в следующем: вы заставляете людей входить на внешнюю машину (чтобы вы могли контролировать, кто может войти и когда, и вы получаете журналы активности), и оттуда они могут пройти через SSH внутрь. Это звучит как рутина, но если вы настроили простые сценарии оболочки на внешнем компьютере с именами ваших внутренних хостов, в сочетании с паролями SSH без пароля , то для пользователя очень просто войти в систему Итак:

      • На внешней машине вы создаете простой скрипт /usr/local/bin/internalhost, который просто запускает ssh $internalip
      • Из внешнего мира пользователи делают: ssh $externalip internalhost и, как только они входят в систему на первом компьютере, они сразу же перенаправляются на внутренний.

      Еще одним преимуществом этого подхода является то, что люди не испытывают проблем с управлением ключами, поскольку запуск двух служб SSH на одном IP-адресе разозлит клиента SSH.

К вашему сведению, если вы хотите подключиться к серверу по SSH и не хотите беспокоиться о ключах, сделайте это

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no

В моей оболочке есть псевдоним "nossh", поэтому я могу просто сделать nossh somehost, и он будет игнорировать все ключевые ошибки. Просто поймите, что при этом вы игнорируете информацию о безопасности, поэтому существует теоретический риск.

Большая часть этой информации взята из разговора, который я дал в Barcamp Bangkok о причудливых трюках с SSH. Вы можете видеть мои слайды , но я рекомендую текстовую версию , так как слайды S5 являются глючными. Проверьте информацию в разделе «Forward Anything: Simple Port Forwarding». Также есть информация о создании SOCKS5 прокси с OpenSSH. Да, вы можете сделать это. OpenSSH такой замечательный.

(Наконец, если вы много работаете с внутренней сетью, подумайте о настройке VPN. Звучит страшно, но OpenVPN довольно прост и работает во всех ОС. Я бы сказал, что это излишне только для SSH; но как только вы начнете переадресацию портов через переадресацию портов для получения VNC, HTTP или других вещей, или если у вас есть множество внутренних хостов, о которых стоит беспокоиться, это может быть проще и проще в обслуживании.)

3 голосов
/ 05 сентября 2008

@ Mark Biek

Я собирался сказать это, но ты меня побил! В любом случае, я просто хотел добавить, что есть также опция -R:

ssh -R 8022:myinsideserver:22 paul@myoutsideserver

Разница в том, к какой машине вы подключаетесь. Мой босс показал мне этот трюк не так давно, и, безусловно, очень приятно знать ... мы были за брандмауэром и должны были предоставить внешний доступ к машине ... он обошел его с помощью ssh -R на другой машине это было доступно ... затем соединения с этой машиной были переадресованы на машину за брандмауэром, поэтому вам нужно использовать -R или -L в зависимости от того, на какой машине вы находитесь и с которой вы работаете.

Кроме того, я почти уверен, что вы можете использовать обычного пользователя, если порт, который вы пересылаете (в данном случае порт 8022), не находится ниже ограниченного диапазона (который, я думаю, равен 1024, но я мог бы ошибаюсь), потому что это «зарезервированные» порты. Неважно, что вы перенаправляете его на «ограниченный» порт, потому что этот порт не открывается (на машине просто посылается трафик через туннель, он не знает туннеля), порт 8022 IS быть открытым и поэтому ограничено как таковое.

РЕДАКТИРОВАТЬ: Просто помните, туннель открыт только до тех пор, пока первоначальный SSH остается открытым, поэтому, если он истекает или вы выходите из него, туннель будет закрыт.

0 голосов
/ 16 сентября 2008

Не возиться с правилами брандмауэра, вы можете настроить файл ~ / .ssh / config.

Предположим, что 10.1.1.1 является системой "шлюза", а 10.1.1.2 - системой "клиента".

Host gateway
  Hostname 10.1.1.1 
  LocalForward 8022 10.1.1.2:22 

Host client
  Hostname localhost
  Port 8022

Вы можете открыть ssh-соединение с «шлюзом» через:

ssh gateway

В другом терминале откройте соединение с клиентом.

ssh client
0 голосов
/ 05 сентября 2008

В Ubuntu вы можете установить Firestarter и затем использовать функцию Forward Service для пересылки трафика SSH с нестандартного порта на вашей машине с внешним доступом к порту 22 на машина внутри вашей сети.

В OS X вы можете отредактировать файл / etc / nat / natd.plist , чтобы включить переадресацию портов.

0 голосов
/ 05 сентября 2008

Вы можете использовать Port Fowarding для этого. Посмотрите здесь:

http://portforward.com/help/portforwarding.htm

Инструкции по настройке маршрутизатора для запроса перенаправления порта на этой странице:

http://www.portforward.com/english/routers/port_forwarding/routerindex.htm

...