Reverse SSH tunnel: como posso enviar meu número de porta para o servidor?

11

Eu tenho duas máquinas, cliente e servidor.

O cliente (que está por trás de um firewall corporativo) abre um túnel SSH reverso para o Servidor, que tem um endereço IP publicamente acessível, usando este comando:

ssh -nNT -R0:localhost:2222 [email protected]

No OpenSSH 5.3+, o 0 ocorre logo após o -R significa "escolha uma porta disponível" em vez de chamar explicitamente uma. A razão pela qual estou fazendo isso é porque não quero escolher uma porta que já esteja em uso. Na verdade, existem muitos clientes que precisam configurar túneis semelhantes.

O problema neste ponto é que o servidor não sabe qual Cliente é qual. Se quisermos nos conectar novamente a um desses clientes (via localhost), então como saber qual porta se refere a qual cliente?

Estou ciente de que o ssh relata o número da porta para a linha de comando quando usado da maneira acima. No entanto, eu também gostaria de usar o autossh para manter as sessões ativas. O autossh executa seu processo filho via fork / exec, presumivelmente, para que a saída do comando ssh real seja perdida no ether.

Além disso, não consigo pensar em nenhuma outra maneira de obter a porta remota do cliente. Assim, estou me perguntando se existe uma maneira de determinar essa porta no servidor.

Uma ideia que eu tenho é de alguma forma usar o / etc / sshrc, que é supostamente um script que roda para cada conexão. No entanto, eu não sei como alguém obteria as informações pertinentes aqui (talvez o PID do processo sshd em particular lidando com essa conexão?) Eu adoraria algumas dicas.

Obrigado!

    
por Tom 27.06.2012 / 23:09

5 respostas

4

Uma VPN não seria mais apropriada? O OpenVPN é super simples de configurar. Aqui está uma amostra de configuração e alguns links para guiá-lo pelo processo de criação de certificado:

apt-get install openvpn
mkdir /etc/openvpn/easy-rsa
mkdir -p /etc/openvpn/ccd/client_server
touch /etc/openvpn/ipp.txt
cp -a /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa
source ./vars
./clean-all
./build-ca 
./build-dh
./build-key-server server
cd /etc/openvpn/easy-rsa/keys
openssl pkcs12 -export -out server.p12 -inkey server.key -in server.crt -certfile ca.crt

Em seguida, crie um novo arquivo /etc/openvpn/client_server.conf e coloque o seguinte, alterando o SERVER_IP_ADDRESS conforme apropriado

local SERVER_IP_ADDRESS
port 8443
proto udp
dev tun
ca /etc/openvpn/easy-rsa/keys/ca.crt
pkcs12 /etc/openvpn/easy-rsa/keys/server.p12
dh /etc/openvpn/easy-rsa/keys/dh1024.pem
ifconfig-pool-persist /etc/openvpn/ipp.txt
server 192.168.100.0 255.255.255.0
client-config-dir /etc/openvpn/ccd/client_server
ccd-exclusive
keepalive 10 120
comp-lzo
persist-key
persist-tun
status /var/log/openvpn-status.log
verb 3
reneg-sec 0

Em seguida, crie uma chave por usuário que se conectará e crie o arquivo de configuração no diretório ccd

./build-key-pkcs12 [email protected]
echo "ifconfig-push 192.168.100.2 255.255.255.0" > /etc/openvpn/ccd/client_server/[email protected]

O endereço IP DEVE ser adequado para uma sub-rede / 30 (veja link ), pois há apenas 2 endereços disponíveis (servidor e cliente) por conexão. Então, o seu próximo IP de cliente disponível seria 192.168.100.6 e assim por diante.

Agora você tem IPs estáticos por usuário conectado.

Em seguida, forneça o arquivo the [email protected] para o usuário final e use o seguinte arquivo de configuração

client
dev tun
proto udp
remote SERVER_IP_ADDRESS 8443
pkcs12 [email protected]
resolv-retry infinite
nobind
ns-cert-type server
comp-lzo
verb 3
reneg-sec 0
    
por 28.06.2012 / 13:22
3

Se os clientes tiverem nomes de usuários diferentes, você poderá usar netstat para descobrir em qual porta o usuário sshd processo está escutando. Por exemplo:

% sudo netstat -tlpn | grep 'sshd: mgorven@'
tcp        0      0 127.0.0.1:22220         0.0.0.0:*               LISTEN      5293/sshd: mgorven@
tcp        0      0 127.0.0.1:5120          0.0.0.0:*               LISTEN      5293/sshd: mgorven@
    
por 28.06.2012 / 01:18
3

Você pode alterar o intervalo de portas efêmeras ( /proc/sys/net/ipv4/ip_local_port_range para o Linux) e, em seguida, usar portas alocadas estaticamente fora desse intervalo.

    
por 28.06.2012 / 03:52
2

Eu quero a mesma configuração como você Eu aumentei o nível de log do servidor SSH para o DEBUG, e ele mostrou nos logs qual era a porta local do cliente

por exemplo:

comando do cliente: ssh -N -R0:127.0.0.1:5522 [email protected]

log do servidor:

Jun 30 11:28:59 debsid sshd[27577]: debug1: Local forwarding listening on 127.0.0.1 port 35391

lá você vê o número da porta

    
por 30.06.2017 / 11:38
0

Você deve conseguir extrair as informações relevantes da saída de:

lsof -i tcp

Executar como root.

    
por 28.06.2012 / 01:39