Как я могу сопоставить диапазон CIDR для записи хоста конфигурации SSH?

Я ищу способ использовать определенные блоки 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-адресов хоста?

22
задан 19 September 2016 в 10:05
3 ответа

Сопоставление с шаблонами в файле 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?.*"
24
ответ дан 2 December 2019 в 20:00

Следите за http://bugzilla.mindrot.org/show_bug.cgi?id=1169 , который в конечном итоге может предоставить механизм для этого.

1
ответ дан 2 December 2019 в 20:00

Вы можете использовать очень мощную директиву 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, который должен существовать в вашем диспетчере пакетов.

3
ответ дан 21 November 2020 в 15:50

Теги

Похожие вопросы