Можно ли настроить параметры SSH для каждой сети?

Можно ли настроить параметры SSH для каждой сети?

я говорю оssh_config(5). Интересно, можно ли определить раздел или файл конфигурации на основе текущей подключенной сети.

Я думаю о сценарии, когда корпоративный брандмауэр блокирует порт 22, но ваша домашняя сеть — нет. Итак, у вас есть эта конфигурация, но технически она не нужна дома.

Host github.com
  Hostname ssh.github.com
  Port 443

Я уверен, что это не самый интересный сценарий, но надеюсь, вы понимаете, к чему я клоню.

решение1

Я решил эту проблему, имея несколько конфигураций, названных по домену, предоставленному DHCP, плюс один по умолчанию в качестве резерва, например ~/.ssh/config.abc, , ~/.ssh/config.xyz, ~/.ssh/config:defaultдля двух доменов abcи xyz, плюс по умолчанию. Если вам интересно, почему двоеточие в default -- это позволяет домену с именем default.

Затем следует небольшой скрипт ~/.ssh/update-config, который связывает один из файлов на основе домена, переданного в командной строке:

#!/bin/bash`

config=~/.ssh/config
default_config=${config}:default

domain="$1"
domain_config=${config}.${domain}

if test -f ${domain_config}; then
    echo "Using config ${domain_config}"
    ln -sf ${domain_config} ${config}
else
    echo "Using default config ${default_config}"
    ln -sf ${default_config} ${config}
fi

Затем вы можете вызвать этот скрипт вручную, указав соответствующий домен в качестве первого параметра.

Чтобы автоматизировать этот процесс, я также добавил хук NetworkManager ( /etc/NetworkManager/dispatcher.d/02-sshconfig):

#!/bin/bash

case "$2" in
    up|dhcp4-change)
        break
        ;;
    *)
        exit 0
        ;;
esac

# some iface went up

for home in /home/*; do
        user=$(basename ${home})
        script="${home}/.ssh/update-config"
        test -x ${script} && su -l ${user} ${script} ${IP4_DOMAINS}
done

exit 0

Теперь, всякий раз, когда включается интерфейс или изменяется его конфигурация DHCP, этот скрипт запускается update-configдля каждого пользователя.

Не идеально (что если у проводной сети домен отличается от домена беспроводной сети, или в конфигурации DHCP нет домена и т. д.), но у меня он работал так хорошо много лет, что я забыл, что он у меня настроен, и мне пришлось рыться в старом ноутбуке, чтобы пересадить его на новый.

Если в конфигурации DHCP не указан домен, вы можете попытаться выбрать конфигурацию на основе чего-то другого, например, назначенного вам IP-адреса.

Конечно, в конфигах есть некоторые дубликаты, поэтому, возможно, лучше было бы использовать конфигурацию из одного источника со специальными тегами (домен DHCP, IP-адрес/диапазон) и скрипт, который фильтрует только помеченные хосты для фактической конфигурации. Возможно, кто-то мог бы почерпнуть здесь вдохновение.

решение2

Один ответ, на который намекнули в комментарии, предлагал просто поддерживать правила для каждой сети в файле конфигурации SSH пользователя. Например...

Host foo@work
  Hostname ssh.foo.com
  Port 443

Это, вероятно, сработало бы там, где у меня больше контроля над командами и вводом имени хоста, но git pushи pullкоманды считываются напрямую с настроенных удаленных серверов.

Похоже, мне придется еще и пульты дистанционного управления на работе и дома настраивать :(

Связанный контент