diff --git a/content/posts/2024/ssh/tunnel.md b/content/posts/2024/ssh/tunnel.md new file mode 100644 index 0000000..0440e31 --- /dev/null +++ b/content/posts/2024/ssh/tunnel.md @@ -0,0 +1,119 @@ +--- +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` в браузер для использования в качестве прокси.