---
# System prepended metadata

title: '**OpenSSH на Windows**'
tags: [OpenSSH, Windows, OpenVPN]

---

# **OpenSSH на Windows**
###### tags: `OpenSSH` `Windows` `OpenVPN`
***

## ==Настраиваем OpenSSH сервер==

1. **Установить OpenSSH через команду PowerShell**
    ```bash
    Add-WindowsCapability -Online -Name OpenSSH.Server*
    ```
    или через систему развёртывания образова (DISM)
    ```bash
    dism /Online /Add-Capability /CapabilityName:OpenSSH.Server~~~~0.0.1.0
    ```
2. **Чтобы проверить что OpenSSH сервер установлен**
    ```bash
    Get-WindowsCapability -Online | ? Name -like 'OpenSSH.Ser*
    ```
  
3. **Ставим SSH службу на автозапуск**
      ```bash=
      Set-Service -Name sshd -StartupType 'Automatic'
      Start-Service sshd
      ```
  
4. **Проверяем что сервер запущен и слушает 22 порт**
      ```bash
      netstat -na| Select-String ":22"
      ```
  
5. **Брандмауэр**
      Проверяем активность разрешающего правила межсетевого экрана
      ```bash
      Get-NetFirewallRule -Name *OpenSSH-Server* |select Name, DisplayName, Description, Enabled
      ```
     Если правила нет - создаём новое
      ```bash
      New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
      ```
***
## ==Настраиваем OpenSSH клиент==
1.   **Проверяем что OpenSSH установлен**
      ```bash
      Get-WindowsCapability -Online | ? Name -like 'OpenSSH.Client*'
      ```

2.   **Если клиент OpenSSH отсутствует его необходимо установить**
      Командой PowerShell
      ```bash
      Add-WindowsCapability -Online -Name OpenSSH.Client*
      ```
      или через DISM
      ```bash
      dism /Online /Add-Capability /CapabilityName:OpenSSH.Client~~~~0.0.1.0
      ```

3. **Подключаемя к серверу SSH**
    Примеры команды для подключения по SSH
    ```bash
    ssh username@host -p port
    ssh root@192.168.1.202
    ssh root@192.168.1.92 -i "C:\Users\username\.ssh\id_rsa"
    ```
***

## ==Если вы планируете использовать для аутентификации сертификаты==
**Явное указания пути к закрытому ключу**
```bash
ssh root@192.168.1.92 -i "C:\Users\username\.ssh\id_rsa"
```
**Добавление закрытого ключа в SSH-Agent.**
Нужно включить службу ssh-agent и настроить ее автозапуск:

```bash
set-service ssh-agent StartupType ‘Automatic’
Start-Service ssh-agent
```
**Добавляем закрытый ключ в базу SSH-agent**

```bash
ssh-add "C:\Users\username\.ssh\id_rsa"
```

:::info
:information_source: Теперь вы можете подключиться к серверу по SSH без указания пути к RSA ключу, он будет     использоваться автоматически. Пароль для подключения не запрашивается (если только вы не     защитили ваш RSA ключ отдельным паролем)
:::

