Что такое 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 #