J'aimerais accepter brièvement les connexions pour le développement lorsque je suis NAT, et j'essaie donc de le faire :
$ ssh [email protected] -R 80:localhost:80
Ce qui échoue car j'essaie de lier un port trop bas :
Warning: remote port forwarding failed for listen port 80
J'ai donc découvert que je pouvais faire setcap 'cap_net_bind_service=+ep' /my/application
pour lui permettre d'écouter les ports inférieurs à 1024. J'ai donc ceci dans ma crontab suders :
@reboot setcap 'cap_net_bind_service=+ep' /usr/sbin/sshd
Mais ça ne me laisse toujours pas me lier au port 80. Qu'est-ce que je fais de mal ? Je vais juste utiliser nginx pour proxy vers 8080 ou iptables ou quelque chose à la place, mais je suis toujours curieux de savoir pourquoi ce que j'essayais de faire n'a pas fonctionné.
Réponse acceptée :
OpenSSH refusera catégoriquement de se lier aux ports privilégiés à moins que l'ID utilisateur de l'utilisateur connecté ne soit 0 (root). Les lignes de code pertinentes sont :
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.");
Source :http://www.openssh.com/cgi-bin/cvsweb/src/usr.bin/ssh/serverloop.c?annotate=1.162 lignes 1092-1098
Si vous êtes curieux, pw
est de type struct passwd *
et sous Linux est défini dans /usr/include/pwd.h