SSH-туннель (переадресация портов) или SSH-проксиJump, какой из них следует использовать в данном конкретном случае, Me -> JumpSever -> TargetServer

SSH-туннель (переадресация портов) или SSH-проксиJump, какой из них следует использовать в данном конкретном случае, Me -> JumpSever -> TargetServer

Я новичок в SSH Tunnel, я прочиталВикибук OpenSSH Proxyснова и снова, все еще в замешательстве.

Цель — создание двойного прокси-сервера только с SSH-туннелями (переадресация портов) или ProxyJump (не совсем уверен, как их назвать)

Например, me 192.168.1.1-->подключиться к--> the Jump ServerA 1.1.1.1, тогда я фактически достигну the Target ServerB 2.2.2.2, если я настрою прокси-сервер socks5 с ServerA 1.1.1.1, я в конечном итоге буду проксированServerB's IP 2.2.2.2

Я знаю, как с этим справиться.me >-к-> Server A, Но я не знаю, как с этим бороться.Server A >-к-> Server B, (Я имею в виду, что у меня есть полный доступ и привилегии root на этих серверах, но я не знаю, как их настроить.)

Я очень медленно учусь, поэтому любые идеи будут оценены по достоинству.

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

решение1

Основные требования таковы:

  • ServerB должен быть доступен только с ServerA. Вы не подключаетесь к нему напрямую.
  • На сервере ServerA необходимо включить TCP-туннелирование.
  • Сервер ServerA должен быть доступен вам.

Вы настраиваете подключение к ServerB через jumphost (в .ssh/config):

Host ServerB
    ProxyJump ServerA

Это предполагает, что если вы введете ssh ServerA, вы окажетесь на ServerA, а если вы, находясь на ServerA, введете ssh ServerB, вы окажетесь на ServerB. Например, имя "ServerB" должно быть разрешимо на ServerA, но его не волнует, разрешимо ли оно на вашей стороне. Это могут быть имена хостов или "слаги" (псевдонимы). В последнем случае вы снова связываете их имена хостов или IP-адреса в .ssh/config:

Host ServerA
    HostName ip.add.re.ss

Host ServerB
    ProxyJump ServerA
    HostName host.na.me

Вы также можете указать, какое имя пользователя использовать для прокси-хоста:

Host ServerA
    User proxyuser
    HostName ip.add.re.ss

Host ServerB
    ProxyJump ServerA
    HostName host.na.me

После этого вы вводите ssh ServerB. OpenSSH подключается к ServerA и использует некий случайный порт для пересылки через это соединение на адрес ServerB, порт 22. Это соединение разветвляется в фоновом режиме; OpenSSH немедленно подключается к этому случайному перенаправленному порту (к localhost, но на самом деле он проверяет свой ключ по .ssh/known_hostsимени "ServerB" и IP-адресу, указанным в HostName, если таковой имеется), поэтому вы окажетесь непосредственно на ServerB. Если вы введете "who", он скажет, что вы подключены с адреса ServerA. Любой, кто находится между вами и ServerA, не имеет возможности узнать, что вы действительно общаетесь с ServerB.

Вы можете использовать любые параметры командной строки SSH, они будут использоваться дляСерверБсоединение (сделанное через перенаправленный порт). Например, если вы используете ssh -D 12345 user@ServerB, он подключится к ServerA как proxyuser с портом, перенаправленным на ServerB:22, затем подключится к этому порту и аутентифицируется на ServerB как пользователь, и он установит прокси SOCKS5 на порт 12345. Выходным адресом для этого SOCKS5 будет ServerB, например, если вы используете этот прокси (например, в браузере), удаленные стороны увидят, что вы подключаетесь с адреса ServerB.

Вы можете объединить больше джампхостов, это тоже сработает:

Host ServerB
    ProxyJump ServerA

Host ServerC
    ProxyJump ServerC

и ssh ServerCсначала подключится к ServerA с переадресацией порта на ServerB:22, затем через эту переадресацию подключится к ServerB с другой переадресацией порта на ServerC, а затем подключится к этому другому порту, и в итоге вы получите оболочку ServerC.

Обратите внимание, что вам будет предложено ввести пароль длякаждыйсоединение. Это довольно обременительно. Лучше настроить аутентификацию на основе ключей и использовать ssh-agent.

Связанный контент