Мне нужен SSH-туннель из моего дома на частный IP 10.4.100.6 , как показано на схеме:
+-------+ +-----------------+ +------------+ +-------------+
| | | | | | | |
| Home +----+ foo.example.com +--+ 10.4.100.5 +--+ 10.4.100.6 |
| | | | | | | |
+-------+ +-----------------+ +------------+ +-------------+
У меня есть root-доступ на 10.4.100.5 и ] 10.4.100.6 . У меня нет доступа к foo.example.com . Когда я отправляю ssh на foo.example.com , я каким-то образом попадаю на 10.4.100.5 , который является другим хостом. Мы говорим о 4 отдельных хостах. Я предполагаю, что foo.example.com использует NAT один-к-одному.
Я пробовал:
ssh -L 8080:10.4.100.6:80 user@foo.example.com
Не повезло. Есть какие-нибудь советы?
Edit: Оказывается, туннель работает, но не для веб-сокетов. Соединения с ws: // localhost: 8080
не работают с этим:
<snip> WebSocket connection to 'ws://localhost:8080/' failed: Error during WebSocket handshake: Unexpected response code: 200
Сначала я этого не осознавал. Я думал, что соединение просто зависло.
Edit 2: Приношу свои извинения, но я понял это. Я не понимал, что приложение включает в себя 2 сервера: nginx на порту 80 и сервер websocket на порту 8080. Я создал 2 отдельных туннеля SSH, и теперь все работает. Я запутался, потому что выбранный мной локальный порт, 8080, также использовался удаленным сервером websocket.
Резюме: ничего особенного не требуется для создания SSH-туннеля через NAT «один-к-одному».
При условии, что 10.4.100.5
может получить доступ к 10.4.100.6:80
Я не понимаю, почему ваш ssh -L 8080: 10.4.100.6: 80 (скрыто) не будет работать.
Можете ли вы использовать telnet / curl 10.4.100.6:80
из 10.4.100.5
? Если нет, возможно, брандмауэр настроен на 10.4.100.6
, запрещающий доступ к порту 80, разрывая соединение, но не отклоняя его.
Есть ли возможность использовать sshuttle ? - https://github.com/sshuttle/sshuttle
Это может быть более простой вариант прокси, особенно с учетом отсутствия доступа к удаленной цели SSH.
Вы можете использовать функцию ProxyJump в OpenSSH, чтобы сделать это чисто.
ssh -J user@foo.example.com -L 8080:localhost:80 user@10.4.100.6
Добавление -J (скрыто) указывает ssh подключиться к пункт назначения через переадресацию портов, настроенную динамически на foo.example.com. Если у вас не настроены ключи ssh, вам будет предложено ввести пароли для foo.example.com и 10.4.100.6.
Если это сработает для вас, вы можете добавить его в свой локальный ~ /.ssh/ssh_config
, чтобы упростить задачу. Например,
Host 10.4.100.6
ProxyJump user@foo.example.com
Тогда вам не нужно будет указывать -J
в командной строке для подключения к 10.4.100.6.