Вопрос: Как перенаправить порт на другое соединение с сервером через SSH


Я думаю, что то, что я пытаюсь сделать, называется SSH Tunneling. Я немного смущен, если это на самом деле то, что я хочу сделать.

Я хочу настроить туннель на порт 1234 на Сервер A, Сервер A пересылает все соединения через порт 1234 в Сервер B на порту 5678, Можно ли это сделать с SSH?

В основном я хочу получить доступ к вторичному серверу в локальной сети через основной сервер, который находится в общедоступной сети с моего локального компьютера, без необходимости входа на основной сервер.

Я также хочу, чтобы туннель позволял пользователю без полномочий root подключаться к частному серверу. Он должен быть аутентифицирован как обычно при входе в SSH. Необходимо убедиться, что это работает и для WinSCP, так что клиент может получить доступ к своей учетной записи в приватном поле через общедоступный IP-адрес должным образом.


2
2018-06-05 07:28


Источник




Ответы:


То, что предлагает @RolandW, является правильным и будет работать тогда и только тогда, когда сервер B в частной сети напрямую доступен с сервера A, то есть если и только сервер B не за брандмауэром и маршрутизатором NAT.

Если одно из этих двух допущений ложно, вам придется использовать другое решение. В этом случае, поскольку B является не напрямую доступный из A, вам нужно будет установить обратный туннель от B до A, а затем вы сможете получить доступ к B из своего дома.

На сервере B,

  1. Добавьте эту строку в /etc/rc.local

    su -c /home/your_name/bin/auto your_name
    
  2. Создайте исполняемый файл с именем auto в /home/your_name/bin, называется auto, с этим контентом:

    #!/bin/sh
    /usr/lib/autossh/autossh -M 6321 -f -p 22 -2 -N -D  -R 8100:localhost:22 your_name_o_server_A@IP_address_of_server_A -i /path/to/cryptokey/of_server_A
    

    Команда autossh это очень удобная утилита, которая автоматически перезапускает туннель ssh каждый раз, когда он опускается (отключение питания, перезагрузка, что угодно); для этого он использует порт (в моем случае 6321) для проверки состояния конвекции. Вы можете очень хорошо использовать другой TCP-порт, чем 6321 (но больше 1024!), Просто убедитесь, что он открыт на сервере A.

    Вышеприведенная команда предполагает, что вы активировали аутентификацию через криптографические ключи, которые вы определенно должны делать.

  3. На сервере A вам нужно будет ввести следующую строку

    GatewayPorts yes
    

    в файле /etc/ssh/sshd_config, Эта требования sudo привилегии.

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

    ssh -YC -t -t -p 22 -i /path/to/cryptkey/of_server_A \
      your_name_o_server_A@IP_address_of_server_A        \
      "ssh -Y your_name_on_server_B@localhost -p 8100 -i /path/to/cryptkey/of-server_B" 
    

Конечно, будет удобно создавать псевдонимы, чтобы ускорить вызов выше.


4
2018-06-05 14:14





Я предполагаю, что вы хотите получить SSH-доступ к серверу B, который находится в частной сети, подключенной к (общедоступному) серверу A. Сервер B запускает демон ssh, прослушивающий порт 5678.

Для этого вы можете создать перенаправление портов на общедоступном сервере, который пересылает пакеты TCP, поступающие на порт 1234, на сервер-b: 5678. В соответствии с https://serverfault.com/questions/140622/how-can-i-port-forward-with-iptables это можно сделать на ящике Linux, использующем iptables (netfilter), используя следующие команды

iptables -t nat -A PREROUTING -p tcp -i <WAN interface> --dport 1234 -j DNAT --to-destination <server-b-IP>:5678
iptables -A FORWARD -p tcp -d <server-b-IP> --dport 5678 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

Первое правило перезаписывает адрес назначения, второе позволяет доставить измененный пакет в пункт назначения. Это предполагает, что шлюз по умолчанию сервера B является сервером A.


2
2018-06-05 11:58