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-ключей, используйте ее и перейдите к созданию приватной сети.
Чтобы создать новый ключ, выполните на локальном компьютере:
ssh-keygen -t ed25519 -f ~/.ssh/timeweb-bastion -C "bastion"
Будут созданы два файла:
-
~/.ssh/timeweb-bastion— приватный ключ; -
~/.ssh/timeweb-bastion.pub— публичный ключ.
Приватный ключ должен храниться только на локальном компьютере. Не загружайте его на bastion-хост или внутренний сервер.
Добавьте публичный ключ в панель управления:
-
Перейдите в раздел «Облачные серверы» → «SSH-ключи».
-
Нажмите «Добавить».
-
Укажите имя, например bastion-key.
-
Вставьте содержимое файла
~/.ssh/timeweb-bastion.pub. -
Сохраните ключ.
Создание приватной сети
Приватная сеть объединяет bastion-хост и внутренние серверы в изолированный сетевой сегмент.
Чтобы создать сеть:
-
Перейдите в раздел «Сети» → «Приватные сети».
-
Нажмите «Создать» или «Добавить».
-
Укажите имя сети, например
Bastion. -
Выберите локацию, в которой будут созданы серверы.
-
Укажите диапазон адресов, например
192.168.0.0/24. -
Завершите создание сети.
Серверы и приватная сеть должны находиться в одной локации. Перед выбором диапазона убедитесь, что он не пересекается с другими сетями, которые планируется объединить с этой сетью.
Создание bastion-хоста
Bastion-хост должен быть доступен из интернета по публичному IP и подключен к приватной сети внутренних серверов.
-
Перейдите в раздел «Облачные серверы» и нажмите «Создать».
-
Выберите образ и подходящую конфигурацию сервера. Для небольшого количества SSH-соединений достаточно минимальной конфигурации.
-
Выберите ту же локацию, в которой создана приватная сеть.
-
Подключите публичный IP.
-
Подключите сервер к сети Bastion.
-
Выберите SSH-ключ bastion-key.
-
Укажите имя bastion-host и создайте сервер.
После создания обратите внимание на:
-
публичный IP bastion-хоста;
-
приватный IP bastion-хоста, например
192.168.0.10.
Эти адреса будут использоваться дальше для настройки подключения.
Создание внутреннего сервера
Внутреннему серверу не требуется публичный IP. Он будет доступен только из приватной сети.
-
Перейдите в раздел «Облачные серверы» и нажмите «Создать».
-
Выберите образ и конфигурацию сервера.
-
Выберите ту же локацию, что у bastion-хоста.
-
Отключите публичный IP.
-
Подключите сервер к сети
Bastion. -
Выберите SSH-ключ
bastion-key. -
Укажите имя
internal-serverи создайте сервер.
После создания запишите приватный IP сервера, например 192.168.0.20.
Один публичный ключ используется в примере для упрощения настройки. Для production-окружения можно использовать разные ключи для bastion-хоста и внутренних серверов.
Настройка файрвола
Для bastion-хоста и внутренних серверов рекомендуется использовать отдельные файрволы. Это позволяет независимо управлять правилами внешнего и внутреннего доступа.
Файрвол bastion-хоста
Разрешите подключение к порту SSH только с доверенного публичного IP:
-
Перейдите в раздел «Сети» → «Firewall» и нажмите «Добавить».
-
Выберите разрешающий тип правил.
-
Укажите имя
bastion-fw. -
Добавьте входящее правило:
-
протокол —
TCP; -
порт —
22; -
источник — публичный IP администратора с маской
/32, например203.0.113.10/32. -
Привяжите файрвол к серверу
bastion-host.
Узнать текущий публичный IP можно с помощью любого сервиса проверки IP-адреса. Если адрес изменится, обновите правило файрвола.
Не используйте источник
0.0.0.0/0, если в этом нет необходимости. Такое правило разрешит попытки подключения к SSH со всего интернета.
Файрвол внутреннего сервера
Разрешите SSH-подключения только с приватного IP bastion-хоста:
-
Создайте разрешающий файрвол с именем
internal-fw. -
Добавьте входящее правило:
-
протокол —
TCP; -
порт —
22; -
источник — приватный IP bastion-хоста с маской
/32, например192.168.0.10/32. -
Привяжите файрвол к серверу
internal-server.
Если исходящий трафик также ограничен, разрешите на bastion-хосте исходящее TCP-соединение к приватному IP внутреннего сервера на порт 22.
При использовании разрешающих правил файрвола настройте правила DHCP на сервере. Без них сервер может потерять приватный IP после окончания срока аренды.
Проверка подключения к bastion-хосту
Подключитесь к bastion-хосту по публичному IP:
ssh -i ~/.ssh/timeweb-bastion root@<BASTION_PUBLIC_IP>
При первом подключении SSH предложит сохранить ключ хоста. После успешного входа завершите сеанс командой:
exit
Если подключение завершается по тайм-ауту, проверьте публичный IP сервера и правила файрвола. Если появляется ошибка Permission denied, проверьте имя пользователя и SSH-ключ.
Подключение к внутреннему серверу
Для подключения через bastion используйте механизм ProxyJump:
ssh -i ~/.ssh/timeweb-bastion -J root@<BASTION_PUBLIC_IP> root@192.168.0.20
SSH-клиент установит соединение с bastion-хостом, а затем подключится к приватному IP внутреннего сервера. Приватный ключ при этом остается на локальном компьютере.
Для старых версий OpenSSH без поддержки ProxyJump используйте ProxyCommand:
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 на локальном компьютере:
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
Ограничьте доступ к файлу конфигурации:
chmod 600 ~/.ssh/config
Теперь для подключения к внутреннему серверу достаточно выполнить:
ssh twc-internal
Доступ к сервисам во внутренней сети
Через bastion можно открыть локальный SSH-туннель к сервису на внутреннем сервере. Например, следующая команда перенаправит локальный порт 8080 на порт 80 сервера 192.168.0.20:
ssh -N -L 8080:192.168.0.20:80 twc-bastion
Пока соединение активно, сервис будет доступен на локальном компьютере по адресу:
http://127.0.0.1:8080
Порт сервиса не требуется открывать в интернет. Он должен быть доступен с приватного IP bastion-хоста.
Передача файлов
Для передачи файлов через bastion используйте scp с настроенной SSH-конфигурацией:
scp ./localfile.txt twc-internal:/root/
Для копирования файла с внутреннего сервера:
scp twc-internal:/root/remotefile.txt ./
Удаление ресурсов
Если bastion-хост и внутренний сервер больше не нужны:
-
Удалите облачные серверы bastion-host и internal-server.
-
Удалите файрволы bastion-fw и internal-fw.
-
Удалите приватную сеть Bastion.
Перед удалением приватной сети убедитесь, что к ней не подключены другие серверы или сервисы.