
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/application
para 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, ssh
só será vinculado a portas menores que 1.024 para o root
usuário.
Este é um ótimo caso de uso socat
se 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 80
a 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 sudo
senha.)
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 DNAT
uma regra à OUTPUT
cadeia de nat
tabelas:
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
nat
cadeia:
iptables -t nat -A PREROUTING -d 10.0.0.200 -p tcp --dport 80 \
-j REDIRECT --to-port 8080
onde 10.0.0.200
está 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_config
e definir GatewayPorts clientspecified
ouGatewayPorts 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 -