Файл конфигурации SSH: правильный синтаксис “Match host” против “Host” для использования фактического адреса вместо псевдонима.

Вопрос или проблема

Моя цель – ввести некоторые общие свойства для подмножества хостов в конфигурации. Следующие два примера близки, за исключением замены раздела Host на раздел Match и алиасов хостов назначения. Первый пример работает, как задумано, если я сопоставляю с никнеймом. Однако моя цель – применить специальные параметры ко всем хостам в определенной подсети. Подстановка в алиасы хостов на самом деле невозможна, потому что нет единообразия в именах, и некоторые имеют несколько алиасов.

Host *
        ServerAliveInterval 240
        AddressFamily inet
        ForwardAgent yes
        ForwardX11 yes
        ForwardX11Trusted yes

Host server*
        IdentityFile ~/.ssh/default_id_rsa
        User remoteMe
        RequestTTY force
        RemoteCommand bash
        ProxyJump myproxy

Host myproxy 
        Hostname 10.1.2.3
        User meOnProxy
        IdentityFile ~/.ssh/meOnProxy_id_rsa

Host server01 
        Hostname 192.168.1.11

Host server02
        Hostname 192.168.1.12

Host otherserver
        Hostname 10.1.15.155
        User meOnOtherserver
        IdentityFile ~/.ssh/other_id_rsa

Однако я хотел бы ориентироваться не на Host, а на Hostname, но следующее не работает, сопоставление игнорируется, и оно зависает, пытаясь напрямую определить хост (JumpProxy и другие параметры игнорируются). Пожалуйста, помогите мне с синтаксисом Match.

Host *
        ServerAliveInterval 240
        AddressFamily inet
        ForwardAgent yes
        ForwardX11 yes
        ForwardX11Trusted yes

Match host 192.168.1.*
        IdentityFile ~/.ssh/default_id_rsa
        User remoteMe
        RequestTTY force
        RemoteCommand bash
        ProxyJump myproxy

Host myproxy 
        Hostname 10.1.2.3
        User meOnProxy
        IdentityFile ~/.ssh/meOnProxy_id_rsa

Host firstserver proc11
        Hostname 192.168.1.11

Host servertwo proc12
        Hostname 192.168.1.12

Host otherserver
        Hostname 10.1.15.155
        User meOnOtherserver
        IdentityFile ~/.ssh/default_id_rsa

Вместо:

# Неправильно:
Match host 192.168.1.*

Вы должны использовать:

Match host="192.168.1.*"

Используйте запятые как разделитель для нескольких хостов и ! для отрицания:

Match host="!192.168.1.11,192.168.1.*,192.168.2.*"

Короче говоря:

Ваш синтаксис правильный, просто переместите ваш блок Match, чтобы он шёл после секций для индивидуальных серверов.

(Также, всегда размещайте блок Host * в самом конце, чтобы позволить переопределения в других секциях.)


Полное объяснение:

Когда вы запускаете команду ssh, конфигурация парсится сверху вниз. Каждый раз, когда встречается Host или Match, параметры в этом разделе добавляются (для любого параметра, который не был уже установлен ранее в процессе парсинга).

Когда парсер достигает нижней части конфигурации, парсинг прекращается, и SSH начинает попытку подключения к настроенной цели.

Единственным исключением из этого является установка параметра CanonicalizeHostname, в этом случае парсинг начинается снова с начала, используя новое имя хоста.

Пример 1 — Match в начале

$> cat /path/to/.ssh/config

  Match Host 123.*
    Port 99999

  Host foobar
    Hostname 123.123.123.123

$> ssh -vv foobar
debug1: Reading configuration data /path/to/.ssh/config
debug2: checking match for 'Host 123.*' host foobar originally foobar
debug2: match not found
debug1: /path/to/.ssh/config line 4: Applying options for foobar
debug2: resolving "123.123.123.123" port 22
debug1: Connecting to 123.123.123.123 [123.123.123.123] port 22.

Поскольку целевой сокет 123.123.123.123:22 разрешается таблицей маршрутизации IP, адрес считается допустимым, и парсинг прекращается.

Пример 2 — Match в конце

$> cat /path/to/.ssh/config

  Host foobar
    Hostname 123.123.123.123

  Match Host 123.*
    Port 99999

