Como posso configurar um encaminhamento de porta remoto na porta 80 para meu host local com a ajuda do setcap?

Como posso configurar um encaminhamento de porta remoto na porta 80 para meu host local com a ajuda do setcap?

Gostaria de aceitar conexões brevemente para desenvolvimento quando estiver usando NAT e, por isso, estou tentando fazer isso:

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

O que falha porque estou tentando vincular uma porta muito baixa:

Warning: remote port forwarding failed for listen port 80

Então, descobri o que posso fazer setcap 'cap_net_bind_service=+ep' /my/applicationpara permitir que ele escute portas inferiores a 1024. Então, tenho isso em meu suders crontab:

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

Mas ainda não me permite vincular na porta 80. O que estou fazendo de errado? Vou apenas usar o nginx para fazer proxy para 8080 ou iptables ou algo assim, mas ainda estou curioso para saber por que o que estava tentando fazer não funcionou.

Responder1

Conforme explicado em @dwurf'sresposta aceita, sshsó será vinculado a portas menores que 1.024 para o rootusuário.

Este é um ótimo caso de uso socatse você não estiver root.

Primeiro, faça um encaminhamento remoto para a porta 8080(ou qualquer outra porta permitida) da máquina remota:

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

Em seguida, na máquina remota, mapeie porta 80a porta 8080:

sudo socat TCP-LISTEN:80,fork TCP:localhost:8080

Notas:

Conforme sugerido por Dirk Hoffman, esses dois comandos podem ser combinados em uma única linha:

ssh -t [email protected] -R 8080:localhost:80 sudo socat TCP-LISTEN:80,fork TCP:localhost:8080

(Isso -té necessário caso você precise de um terminal interativo para inserir sua sudosenha.)

Responder2

O OpenSSH recusará categoricamente a ligação a portas privilegiadas, 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:http://www.openssh.com/cgi-bin/cvsweb/src/usr.bin/ssh/serverloop.c?annotate=1.162linhas 1092-1098

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

Responder3

Eu encontro um problema semelhante, então a solução que encontrei foi adicionar DNATuma regra à OUTPUTcadeia de nattabelas:

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

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

Se você deseja permitir que qualquer conexão de entrada também seja encaminhada, adicione uma regra extra à PREROUTING natcadeia:

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

onde 10.0.0.200está o endereço IP da interface que deve encaminhar as conexões de entrada para o seu serviço web

Responder4

Elaborando a proposta de solução deBen Maresacima,

abaixo está um forro que:

abre dois encaminhamentos de porta remota:
1. porta remota 8888 para a porta local 80
2. porta remota 8443 para a porta local 443

na máquina remota, socat conecta qualquer coisa
1. chegando na porta 80 para ser transmitido para a porta 8888
   , que é então encapsulado para a porta 80 do host local
2. chegando na porta 443 para ser transmitido para a porta 8443,
   que é então encapsulado para a porta 443 do host local

ssh -t -i ~/.ssh/id_rsa \
    -R 0.0.0.0:8888:0.0.0.0:80 \
    -R 0.0.0.0:8443:0.0.0.0:443 \
    remoteUser@remoteMachine \
    -- "(sudo socat TCP-LISTEN:80,fork TCP:localhost:8888) & \
        sudo socat TCP-LISTEN:443,fork TCP:localhost:8443"

então, se você executar o comando, deverá fornecer sua senha de root da máquina remota (para poder listar nas portas 80/443) e depois (desde que o túnel esteja estabelecido) qualquer coisa que chegue na porta 80 ou 443 do host remoto, será encapsulado nas portas 80 ou 443 da sua máquina local, respectivamente...

lembrar!!

para poder vincular todas as interfaces de rede (0.0.0.0), você deve editar suas máquinas remotas /etc/ssh/sshd_confige definir GatewayPorts clientspecifiedouGatewayPorts yes

você pode verificar isso na máquina remota netstat -tlpn | grep -E '8888|8443'que deve mostrar:

tcp        0      0 0.0.0.0:8888            0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:8443            0.0.0.0:*               LISTEN      -

e não

tcp        0      0 127.0.0.1:8888          0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:8443          0.0.0.0:*               LISTEN      -

informação relacionada