- Вопрос или проблема
- Короче говоря:
- Ваш синтаксис правильный, просто переместите ваш блок Match, чтобы он шёл после секций для индивидуальных серверов.
- Полное объяснение:
- Пример 1 — Match в начале
- Пример 2 — Match в конце
- Host vs Match Host
- Ответ или решение
- Теория
- Примеры
- Пример 1: Неправильное использование Match
- Пример 2: Правильное использование Match
- Применение
- Размещение блоков
- Рекомендации
- Заключение
Вопрос или проблема
Моя цель – ввести некоторые общие свойства для подмножества хостов в конфигурации. Следующие два примера близки, за исключением замены раздела 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
в начале или середине файла конфигурации, он может не сработать, поскольку параметры, заданные позже, могут его переопределить.
Рекомендации
-
Порядок блоков: Убедитесь, что блок
Match
располагается после всех блоков, где могут быть перезаписаны параметры, такие какHost
. -
Логика применения: Знайте, что SSH-парсер применяет настройки, считая файл сверху вниз. Это значит, что если в процессе парсинга найдется более точное соответствие, оно будет применено последним.
-
Проверка: Всегда проверяйте корректность конфигурации через
ssh -vv
— режим детальной отладки, который показывает, как параметры применяются к хостам. -
Любое соответствие: Используйте
Host *
для общих настроек и обеспечьте, чтобы этот блок находился в конце файла, чтобы гарантировать, что никакие важные и специфичные настройки не будут перезаписаны случайно. -
Обработка ошибок: Если после применения изменений, измеренной через режимы отладки,
Match
блоки все равно игнорируются, убедитесь, что никаких грамматических ошибок, таких как лишние пробелы или опечатки в именах файлов, в текущем конфигурационном файле нет.
Заключение
Конфигурация SSH, особенно при большом количестве серверов и изменяющихся сетевых условий, требует внимательности и понимания базовых принципов работы инструментов. Это позволит реализовать надежные и гибкие решения для подключения и управления ресурсами удаленно, используя преимущества современных возможностей сетевых протоколов, таких как SSH. Правильное применение блоков Host
и Match
обеспечит безопасность и производительность вашей системы, следуя изменениям и требованиям разных подсетей.