$> ssh -vv foobar
debug1: Reading configuration data /path/to/.ssh/config
debug1: /path/to/.ssh/config line 2: Applying options for foobar
debug2: checking match for 'Host 123.*' host 123.123.123.123 originally foobar
debug2: match found
debug2: resolving "123.123.123.123" port 99999
debug1: Connecting to 123.123.123.123 [123.123.123.123] port 99999.

На этот раз параметр port из блока Match применяется перед попыткой разрешения хоста.

Host vs Match Host

Блок Host всегда сопоставляется с оригинальным значением имени хоста, которое было предоставлено команде ssh (если не используется параметр CanonicalizeHostname).

Наоборот, блок Match использует настроенное имя хоста, после того как были применены правила HostName и Canonicalize.

.

Ответ или решение

Вопрос касательно конфигурации SSH-файлов и правильного использования синтаксиса команд "Host" и "Match" является актуальным для многих ИТ-специалистов, стремящихся оптимизировать работу с сетями и удаленными серверами. Основная задача в обсуждаемой проблеме — настроить общие параметры для подмножества хостов, используя реальные IP-адреса, вместо их псевдонимов. Давайте разберемся подробнее.

Теория

В SSH-конфигурации блоки Host и Match служат для применения различных настроек в зависимости от управляющих условий, таких как имя хоста или его IP-адрес. Команда Host применяется, когда вы хотите назначить определенные параметры для одного или нескольких хостов, указанных по имени или маске. Например, блок "Host server*" будет применен ко всем хостам, имена которых начинаются с "server".

В свою очередь, блок Match предоставляет более гибкие возможности благодаря директивному подходу, позволяющему применять настройки не только по имени хоста, но и по другим характеристикам — таким как IP-адрес, пользователь или хосты. Использование Match позволяет делать конфигурацию более адаптируемой и мощной.

Примеры

Ваша задача была применить некоторые параметры ко всем хостам, расположенным в определенной подсети. Для этого вы должны использовать директивы Match с конкретными IP-адресами. Ошибки или недостаточное понимание могут привести к игнорированию этих настроек и, как следствие, к проблемам в подключении или работе с SSH-сессиями.

Пример 1: Неправильное использование Match

Match host 192.168.1.*

Такой синтаксис некорректен. SSH-конфигуратор проигнорирует это правило. Директивы Match требуют более точной записи.

Пример 2: Правильное использование Match

Match host="192.168.1.*"

Такая запись позволяет корректно задать условие на основе IP-адреса, что в вашем случае абсолютно необходимо. Через запятые могут быть указаны несколько параметров, а восклицательный знак ! используется для отрицания.

Применение

Размещение блоков

Ключевая деталь заключается в правильном расположении этих блоков в конфигурационном файле. Если вы добавляете блок Match в начале или середине файла конфигурации, он может не сработать, поскольку параметры, заданные позже, могут его переопределить.

Рекомендации

  1. Порядок блоков: Убедитесь, что блок Match располагается после всех блоков, где могут быть перезаписаны параметры, такие как Host.

  2. Логика применения: Знайте, что SSH-парсер применяет настройки, считая файл сверху вниз. Это значит, что если в процессе парсинга найдется более точное соответствие, оно будет применено последним.

  3. Проверка: Всегда проверяйте корректность конфигурации через ssh -vv — режим детальной отладки, который показывает, как параметры применяются к хостам.

  4. Любое соответствие: Используйте Host * для общих настроек и обеспечьте, чтобы этот блок находился в конце файла, чтобы гарантировать, что никакие важные и специфичные настройки не будут перезаписаны случайно.

  5. Обработка ошибок: Если после применения изменений, измеренной через режимы отладки, Match блоки все равно игнорируются, убедитесь, что никаких грамматических ошибок, таких как лишние пробелы или опечатки в именах файлов, в текущем конфигурационном файле нет.

Заключение

Конфигурация SSH, особенно при большом количестве серверов и изменяющихся сетевых условий, требует внимательности и понимания базовых принципов работы инструментов. Это позволит реализовать надежные и гибкие решения для подключения и управления ресурсами удаленно, используя преимущества современных возможностей сетевых протоколов, таких как SSH. Правильное применение блоков Host и Match обеспечит безопасность и производительность вашей системы, следуя изменениям и требованиям разных подсетей.

Оцените материал
Добавить комментарий

Капча загружается...