ssh до private-ip


18

У мене є комп'ютер з CentOS (комп’ютер A), який налаштований як приватний ip 10.150.5.141 (з обмеженим брандмауером), можу отримати доступ до Інтернету та мого VPS ArchLinux (комп'ютер B) з реальним ip wxyz

Як я можу зробити інший ПК (комп'ютер C), який міг би отримати доступ до комп'ютера B для підключення до комп'ютера A, але комп'ютер C не може підключитися безпосередньо до комп'ютера A (оскільки він знаходиться у власній приватній мережі A)?

Я знаю, що тунель може відкривати локальні порти на інший комп'ютер: порт, але як зробити навпаки?

Я хочу отримати доступ до комп'ютера A за sshдопомогою комп’ютера B, але комп'ютер B не може отримати доступ до комп'ютера A, оскільки мережа на комп'ютері A обмежує (може виходити, але не можу зайти, тому що я не маю доступу до їх маршрутизатора)

Я хочу щось подібне:

ssh -connect-to w.x.y.z:22 -open-port vvv -forward-to 10.150.5.141 -port 22

так що коли я ssh w.x.y.z:vvvз комп’ютера C він перейде в приватну мережу 10.150.5.141:22.

Відповіді:


14

Те, що ви шукаєте, називається зворотним тунелем. sshзабезпечує через -Rкомутатор:

-R [bind_address:]port:host:hostport
       Specifies that the given port on the remote (server) host is to 
       be forwarded to the given host and port on the local side.  This 
       works by allocating a socket to listen to port on the remote side, 
       and whenever a connection is made to this port, the connection is
       forwarded over the secure channel, and a connection is made to host 
       port hostport from the local machine.

Як виявив ОП з їхньою відповіддю, синтаксис такий:

$ ssh -f -N -R vvv:localhost:22 w.x.y.z

Приклад

У мене є 2 комп’ютери в мережі, lappyі remotey. Тому я запускаю таку команду на lappy:

$ ssh -f -N -R 12345:localhost:22 remotey

Я можу підтвердити, що це працює:

$ ps -eaf|grep "[l]ocalhost:22"
saml     27685     1  0 11:10 ?        00:00:00 ssh -f -N -R 12345:localhost:22 remotey

Тепер, якщо я sshокремо перейшов до віддаленої системи remoteyі запустив цю команду, я можу побачити, що він тепер приймає з'єднання на порту 12345 в локальному інтерфейсі віддаленої системи:

$ netstat -an|grep :12345
tcp        0      0 127.0.0.1:12345             0.0.0.0:*                   LISTEN      
tcp        0      0 ::1:12345                   :::*                        LISTEN      

Тестування з'єднання

Видно, що зворотний ssh-тунель працює наступним чином.

  1. увійти в remotey

    [user@lappy ~]$ ssh remotey
    
  2. випробувати зворотний порт тунелю

    [user@remotey ~]$ ssh -p 12345 localhost
    
  3. тепер слід повернутися до лаппі

    user@localhost's password: 
    Last login: Thu Aug  1 17:53:54 2013
    /usr/bin/xauth:  creating new authority file /home/user/.Xauthority
    [user@lappy ~]$ 
    

Порти на інших інтерфейсах, крім localhost ( lo)?

Можливо, вам залишиться чухати голову, якщо ви спробуєте таку команду, яка, здається, не працює, або вона завжди прив'язується до порту loінтерфейсу localhost ( ).

Наприклад:

lappy$ ssh -f -N -R remotey:12345:lappy:22 remotey

ПРИМІТКА. Ця команда говорить про відкриття порту 12345 @ remotey та тунель будь-яких з'єднань з портом 22 @ lappy.

Потім на дистанційному:

remotey$ netstat -an|grep 12345
tcp        0      0 127.0.0.1:12345              0.0.0.0:*                   LISTEN   

Те, що відбувається, - це те sshd, що конфігурації не дозволяють вам цього робити. Насправді без цієї функції ( GatewayPorts) ви не зможете прив’язати жодні sshпорти тунелю до будь-якого, крім localhost.

Увімкнення шлюзів

remotey$ grep GatewayPorts /etc/ssh/sshd_config
#GatewayPorts no

Щоб увімкнути це, відредагуйте цей файл /etc/ssh/sshd_config:

GatewayPorts clientspecified

І перезапустіть sshd:

remotey$ sudo service sshd restart

Тепер спробуйте ще раз, і ми повинні побачити ефект, який ми шукаємо:

lappy$ ssh -f -N -R remotey:12345:lappy:22 remotey

І ще раз перевірте це на дистанційному:

remotey$ netstat -anp | grep 12345
tcp        0      0 192.168.1.3:12345           0.0.0.0:*                   LISTEN      9333/sshd

ПРИМІТКА: У вищесказаному ми бачимо, що sshdпроцес тепер прослуховується в інтерфейсі, який має IP-адресу 192.168.1.3, для з'єднань порту 12345.

Тестування з'єднання (частина декс)

Тепер з нашими зміненими налаштуваннями, коли ми цього разу тестуємо. Основна відмінність полягає в тому, що нам більше не доводиться підключатися до localhost!

  1. увійти в remotey

    [user@lappy ~]$ ssh remotey
    
  2. перевірити зворотне з'єднання

    [user@remotey ~]$ ssh -p 12345 remotey
    
  3. тепер слід повернутися до лаппі

    root@remotey's password: 
    Last login: Wed Aug 21 01:49:10 2013 from remotey
    [user@lappy ~]$ 
    

Список літератури


чи є спосіб зробити тунель від 0,0.0.0:12346 до 127.0.0.1.12345 на тій же машині?
Kokizzu

1
@Kokizzu - я спробував це налаштувати, і я обернувся навколо вісі, про що ви просите. Я виявив, що це схоже на те, що ви хочете, anattatechnologies.com/q/2012/08/chaining-ssh-tunnels . Я спробую опрацювати це пізніше сьогодні ввечері, сміливо пограйте з ним і повідомте мені, якщо ви досягнете певного прогресу в цьому.
slm

це не те, що я мав на увазі, я хочу, щоб він прив’язувався до wxyz: vvv2 замість 127.0.0.1 (на комп’ютері B), щоб інші люди також могли ним користуватися ..
Kokizzu

1
@Kokizzu - див. Оновлення.
slm

2

Оскільки комп'ютер B не може отримати доступ до комп'ютера A, вам потрібно буде спочатку відкрити віддалений тунель від комп'ютера A.

ssh user@computerB -R vvv:localhost:22

спасибі, але чи є спосіб відкрити порт на IP-адресу eth0, який переадресується на службу, яка слухає localhost?
Kokizzu

1

я не знайшов відповіді:

ssh -f -N -R vvv:localhost:22 w.x.y.z

з комп’ютера A

EDIT: TL; DR, правильне рішення:

ssh -f -N -R w.x.y.z:vvv:localhost:22 w.x.y.z
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.