---
title: "Настройка bastion-хоста"
---

# Настройка bastion-хоста

> Полный индекс документации для ИИ-агентов: [llms.txt](https://timeweb.cloud/llms.txt).

Bastion-хост — это облачный сервер, через который можно подключаться по SSH к серверам без публичных IP-адресов. Bastion имеет публичный и приватный IP, а внутренние серверы подключены только к приватной сети.

В результате внешний SSH-доступ будет открыт только к одному серверу. Подключение к остальным серверам будет выполняться через bastion по их приватным IP-адресам.

В примере используются:

-   приватная сеть `192.168.0.0/24`;
    
-   bastion-хост с приватным IP `192.168.0.10` и публичным IP;
    
-   внутренний сервер с приватным IP `192.168.0.20` без публичного IP;
    
-   отдельные файрволы для bastion-хоста и внутреннего сервера.
    

## Создание SSH-ключа

Если у вас уже есть подходящая пара SSH-ключей, используйте ее и перейдите к созданию приватной сети.

Чтобы создать новый ключ, выполните на локальном компьютере:

```bash
ssh-keygen -t ed25519 -f ~/.ssh/timeweb-bastion -C "bastion"
```

Будут созданы два файла:

-   `~/.ssh/timeweb-bastion` — приватный ключ;
    
-   `~/.ssh/timeweb-bastion.pub` — публичный ключ.
    

Приватный ключ должен храниться только на локальном компьютере. Не загружайте его на bastion-хост или внутренний сервер.

Добавьте публичный ключ в панель управления:

1.  Перейдите в раздел «Облачные серверы» → «[SSH-ключи](https://timeweb.cloud/my/sshkeys)».
    
2.  Нажмите «Добавить».
    
3.  Укажите имя, например bastion-key.
    
4.  Вставьте содержимое файла `~/.ssh/timeweb-bastion.pub`.
    
5.  Сохраните ключ.
    

## Создание приватной сети

Приватная сеть объединяет bastion-хост и внутренние серверы в изолированный сетевой сегмент.

Чтобы создать сеть:

1.  Перейдите в раздел «Сети» → «[Приватные сети](https://timeweb.cloud/my/vpc)».
    
2.  Нажмите «Создать» или «Добавить».
    
3.  Укажите имя сети, например `Bastion`.
    
4.  Выберите локацию, в которой будут созданы серверы.
    
5.  Укажите диапазон адресов, например `192.168.0.0/24`.
    
6.  Завершите создание сети.
    

> [!NOTE]
> Серверы и приватная сеть должны находиться в одной локации. Перед выбором диапазона убедитесь, что он не пересекается с другими сетями, которые планируется объединить с этой сетью.

## Создание bastion-хоста

Bastion-хост должен быть доступен из интернета по публичному IP и подключен к приватной сети внутренних серверов.

1.  Перейдите в раздел «[Облачные серверы](https://timeweb.cloud/my/servers)» и нажмите «Создать».
    
2.  Выберите образ и подходящую конфигурацию сервера. Для небольшого количества SSH-соединений достаточно минимальной конфигурации.
    
3.  Выберите ту же локацию, в которой создана приватная сеть.
    
4.  Подключите публичный IP.
    
5.  Подключите сервер к сети Bastion.
    
6.  Выберите SSH-ключ bastion-key.
    
7.  Укажите имя bastion-host и создайте сервер.
    

После создания обратите внимание на:

-   публичный IP bastion-хоста;
    
-   приватный IP bastion-хоста, например `192.168.0.10`.
    

Эти адреса будут использоваться дальше для настройки подключения.

## Создание внутреннего сервера

Внутреннему серверу не требуется публичный IP. Он будет доступен только из приватной сети.

1.  Перейдите в раздел «[Облачные серверы](https://timeweb.cloud/my/servers)» и нажмите «Создать».
    
2.  Выберите образ и конфигурацию сервера.
    
3.  Выберите ту же локацию, что у bastion-хоста.
    
4.  Отключите публичный IP.
    
5.  Подключите сервер к сети `Bastion`.
    
6.  Выберите SSH-ключ `bastion-key`.
    
7.  Укажите имя `internal-server` и создайте сервер.
    

После создания запишите приватный IP сервера, например `192.168.0.20`.

> [!NOTE]
> Один публичный ключ используется в примере для упрощения настройки. Для production-окружения можно использовать разные ключи для bastion-хоста и внутренних серверов.

## Настройка файрвола

Для bastion-хоста и внутренних серверов рекомендуется использовать отдельные файрволы. Это позволяет независимо управлять правилами внешнего и внутреннего доступа.

### Файрвол bastion-хоста

Разрешите подключение к порту SSH только с доверенного публичного IP:

1.  Перейдите в раздел «Сети» → «[Firewall](https://timeweb.cloud/my/firewalls)» и нажмите «Добавить».
    
2.  Выберите разрешающий тип правил.
    
3.  Укажите имя `bastion-fw`.
    
4.  Добавьте входящее правило:
    

-   протокол — `TCP`;
    
-   порт — `22`;
    
-   источник — публичный IP администратора с маской `/32`, например `203.0.113.10/32`.
    

6.  Привяжите файрвол к серверу `bastion-host`.
    

Узнать текущий публичный IP можно с помощью любого сервиса проверки IP-адреса. Если адрес изменится, обновите правило файрвола.

> [!NOTE]
> Не используйте источник `0.0.0.0/0`, если в этом нет необходимости. Такое правило разрешит попытки подключения к SSH со всего интернета.

### Файрвол внутреннего сервера

Разрешите SSH-подключения только с приватного IP bastion-хоста:

1.  Создайте разрешающий файрвол с именем `internal-fw`.
    
2.  Добавьте входящее правило:
    

-   протокол — `TCP`;
    
-   порт — `22`;
    
-   источник — приватный IP bastion-хоста с маской `/32`, например `192.168.0.10/32`.
    

4.  Привяжите файрвол к серверу `internal-server`.
    

Если исходящий трафик также ограничен, разрешите на bastion-хосте исходящее TCP-соединение к приватному IP внутреннего сервера на порт `22`.

При использовании разрешающих правил файрвола настройте правила DHCP на сервере. Без них сервер может потерять приватный IP после окончания срока аренды.

## Проверка подключения к bastion-хосту

Подключитесь к bastion-хосту по публичному IP:

```bash
ssh -i ~/.ssh/timeweb-bastion root@<BASTION_PUBLIC_IP>
```

При первом подключении SSH предложит сохранить ключ хоста. После успешного входа завершите сеанс командой:

```bash
exit
```

Если подключение завершается по тайм-ауту, проверьте публичный IP сервера и правила файрвола. Если появляется ошибка `Permission denied`, проверьте имя пользователя и SSH-ключ.

## Подключение к внутреннему серверу

Для подключения через bastion используйте механизм `ProxyJump`:

```bash
ssh -i ~/.ssh/timeweb-bastion -J root@<BASTION_PUBLIC_IP> root@192.168.0.20
```

SSH-клиент установит соединение с bastion-хостом, а затем подключится к приватному IP внутреннего сервера. Приватный ключ при этом остается на локальном компьютере.

Для старых версий OpenSSH без поддержки `ProxyJump` используйте `ProxyCommand`:

```bash
ssh -i ~/.ssh/timeweb-bastion -o ProxyCommand="ssh -i ~/.ssh/timeweb-bastion -W %h:%p root@<BASTION_PUBLIC_IP>" root@192.168.0.20
```

## Настройка SSH-конфигурации

Чтобы не указывать параметры подключения вручную, добавьте хосты в файл `~/.ssh/config` на локальном компьютере:

```bash
Host twc-bastion
   HostName <BASTION_PUBLIC_IP>
   User root
   IdentityFile ~/.ssh/timeweb-bastion
   IdentitiesOnly yes
​
Host twc-internal
   HostName 192.168.0.20
   User root
   IdentityFile ~/.ssh/timeweb-bastion
   IdentitiesOnly yes
   ProxyJump twc-bastion
```

Ограничьте доступ к файлу конфигурации:

```bash
chmod 600 ~/.ssh/config
```

Теперь для подключения к внутреннему серверу достаточно выполнить:

```bash
ssh twc-internal
```

## Доступ к сервисам во внутренней сети

Через bastion можно открыть локальный SSH-туннель к сервису на внутреннем сервере. Например, следующая команда перенаправит локальный порт `8080` на порт `80` сервера `192.168.0.20`:

```bash
ssh -N -L 8080:192.168.0.20:80 twc-bastion
```

Пока соединение активно, сервис будет доступен на локальном компьютере по адресу:

```bash
http://127.0.0.1:8080
```

Порт сервиса не требуется открывать в интернет. Он должен быть доступен с приватного IP bastion-хоста.

## Передача файлов

Для передачи файлов через bastion используйте scp с настроенной SSH-конфигурацией:

```bash
scp ./localfile.txt twc-internal:/root/
```

Для копирования файла с внутреннего сервера:

```bash
scp twc-internal:/root/remotefile.txt ./
```

## Удаление ресурсов

Если bastion-хост и внутренний сервер больше не нужны:

1.  Удалите облачные серверы bastion-host и internal-server.
    
2.  Удалите файрволы bastion-fw и internal-fw.
    
3.  Удалите приватную сеть Bastion.
    

Перед удалением приватной сети убедитесь, что к ней не подключены другие серверы или сервисы.