:::info
:information_source: Бинарные файлы OpenSSH находятся в каталоге `c:\windows\system32\OpenSSH\`

ssh.exe – это исполняемый файл клиента SSH;
scp.exe – утилита для копирования файлов в SSH сессии;
ssh-keygen.exe – утилита для генерации ключей аутентификации;
ssh-agent.exe – используется для управления ключами;
ssh-add.exe – добавление ключа в базу ssh-агента.
:::

>   Еще несколько полезных аргументов SSH:
>     -C – сжимать трафик между клиентом и сервером (полезно на медленных и нестабильных подключениях);
>     -v – вывод подробной информации обо всех действия клиента ssh;
>     -R/-L – можно использовать для проброса портов через SSH туннель.
***


## ==Тонкие настройки SSH сервера==

:::info
:information_source: **Настройки SSH хранятся в конфигурационном файле
%programdata%\ssh\sshd_config**
:::

:eye: Чтобы изменить Shell по умолчанию в OpenSSH с **cmd.exe на PowerShell**, внесите изменение в реестр такой командой:
```
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force
```



:eye: Чтобы **запретить SSH подключение для определенного доменного пользователя** (и всех пользователей указанного домена), добавьте в конце файле директивы:
`DenyUsers winitpro\admin@192.168.1.10
DenyUsers corp\*`

:eye: **Чтобы разрешить подключение только для определенной доменной группы:**
`AllowGroups winitpro\sshadmins`

:eye: Либо можете разрешить доступ **для локальной группы**:
`AllowGroups sshadmins`

:eye: Можно **запретить вход под учетными записями с правами администратора**, в этом случае для выполнения привилегированных действий в SSH сессии нужно делать runas.
`DenyGroups Administrators`

:eye: Следующие директивы разрешают **SSH доступ по ключам** и по паролю:
`PubkeyAuthentication yes
PasswordAuthentication yes`

:eye: Вы можете **изменить порт**, на котором принимает подключения OpenSSH в конфигурационном файле sshd_config в директиве Port.
**sshd - смена порта ssh 22**

:::info
:information_source: **После любых изменений в конфигурационном файле sshd_config нужно перезапускать службы sshd:**
`restart-service sshd`
:::
***

## ==Проброс портов через SSH туннель==
====RDP доступ через SSH туннель (local TCP forwarding)====
Выполните подключение к серверу по SSH и введите команду в PowerShell по такому принципу
```Bash
ssh -L 8888:локальный-IP:3389 root@удалённый-IP
```
Чтобы SSH туннель работал в **фоновом режиме**, нужно добавить **параметр –f.** Теперь, чтобы подключится к удаленному компьютеру через SSH туннель, вам нужно подключится RDP-клиентом mstsc.exe на локальный порт 8888 своего компьютера:
`127.0.0.1:8888`

:::danger
:no_entry: **Компьютеры в вашей локальной сети тоже смогут подключиться к удаленному RDP серверу, даже если у них полностью заблокирован прямой доступ к удаленному серверу (как по SSH, так и по RDP).**
Для этого, они должны подключиться RDP клиентом к порту 8888 на вашем компьютере,
на котором создан SSH туннель: `mstsc.exe /v ваш-ip-адрес:8888`
:::

:::success
:warning: Т.е. используя проброс портов вы должны понимать что доступ по RDP к пк с которого проводится проброс должен быть ограничен!
:::
***

## ==Проброс удаленного порта на локальную машину (Remote TCP forwarding)==
:::info
:information_source: Прежде всего используется для публикации внутренних ресурсов на сторону удалённого пользователя через не безопасную сеть
:::
Для создания обратного туннеля, используйте такую команду:
```bash
ssh -R 8080:internalwebsever:80 user@192.168.1.90
```

Теперь, чтобы на удаленном SSH сервер получить доступ к веб серверу internalwebsever достаточно в браузере набрать адрес http://localhost:8080.

:::info
:information_source: Во всех версиях Windows можно создать правила перенаправления портов с помощью команды `netsh interface portproxy`.
:::

**Включить или отключить SSH туннелирование можно в конфигурационном файле sshd_config директивами:**
```bash
AllowStreamLocalForwarding yes
AllowTcpForwarding remote
```
**Для запрета тунелирования трафика нужно еще в sshd_config добавить директиву:**
```bash
PermitTunnel no
```

***
:::success
:alien: Системный администратор
### Паламарчук Антон

:e-mail: Email: mrpalamarchuk93@gmail.com
:airplane: Telegram Channel [@ipraptor_blog](https://t.me/ipraptor_blog)
:incoming_envelope: Telegram [@IPraptor](https://t.me/IPraptor)**
:::


***

<style>
a.back{
border-radius: 4px;
color: black;
display:block;
width:100px;
text-align: center;
font-weight:bold;
font-family: Arial, Helvetica, sans-serif;
font-size: 14px;
padding: 8px 16px;
margin: left;
margin-top: 50px;
text-decoration: none;
background-color: rgb(255,237,55);
}

</style>

<br/>
<a href="/homepage/it/itmanuals" class="back">Назад</a>
