12

В офисе я могу подключиться к внутренним машинам без прокси, но мне нужен прокси для внешних подключений. За пределами офиса я могу подключаться к другим внешним машинам без прокси, но мне нужно использовать один из 2 прокси для подключения к внутренним машинам.

Если я могу найти способ автоматического определения, в какой сети я нахожусь, могу ли я дать команду ssh загрузить соответствующий файл конфигурации?

Если нет, то есть ли более элегантное решение, чем написание сценария оболочки для символической ссылки на соответствующий файл конфигурации в ~/.ssh/config (моя лучшая идея на данный момент)?

Редактировать: я думаю, что @pcm и JonnyRo поняли мой вопрос, и я попробую то, что они предлагают, но просто чтобы было ясно, я хочу

|--------\    Dest   | abc.example.com | xyz.external.org |
| Source  \---------\|                 |                  |
|--------------------+-----------------+------------------|
| example.com office | No Proxy        | Proxy            |
| outside            | Proxy           | No Proxy         |

6 ответов6

8

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

# proxy ssh 
Host *%sshproxy
    ProxyCommand ssh user@proxyhost.example.org /bin/netcat -w 1 $(echo %h | cut -d%% -f1) 22

Host myhost.example.org
    HostName 172.16.24.1

Host otherhost.example.com
    HostName 192.168.57.12

Поэтому, когда мне не нужно использовать прокси, я могу просто запустить команду, например ssh myhost.example.org и подключиться, но когда мне нужен прокси, я запускаю команду ssh myhost.example.org%sshproxy .

Я подозреваю, что вы могли бы установить какой-нибудь псевдоним или параметр автозаполнения, который бы автоматически добавлял бит %proxy .

6

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

4

Старый вопрос, но некоторые идеи в этой теме помогли мне, и вот решение, которое я придумал:

Во-первых, конфигурация прокси-сервера ssh.

Match Originalhost proxy Exec "ifconfig | grep 10.0.1"
     Hostname 10.0.1.2
Host proxy 
     Hostname external.hostname.com

Затем конфигурация сервера B :

Match Originalhost server-b Exec "ifconfig | grep 10.0.1"
     ProxyCommand none
Host server-b
     Hostname 10.0.1.3
     ProxyCommand ssh -W %h:%p server-a

Идея заключается в том, что случай по умолчанию - подключение с внешнего сайта, и ProxyCommand сначала устанавливает ssh-соединение с прокси, а затем подключается к серверу-b. Если, с другой стороны, мы уже находимся в локальной подсети, ProxyCommand отключен и прокси-соединение с сервером a не установлено.

Независимо от того, где вы находитесь, вы всегда можете достичь server-abc с помощью этой записи, и эта установка выясняет, где вы находитесь, и устанавливает соединение соответствующим образом. Для server-xyz, просто используйте ту же идею.

Я сделал более подробное объяснение здесь:http://blog.kihltech.com/2017/04/ssh-conditional-host-address-based-on-network-or-location/

1

Напишите сценарий оболочки, который проверяет ваш IP на соответствие шаблону, а затем вставьте в него соответствующий сценарий оболочки.

Если по какой-то причине ваш диапазон IP-адресов для дома и работы одинаков, попробуйте переключиться на основе /etc/resolv.conf, который содержит DNS-серверы, настроенные DHCP.

0

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

Host ENTRY_POINT
Hostname ENTRY_POINT_FQDN
User USERNAME

Host *.INSIDE_DOMAIN
ProxyCommand ssh ENTRY_POINT nc %h %p

Таким образом, если вы находитесь снаружи, вы можете $ ssh machine.inside_domain. Если вы находитесь внутри и разрешаете DNS, вы можете использовать $ ssh machine. Это хорошо работает для меня.

Может быть, кто-то может улучшить эту идею, возможно, изменив конфигурацию DNS, чтобы она автоматически преобразовывала компьютер в machine.inside_domain, если вы находитесь за пределами и используете точку входа SSH.

0

Опция "Host" в .ssh/config позволяет вам изменять конфигурацию в зависимости от места назначения. Я использую это, чтобы настроить переадресацию портов и так далее в зависимости от того, куда я иду.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .