2

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

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

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

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

2 ответа2

4

То, что предлагает @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" 
    

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

2

Я предполагаю, что вы хотите получить доступ 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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .