Intereting Posts

Как использовать один и тот же псевдоним SSH с несколькими адресами хостов / портами и т. Д.?

Вот проблема: я пытаюсь использовать SSH в системе, доступной, по крайней мере, из трех разных сетей – иногда напрямую, иногда через прокси – в разное время.

Подключение напрямую намного быстрее и надежнее, чем подключение через промежуточный хост, что опять намного быстрее и надежнее, чем подключение через общий Интернет, поэтому я хотел бы, чтобы SSH попытался подключиться тремя различными способами с приоритетом, выбрав сначала это удается.

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

Однако я не могу найти никакого механизма для решения этого. Возможно ли это вообще или нет?

Если нет, что люди обычно делают в такой ситуации?

Не используйте псевдонимы для соединений ssh ! Используйте правильный ssh_config в ~/.ssh/config . Он обладает некоторыми действительно мощными функциями.

Допустим, вы можете определить, в какой сети вы находитесь. Например, используя ваш IP-адрес, который можно вытащить, например, с помощью hostname -I . Поэтому давайте напишем некоторую конфигурацию:

 # in network1 I am getting ip from "10.168.*.*" and I need to connect through proxy Match Host myalias Exec hostname -I | grep 10\.168\. Hostname real-host-IP ProxyCommand ssh -W %h:%p proxy-server # in network2 I am getting IP from "192.168.*.*" and I do not need a proxy Match Host myalias Exec hostname -I | grep 192\.168\. Hostname real-host-IP # in network3 I am getting something else 

Полагаю, вы поняли …

Вы можете сохранить псевдоним оболочки или функцию в вашем .bashrc или что-то еще, что является конфигурационным файлом вашей оболочки. Например, для псевдонима Bash:

 alias my_ssh=" ssh mehrdad@"IP1 || ssh tomas@IP2 || ssh tomas@IP3 " 

Затем вызовите псевдоним:

  my_ssh 

И если IP1 терпит неудачу, || выполняет вторую команду. И так происходит снова, теперь с IP3.

Я не тестировал это, но все должно быть хорошо. Или, по крайней мере, показывает способ.

Для параметров SSH, таких как прокси, см. man ssh .

Эта функция может работать, но если работает псевдоним Томаса, я думаю, что это лучшее решение.

 autossh () { publicip="11.11.11.11" privateip="10.10.10.100" proxyhost="10.10.10.10" proxyport="9001" ssh -o ConnectTimeout=10 $1@$privateip 2> /dev/null && exit 0 if [ $? -ge 1 ]; then ssh -o ConnectTimeout=10 $1@$publicip -o "ProxyCommand=nc -X connect -x $proxyhost:$proxyport %h %p" 2> /dev/null && exit 0 if [ $? -ge 1 ]; then ssh -o ConnectTimeout=10 $1@$publicip 2> /dev/null && exit 0 if [ $? -ge 1 ]; then echo "I think your node is down" fi fi fi } 

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

  • выполнение SSH обратного туннеля (уродливый взлом);
  • настройка anycast с помощью OSPF или BGP и sshing для VIP-трансляции;
  • удаленная машина, устанавливающая туннель IPsec – без прокси;
  • связь через Tor
  • обновление сайта / страницы / сервера Redis / MySQL с текущим адресом и вашего скрипта ssh;
  • использование HAProxy;
  • динамический DNS.