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

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

·419 слов·2 минут
DevOps • Networks • Security • Infrastructure
Автор
DevOps • Networks • Security • Infrastructure
DevOps/Network/Infra Engineer, CyberSecurity Expert

Что такое 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 ключам
·387 слов·2 минут
Использование TLS клиента OpenSSL для тестирования HTTPS
·1010 слов·5 минут
Копирование файлов через SCP по SSH
·44 слов·1 минута