Dependendo da rede ~ / .ssh / config?

15

No escritório, posso conectar-me a máquinas internas sem um proxy, mas preciso de um proxy para conexões externas. Fora do escritório, posso conectar-me a outras máquinas externas sem proxy, mas preciso usar um dos 2 proxies para conectar-me a máquinas internas.

Se eu descobrir uma maneira de detectar automaticamente em que rede estou, posso instruir o ssh para carregar o arquivo de configuração apropriado?

Caso contrário, existe uma solução mais elegante do que escrever um script de shell para vincular o arquivo de configuração apropriado a ~ / .ssh / config (minha melhor idéia até agora)?

Edit: Eu acho que @pcm e JonnyRo entenderam minha pergunta e tentarei o que eles sugerem, mas, para deixar claro, eu quero

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

Respostas:

11

Dependendo de como o seu proxy estiver configurado, você pode simplesmente criar uma entrada de configuração SSH que funcione em qualquer situação. Por exemplo, em uma rede que eu uso regularmente, tenho que ssh para um host intermediário antes de poder fazer uma conexão de saída. Então, basicamente, eu defino uma configuração que se parece com isso.

# proxy ssh 
Host *%sshproxy
    ProxyCommand ssh [email protected] /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

Portanto, quando não preciso usar um proxy, posso simplesmente executar um comando como ssh myhost.example.orge me conectar, mas quando preciso do proxy, executo o comando ssh myhost.example.org%sshproxy.

Eu suspeito que você provavelmente poderia configurar algum tipo de alias ou configuração de preenchimento automático que acrescentaria automaticamente o %proxybit.

Zoredache
fonte
8

Pergunta antiga, mas algumas idéias neste segmento me ajudaram e esta é uma solução que eu vim com:

Primeiro, a configuração ssh do servidor proxy .

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

Em seguida, a configuração do servidor 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

A idéia aqui é que o caso padrão esteja se conectando a partir de um site externo e o ProxyCommand inicie uma conexão ssh com o proxy primeiro e depois conecte-se ao servidor-b . Se, por outro lado, já estivermos localizados na sub-rede local, o ProxyCommand será desativado e nenhuma conexão proxy com o servidor-a será feita.

Independentemente de onde você esteja, sempre é possível acessar o server-abc por esta entrada e essa configuração descobre onde você está e configura a conexão de acordo. Para server-xyz , use a mesma ideia.

Fiz uma explicação mais completa aqui: http://blog.kihltech.com/2017/04/ssh-conditional-host-address-based-on-network-or-location/

Robert Kihlberg
fonte
7

Você pode usar a opção -F para selecionar entre diferentes arquivos de configuração. para os dois casos de rede. Você pode criar aliases que usam os diferentes arquivos de configuração, com base em qual rede você está, ou no seu script de login, configurar um único alias, com base no seu endereço IP.

pcm
fonte
Obrigado! Aliases com -F serão definitivamente meu substituto, se eu não conseguir que um script funcione com base no IP.
Nate Parsons
Isso é incrível, eu estava prestes a fazer a mesma pergunta. Eu já escrevo algumas outras opções para definir variáveis ​​de ambiente quando inicio um novo terminal, posso facilmente criar um alias ou vincular o .ssh / config adequado com base no ambiente.
Newz2000
1

Escreva um script de shell que verifique seu IP em relação a um padrão e depois vincule o script de shell apropriado.

Se, por algum motivo, seu intervalo de IP for o mesmo para casa e trabalho, tente alternar com base no /etc/resolv.conf, que contém os servidores DNS configurados por DHCP.

JonnyRo
fonte
0

A opção "Host" em .ssh / config permite alterar a configuração com base no destino. Eu uso isso para ajustar o encaminhamento de porta e outros com base em onde estou indo.

JOTN
fonte
0

Eu examinei essa questão no passado e uma solução possível é ter essa entrada no arquivo de configuração:

Host ENTRY_POINT
Hostname ENTRY_POINT_FQDN
User USERNAME

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

Dessa forma, se você estiver fora, pode $ ssh machine.inside_domain. Se você está dentro e tem o dns resolvendo, pode usar a máquina $ ssh. Isso funciona bem para mim.

Talvez alguém possa melhorar essa idéia, talvez alterando a configuração do DNS para resolver automaticamente machine to machine.inside_domain se você estiver fora e usar o ponto de entrada SSH.

Fernando
fonte