SSH в частный IP


18

У меня есть компьютер с CentOS (компьютер A), который настроен как частный ip 10.150.5.141 (с ограниченным брандмауэром), могу получить доступ к Интернету и моему ArchLinux VPS (компьютер 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.

Включение GatewayPorts

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.

Тестирование соединения (часть deux)

Теперь с нашей измененной настройкой, когда мы проверяем это время. Основное отличие состоит в том, что нам больше не нужно подключаться к 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 на той же машине?
Кокиццу

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?
Кокиццу

1

не важно, я нашел ответ:

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

с компьютера А

РЕДАКТИРОВАТЬ: 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.