Перейти к основному содержимому

SSH-туннелирование

·419 слов·2 минут
Блог о Сетях, Инфраструктуре и DevOps
Автор
Блог о Сетях, Инфраструктуре и DevOps
DevOps, Infrastructure Engineer, Expert Cyber Security

Что такое SSH-туннель
#

SSH-туннелирование — это способ переадресации трафика через защищённое SSH-соединение.
Это особенно полезно, когда прямой доступ к ресурсу закрыт, но есть доступ по SSH к промежуточному серверу.

SSH-туннели позволяют:

  • зашифровать обычный трафик между клиентом и сервером;
  • подключаться к сервисам, недоступным напрямую;
  • безопасно пробросить порты через защищённое соединение.

SSH Jump Host
#

Один Jump-сервер
#

ssh -J root@IP_сервера:5222 -p 8222 user@IP_целевого_сервера

Конфигурация в ~/.ssh/config:

# Jump-сервер (бастион)
Host jump-server
    HostName IP_сервера
    Port 5222
    User root

# Целевой сервер
Host target-server
    HostName IP_целевого_сервера
    Port 8222
    User user
    ProxyJump jump-server

Использование:

ssh target-server

Несколько промежуточных Jump-серверов
#

ssh -J root@IP_сервера:4222,root@IP_сервера2:5222 -p 8222 user@IP_целевого_сервера

Конфигурация в ~/.ssh/config:

# Первый jump-сервер
Host jump1
    HostName IP_сервера
    Port 4222
    User root

# Второй jump-сервер
Host jump2
    HostName IP_сервера2
    Port 5222
    User root

# Целевой сервер
Host target-server
    HostName IP_целевого_сервера
    Port 8222
    User user
    ProxyJump jump1,jump2

Использование:

ssh target-server

SSH Port Forwarding
#

Local Port Forwarding
#

# Пробрасываем локальный порт 8001 на сервис, работающий на том же сервере,
# к которому подключаемся по SSH (доступ к localhost:8000 на удалённой машине)
ssh -L 127.0.0.1:8001:127.0.0.1:8000 -N -C -p 5222 root@IP_сервера

# Пробрасываем локальный порт 8001 на сервис во внутренней сети сервера
# (например, приложение на хосте 192.168.77.77:8000, недоступное напрямую)
ssh -L 127.0.0.1:8001:192.168.77.77:8000 -N -C -p 5222 root@IP_сервера

# Несколько туннелей в одном SSH-соединении:
# локальный порт 8001 → хост 192.168.77.77:8000
# локальный порт 8002 → хост 192.168.77.88:8000
ssh -L 127.0.0.1:8001:192.168.77.77:8000 -L 127.0.0.1:8002:192.168.77.88:8000 -N -C -p 5222 root@IP_сервера
  • -L 127.0.0.1:8001:HOST:PORT — создаёт локальный порт-форвардинг: все подключения к 127.0.0.1:8001 на вашей машине будут по SSH перенаправляться на HOST:PORT, доступный с удалённого сервера.
  • -N - указывает SSH не открывать интерактивную оболочку, так как соединение используется только для туннелирования.
  • -C - включает сжатие трафика (полезно для текстовых данных, но почти не даёт выигрыша для медиа-контента).
  • -p - задаёт порт SSH на удалённом сервере, если он отличается от стандартного 22.

Remote Port Forwarding
#

ssh -R 0.0.0.0:3001:127.0.0.1:3000 -N -C -p 5222 root@IP_сервера
  • -R 127.0.0.1:3001:HOST:PORT — настраивает обратный туннель: удалённый сервер начинает слушать порт 8001 и пересылает входящие соединения по SSH на HOST:PORT на вашей локальной машине.
  • Для того, чтобы внешние соединения на 0.0.0.0:3001 заработали необходимо в конфигурации сервера /etc/ssh/sshd_config добавить строчку GatewayPorts yes

Dynamic Port Forwarding (SOCKS5-Proxy over SSH)
#

ssh -D 127.0.0.1:8888 -N -C -p 5222 root@IP_сервера
  • -D 127.0.0.1:8888 - запускает локальный SOCKS5-прокси, который слушает порт 8888 на вашем компьютере.

Проверка через Curl
#

# DNS запросы идут НЕ через прокси
curl --socks5 127.0.0.1:8888 https://ifconfig.me

# DNS запросы идут через прокси
curl --socks5-hostname 127.0.0.1:8888 https://ifconfig.me

Проверка через Firefox
#

Related

Настройка доступа на Linux сервер по SSH ключам
·340 слов·2 минут
Использование TLS клиента OpenSSL для тестирования HTTPS
·1010 слов·5 минут
Настройка GRE over IPSec
·1039 слов·5 минут