Pula para o host na rede openvpn remota usando seu CommonName como hostname

1

server com IP público e vários clientes de trás de NATs, conectados à opção server via openvpn with ifconfig-pool-persist ipp.txt em /etc/openvpn/server.conf .

Todos os participantes de openvpn network ( 172.16.0.0/16 ) possuem sudo-user user . A chave pública da minha máquina local é adicionada a ~root/.ssh/authorized_keys e ~user/.ssh/authorized_keys to server e a todos os clientes. Então, usando server como host de salto para 172.16.0.0/16 network eu posso facilmente conectar-me a qualquer um dos participantes da rede por IP com o auxílio do encaminhamento de chaves ( ForwardAgent yes ).

Emitindo pares de certificados / chaves para openvpn clientes, eu designei nomes significativos (aí CommonName ) para eles. Gostaria de usá-los como nomes de host, passados para ssh para se conectar. Para alcançar o desejado, fiz o seguinte:

~user/.ssh/config :

Host *
    IdentityFile ~/.ssh/id_rsa.user
    IdentityFile ~/.ssh/id_rsa.root
    ForwardAgent yes
    Compression yes
Host server rserver
    HostName 1.1.1.1
Host client* rclient* 172.16.*
    ProxyCommand ~/.ssh/get_client_ip.bash %h %p
Host client* server
    User user
Host rclient* rserver
    User root
Host 192.168.1.*
    Compression no

~user/.ssh/get_client_ip.bash ( chmod +x -ed):

#! /usr/bin/env bash

ssh -T -W $( ssh rserver "awk -F '[.,]' -v OFS='.' '/^"$1",/ { print \, \, \, (\ + 2) }' /etc/openvpn/ipp.txt" ):$2 server

Se eu simplesmente digitar ssh -o ProxyCommand="ssh -T -W 172.16.0.4:22 server" 172.16.0.4 (aqui último 172.16.0.4 (IP de client1 ) realmente não tem nenhum significado), então a conexão é estabelecida corretamente.

Se eu digitar ssh client1 , obtenho um erro:

Bad packet length 1349676916.

ssh_dispatch_run_fatal: Connection to UNKNOWN port 0: message authentication code incorrect

Eu verifiquei que este último é exatamente equivalente ao anterior.

Também invokation bash ~/.ssh/get_client_ip.bash client1 22 estabelece conexão com client1 .

Como lidar com o comando proxy contido em um script bash? Devo fazer algo adicional para redirecionar os fluxos de entrada e saída padrão de dentro do script bash fornecido para ProxyCommand ?

Parece que há uma diferença entre o comando de execução no meio do canal, direta ou indiretamente, como parte do script bash.

    
por Orient 08.12.2017 / 11:43

1 resposta

1

Acabei de colocar o script de proxy no lado do servidor (houve basicamente um problema de escape bash) em ~root/.ssh/get_client_ip.bash (ele fornece o IP para CommonName correspondente de openvpn client):

#! /usr/bin/env bash

nc $( awk -F ',' '/^'$( sed 's/\./\&/g' <<< "${1:$3}" )',/ { print $2 }' /etc/openvpn/ipp.txt | awk -F '.' -v OFS='.' '{ print $1, $2, $3, ($4 + 2) }' ) $2

Ou com base em status server-status.log (apenas para clientes realmente conectados):

nc $( awk '/ROUTING TABLE/, /GLOBAL STATS/' /etc/openvpn/server-status.log | head --lines=-1 | tail --lines=+3 | awk -F ',' '/,'$( sed 's/\./\&/g' <<< "${1:$3}" )',/ { print $1 }' ) $2

E um pouco modificado ~user/.ssh/config na minha máquina local:

Host *
    IdentityFile ~/.ssh/id_rsa.user
    IdentityFile ~/.ssh/id_rsa.root
    ForwardAgent yes
    Compression yes
Host server rserver
    HostName server
Host rclient* rserver
    User root
Host client* server
    User user
Host rclient*
    ProxyCommand ssh rserver bash ~root/.ssh/get_client_ip.bash %h %p 1
Host client*
    ProxyCommand ssh rserver bash ~root/.ssh/get_client_ip.bash %h %p 0
Host 172.16.*
    ProxyCommand ssh -T -W %h:%p server
Host 192.168.1.*
    Compression no
    
por 08.12.2017 / 12:29