Я ищу способ использовать определенные блоки CIDR для сопоставления хостов в конфигурации клиента SSH (обычно ~ /. ssh / config
). Например, у меня есть запись для пересылки всего трафика через хост-бастион, если IP-адрес попадает в определенный диапазон, скажем 10.1.0.0/16
:
host 10.1.*
proxycommand ssh -q bastion -W %h:%p
Это работает очень хорошо, но как насчет того, когда Я добавляю несколько диапазонов, которые не соответствуют точечной нотации?
# doesn't work, unfortunately
host 10.2.0.0/18
proxycommand ssh -q bastion-foo -W %h:%p
host 10.2.64.0/18
proxycommand ssh -q bastion-bar -W %h:%p
Есть ли что-то в руководстве, которое я пропустил, или хитрый трюк с написанием сценариев, который позволил бы сопоставить эти диапазоны IP-адресов хоста?
Сопоставление с шаблонами в файле ssh_config производится как основное совпадение по шаблону, а не как совпадение по сети/IDR. Поэтому использование нотации CIDR не будет работать.
man page объясняет, что:
Шаблон состоит из нуля или более небелого пробела,
*
(подстановочный символ, совпадающий с нулем или более символов), или?
(подстановочный символ, совпадающий ровно с одним символом).
Лучшее, что вы можете сделать, это использовать список, состоящий из более чем одного шаблона. Опять же, со страницы руководства:
Список образцов - это разделенный запятыми список образцов. Шаблоны внутри списков образцов могут быть сведены на нет, если перед ними поставить восклицательный знак (
!
).
Чтобы охватить две сети /18, необходимо перечислить:
10.2...*
(т.е. 10.2.0.0-10.2.9.255)10. 2??*
(т.е. 10.2.10.0-10.2.99.255)10.2.10?*
(т.е. 10.2.100.0-10.2.109.255)10. 2.11?.*
(т.е. 10.2.110.0-10.2.119.255)10.2.12?*
ИСКЛЮЧИТЕЛЬНО те, которые соответствуют 10.2.128.*
и 10. 12.129.*
(и помните, что исключение должно быть первым!)Ваш список образцов должен выглядеть следующим образом:
Host "10.2.?.*","10.2.??.*", "10.2.10?.*","10.2.11?.*","!10.2.128.*","!10.2.129.*","10.2.12?.*"
Следите за http://bugzilla.mindrot.org/show_bug.cgi?id=1169 , который в конечном итоге может предоставить механизм для этого.
Вы можете использовать очень мощную директиву Match
с инструментом grepcidr:
Match exec "grepcidr 10.2.0.0/18 <(echo %h) &>/dev/null"
Proxycommand ssh -q bastion-foo -W %h:%p
Как это работает:
%h
в командной строке расширяется до имени хоста (см. Токены)<(echo %h)
оборачивает это во временный «файл»< (dig +short %h)
, если вы работаете с именами хостовgrepcidr
для сопоставления имени хоста %h
с abcd/e&>/dev/ null
, потому что нас интересует только код возврата, а не вывод. Для этого требуется дополнительный крошечный пакет grepcidr, который должен существовать в вашем диспетчере пакетов.