Como posso configurar uma porta remota para a frente na porta 80 para o meu localhost com a ajuda de setcap?

7

Eu gostaria de aceitar conexões brevemente para desenvolvimento quando estou com o NAT, e estou tentando fazer isso:

$ ssh [email protected] -R 80:localhost:80

O que falha quando estou tentando vincular uma porta baixa:

Warning: remote port forwarding failed for listen port 80

Então eu descobri que posso fazer setcap 'cap_net_bind_service=+ep' /my/application para permitir que ele ouça portas menores que 1024. Então, eu tenho isso no meu crontab:

@reboot setcap 'cap_net_bind_service=+ep' /usr/sbin/sshd

Mas ainda não está me ligando na porta 80. O que estou fazendo de errado? Eu só vou usar nginx para proxy para 8080 ou iptables ou algo assim, mas ainda estou curioso para saber por que o que eu estava tentando fazer não funcionou.

    
por Kit Sunde 23.06.2012 / 16:21

3 respostas

9

O OpenSSH se recusará a vincular-se a portas com privilégios, a menos que o ID do usuário conectado seja 0 (root). As linhas de código relevantes são:

if (!options.allow_tcp_forwarding ||
    no_port_forwarding_flag ||
    (!want_reply && listen_port == 0) ||
    (listen_port != 0 && listen_port < IPPORT_RESERVED &&
    pw->pw_uid != 0)) {
        success = 0;
        packet_send_debug("Server has disabled port forwarding.");

Fonte: link linhas 1092 -1098

Se você está curioso, pw é do tipo struct passwd * e no linux é definido em /usr/include/pwd.h

    
por 30.07.2012 / 14:41
1

Eu enfrento o problema semelhante, então a solução que acabei é adicionar a regra DNAT à cadeia OUTPUT de nat table:

iptables -t nat -A OUTPUT -d 127.0.0.0/8 -p tcp --dport 80 \
-j DNAT --to-destination :8080

Esta regra efetivamente substitui a porta de destino 80 por 8080 para todos os pacotes tcp gerados localmente.

Se você quiser permitir que qualquer conexão recebida seja encaminhada, adicione uma regra extra à corrente PREROUTING nat :

iptables -t nat -A PREROUTING -d 10.0.0.200 -p tcp --dport 80 \
-j REDIRECT --to-port 8080

em que 10.0.0.200 é o endereço IP da interface que deve encaminhar conexões de entrada para seu serviço da web

    
por 05.12.2013 / 11:14
0

Você também pode adicionar sua chave pública à lista /root/.ssh/authorized_keys. Se você é paranóico, então você vai querer proibir a execução de qualquer comando como root como:

no-pty,no-agent-forwarding,no-X11-forwarding,command="/bin/noshell" ssh-rsa YOUR_PUBLIC_KEY 

Note que o login como root pode requerer a adição de "PermitRootLogin sem senha" em / etc / ssh / sshd_config.

    
por 19.10.2015 / 20:22