<===
2025-11-16 10:04:42
`ssh -D` — это опция SSH-клиента, которая создаёт **динамический (dynamic) SOCKS-прокси** через SSH-туннель. По сути, она превращает ваш локальный порт в SOCKS-прокси-сервер, через который можно маршрутизировать трафик к удалённым хостам, используя SSH-сервер как посредника.
---
### Синтаксис
```bash
ssh -D [локальный_порт] user@ssh_server
```
Пример:
```bash
ssh -D 1080 user@example.com
```
После подключения:
- Локальный порт `1080` становится **SOCKS5-прокси** (по умолчанию).
- Любое приложение, настроенное на использование SOCKS-прокси `localhost:1080`, будет отправлять запросы через SSH-туннель.
---
## Механика работы (пошагово)
1. **Установка SSH-соединения**
- Клиент подключается к `ssh_server` по SSH (обычно порт 22).
- Аутентификация (пароль, ключ и т.д.).
2. **Создание локального порта**
- Опция `-D 1080` говорит SSH-клиенту:
> "Слушай на `localhost:1080` и обрабатывай входящие SOCKS-запросы."
3. **Приложение → SOCKS-клиент → SSH-клиент**
- Приложение (браузер, curl и т.д.) настроено на SOCKS-прокси `127.0.0.1:1080`.
- Оно отправляет запрос:
`CONNECT google.com:80` (или `example.org:443`).
4. **SSH-клиент обрабатывает запрос**
- SSH-клиент **не знает**, как подключиться к `google.com` напрямую.
- Он **пересылает этот запрос по зашифрованному SSH-каналу** на **SSH-сервер**.
5. **SSH-сервер устанавливает соединение**
- SSH-сервер (на `example.com`) **получает команду** от клиента:
> "Подключись к `google.com:80` от моего имени."
- Сервер **устанавливает TCP-соединение** с `google.com` **своим IP-адресом**.
6. **Двунаправленный туннель**
- Установлено:
`Приложение ↔ localhost:1080 (SOCKS) ↔ SSH-клиент ↔ SSH-туннель ↔ SSH-сервер ↔ google.com`
- Все данные шифруются на участке `SSH-клиент ↔ SSH-сервер`.
7. **Динамичность**
- В отличие от `-L` (локальный форвардинг, фиксированный хост:порт),
`-D` позволяет **подключаться к любым хостам**, указанным в SOCKS-запросе.
- SSH-сервер сам разрешает DNS и устанавливает соединения.
---
## Схема
```
[Ваш браузер]
↓ (SOCKS5)
[localhost:1080] ← SSH-клиент
↓ (SSH-туннель, зашифровано)
[SSH-сервер @ example.com]
↓ (прямое TCP-соединение)
[google.com, youtube.com, любой хост]
```
---
## Особенности
| Особенность | Описание |
|------------|---------|
| **SOCKS5** | Поддерживает TCP и UDP (если сервер разрешает), аутентификацию. |
| **SOCKS4** | Можно включить через `-D 4:1080`, но редко нужно. |
| **DNS** | По умолчанию разрешается **на SSH-сервере** (безопасно). Можно форсировать локально: `ssh -D 1080 -o ProxyCommand...` + настройки. |
| **Только TCP** | UDP работает только для DNS (в SOCKS5), если сервер поддерживает. |
| **Множество соединений** | Один `-D` порт может обслуживать тысячи одновременных подключений. |
---
## Примеры использования
### 1. Обход блокировок (через домашний сервер)
```bash
ssh -D 1080 user@home-server.ru
```
→ Настраиваете браузер на SOCKS `127.0.0.1:1080` → весь трафик идёт через домашний IP.
### 2. Тестирование с curl
```bash
curl --socks5 localhost:1080 http://ifconfig.me
```
→ Покажет **IP вашего SSH-сервера**.
### 3. Только один сайт (гибрид с -L)
```bash
ssh -D 1080 -L 8080:internal-app:80 user@vps
```
→ `1080` — динамический прокси, `8080` — прямой форвардинг.
---
## Безопасность
- Трафик шифруется **только между вами и SSH-сервером**.
- От SSH-сервера до целевого сайта — **в открытом виде** (если не HTTPS).
- SSH-сервер **видит все ваши запросы** (хосты, порты).
- Используйте только **доверенные серверы**.
---
## Полезные опции с `-D`
```bash
ssh -D 1080 -f -N user@server # фоновый режим, без команды
ssh -D 1080 -C user@server # сжатие данных
ssh -D 1080 -o "ProxyJump bastion" user@internal # через джамп-хост
```
---
## Итог
> `ssh -D [порт]` = **SOCKS5-прокси на локальном порту**,
> который **перенаправляет любые TCP-соединения через SSH-сервер**,
> **динамически разрешая хосты на стороне сервера**.
Это мощный инструмент для:
- Обхода блокировок
- Доступа к внутренним ресурсам
- Анонимизации (частичной)
- Тестирования сетей
---