Blog/content/posts/2024/ssh/tunnel.md
2024-08-30 23:58:49 +03:00

120 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: "🚰 SSH туннели и проброс портов"
date: 2024-08-30T23:30:24+03:00
draft: false
tags: [linux, tutorial, ssh, proxy]
---
> Оригинал: https://codex.so/ssh-tunnel
При администрировании серверов часто возникают следующие задачи:
1. Получить доступ к локальному порту на сервере с рабочей машины.
2. Обеспечить доступ к локальному порту рабочей машины с сервера.
Обе эти задачи решаются с помощью туннелирования,
но иногда требуется организовать такой туннель быстро и без создания сложной дополнительной инфраструктуры.
Решить такую задачу можно с помощью SSH.
## Доступ к внутреннему порту сервера
Попробуем подключиться к порту, к которому нет доступа снаружи, но есть доступ с сервера
(например, MongoDB, которая слушает порт `27017` на интерфейсе `localhost` сервера).
Для этого используется параметр `-L`.
```sh
ssh -L 9999:localhost:27017 root@server_ip
```
![](https://cdn.a2s.su/blog/2024/ssh/tunnel/1.jpg)
После аутентификации, у нас на рабочей машине появляется порт `9999`,
который перенаправлен на порт `27017` локального интерфейса сервера.
Теперь можно подключиться к **MongoDB** напрямую, как будто она запущена у вас на компьютере.
```sh
mongo localhost:9999 -u user -p password
```
Туннель прервётся, если вы закроете SSH соединение.
Кстати, если оно вам не требуется, а нужен только туннель можно добавить параметр `-N`.
```sh
ssh -L 9999:localhost:27017 root@server_ip -N
```
Можно также открывать доступ не к локальному порту сервера,
а к удаленному порту другой машины, которая доступна с сервера.
```sh
ssh -L 9999:another_ip:80 root@server_ip -N
```
В данном примере, вы можете делать запросы на порт `9999`, связанный с `80` портом машины `another_ip`.
## Доступ с сервера на локальный порт
Теперь представим ситуацию, что нужно с сервера обратиться к какому-нибудь сервису,
запущенному на локальном компьютере. Например, вам регулярно присылают **HTTP** запросы по `80` порту на сервер.
Вы можете прокинуть локальный веб-сервер со своей рабочей машины
(скажем с `3000` порта) на сервер так, что запросы будут идти напрямую к вам. За это отвечает параметр `-R`.
```sh
ssh -R 80:localhost:3000 root@server_ip
```
![](https://cdn.a2s.su/blog/2024/ssh/tunnel/2.jpg)
После этой команды на сервере откроется `80` порт, запросы на который будут прокидываться вам на `3000`.
По умолчанию `80` порт откроется на всех интерфейсах.
Если вы желаете выбрать конкретный (скажем 192.168.0.1), его можно указать следующим образом.
```sh
ssh -R 192.168.0.1:80:localhost:3000 root@server_ip
```
## Цепочка туннелей через несколько узлов
Если нужно пробросить на свою машину локальный порт с **сервера №2**,
доступ к которому по SSH есть только с **сервера №1**, можно построить цепочку из SSH туннелей.
```sh
ssh -L 9999:localhost:27017 root@server2 # server1
ssh -L 9999:localhost:9999 root@server1 # client
```
![](https://cdn.a2s.su/blog/2024/ssh/tunnel/3.jpg)
Можно воспользоваться однострочной командой.
```sh
ssh -L 9999:localhost:9999 root@server1 ssh -L 9999:localhost:27017 -N root@server2
```
А в случае, если у вас есть SSH ключи для доступа к **серверу №2**,
вы можете построить защищенный туннель так, что ваш трафик не будет виден на **сервере №1**.
```sh
ssh -L 9998:server2:22 -N root@server1
ssh -L 9999:localhost:27017 -N -p 9998 root@localhost
```
![](https://cdn.a2s.su/blog/2024/ssh/tunnel/4.jpg)
В данном примере вы пробрасываете себе на порт `9998` порт с **сервера №2**,
обращаясь к нему через **сервер №1**.
А затем пробрасываете порт `27017` с **сервера №2** на локальный `9999`.
В данной конфигурации вам уже не нужен **сервер №1**, так как порт SSH уже у вас на локальном `9998`.
## SOCKS прокси
С помощью параметра `-D` можно создать на локальной машине сокет для прослушивания динамического порта.
```sh
ssh -D localhost:8123 root@server_ip
```
Теперь достаточно добавить хост `localhost` и порт `8123` в браузер для использования в качестве прокси.