UPnP bloqué par le firewall

Bonjour,

L’un de mes services est inaccessible depuis ce matin, la faute à un port non redirigé habituellement par YunoHost via UPnP. En fait, plus aucun des ports utilisés YunoHost n’était ouvert par UPnP. En fait, sauf à être dans le réseau local privé (chez moi), YunoHost ne m’était plus du tout accessible.

J’ai fini par trouver l’origine du problème : le pare-feu iptables empêchait le fonctionnement normal d’UPnP. Mais ce qui est super curieux … c’est la façon de contourner le problème. Voici le scénario :

Vérifier qu’UPnP est bien bloqué

upnpc -l

Si UPnP est bloqué, j’ai :

No IGD UPnP Device found on the network !

Si je désactive le firewall :

yunohost firewall stop
upnp -l
[...]
List of UPNP devices found on the network :
  desc: http://192.168.1.254:5678/desc/root
  st: urn:schemas-upnp-org:device:InternetGatewayDevice:1
[...]

Bref, l’UPnP fonctionne bien sans le firewall.

Quelle règle gêne dans le firewall ?

Attention, c’est du lourd ! :smiley: Voici les règles INPUT :

yunohost firewall reload
iptables -L INPUT --line-numbers 

Me renvoie :

Chain INPUT (policy DROP)
num  target     prot opt source               destination         
1    fail2ban-yunohost  tcp  --  anywhere             anywhere             multiport dports http,https
2    fail2ban-nginx  tcp  --  anywhere             anywhere             multiport dports http,https
3    fail2ban-dovecot  tcp  --  anywhere             anywhere             multiport dports smtp,urd,submission,imap2,imap3,imaps,pop3,pop3s
4    fail2ban-sasl  tcp  --  anywhere             anywhere             multiport dports smtp,urd,submission,imap2,imap3,imaps,pop3,pop3s
5    fail2ban-postfix  tcp  --  anywhere             anywhere             multiport dports smtp,urd,submission
6    fail2ban-pam-generic  tcp  --  anywhere             anywhere            
7    fail2ban-ssh  tcp  --  anywhere             anywhere             multiport dports ssh
8    ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
9    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
10   ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:smtp
11   ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:domain
12   ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
13   ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
14   ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:urd
15   ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:submission
16   ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:imaps
17   ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:xmpp-client
18   ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:xmpp-server
19   ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:63700
20   ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:51413
21   ACCEPT     udp  --  anywhere             anywhere             udp dpt:domain
22   ACCEPT     udp  --  anywhere             anywhere             udp dpt:mdns
23   ACCEPT     all  --  anywhere             anywhere            
24   ACCEPT     icmp --  anywhere             anywhere            

Or si je fais :

iptables -D INPUT 23
iptables -I INPUT 23 -p all -j ACCEPT

Ce qui revient à réécrire la même règle, me semble-t-il, hé bien dans ce cas l’UPnP fonctionne parfaitement.

Si jamais je recharge le firewall via yunohost firewall reload, alors l’UPnP ne fonctionne plus à nouveau.

Il semble donc que la règle ligne 23 soit, par défaut, incorrecte d’une façon ou d’une autre. Mais je ne vois pas bien pourquoi :confused:

Une idée ?

1 Like

En fait non, ce n’est pas “lourd”, en faisant :

iptables -S INPUT

Je peux voir que la règle n°23 ne concerne en fait que l’interface lo:

 -A INPUT -i lo -j ACCEPT

Une solution plus générale est de faire :

iptables -A INPUT -i eth0 -p udp -j ACCEPT

Une solution

Du coup en fouillant un peu sur , j’ai compris qu’en modifiant le fichier /usr/lib/moulinette/yunohost/firewall.py je pourrais ajouter cette règle systématiquement :

rules += [
    "iptables -w -A INPUT -i lo -j ACCEPT",
    "iptables -w -A INPUT -p icmp -j ACCEPT",
    "iptables -w -A INPUT -i eth0 -p udp -j ACCEPT",
    "iptables -w -P INPUT DROP",
]

Et pareil pour IPv6 :

[...]
    "ip6tables -w -A INPUT -i eth0 -p udp -j ACCEPT",

Mais bon, n’y a-t-il pas plus propre ?

1 Like

https://dev.yunohost.org/issues/620

Bonjour, je rencontre toujours cette erreur et relis toujours mon propre tuto sur la même machine pour le même problème, le résout de la même façon, c’est-à-dire en rajoutant les lignes :

"iptables -w -A INPUT -i eth0 -p udp -j ACCEPT",

et :

"ip6tables -w -A INPUT -i eth0 -p udp -j ACCEPT",

aux bons emplacements.

Mais le lien vers l’issue donnée par @data ne fonctionne plus. Comment peut-on suivre l’évolution de ce problème ? Comment peut-on le résoudre une bonne fois pour toute et pour tous les utilisateurs de YunoHost ?

Ma config :

$ sudo yunohost --version
yunohost: 
  repo: stable
  version: 2.7.14.6
yunohost-admin: 
  repo: local
  version: 2.7.7
moulinette: 
  repo: local
  version: 2.7.7
ssowat: 
  repo: local
  version: 2.7.7

Arf je tombe aussi sur ce sujet, devoir accéder en SSH pour régler le soucis me rend un peut frilleux, mais en l’état il n’existe donc pas d’autre solution ?

1 Like

Pas à ma connaissance en tout cas.

Merci de rappeler ce point. Il semble que ce soit assez faisable de corriger ça en fait.

Il faudrait savoir quel port exact en UDP il faut ouvrir

2 Likes

Veuillez m’excuser de parler en anglais:

I have come across this issue and managed to solve it by adding an iptables rule:

iptables -A INPUT -i eth0 -p udp --sport 1900 -j ACCEPT

Note that it is the source port which flags the packets which are relevant, the destination port of 1900 is already open (at least in my case). (My solution may be more general to omit the reference to eth0, I have not tested that).

Following the discussion in the yunohost github issue #620 (note that the URL has changed compared to when same issue was referred to earlier in the thread, but I cannot include a link here, for some reason), I created a file in

/etc/yunohost/hooks.d/post_iptable_rules/001-fix-upnp

with the above iptables script. Having done this, UPNP port forwarding works fine if I do:

sudo yunohost firewall reload
sudo yunohost firewall upnp enable

(I am running on a Raspberry Pi 3, behind a consumer ISP router)

regards
David

3 Likes

The issue is tracked here https://github.com/YunoHost/issues/issues/1463

Thanks, just reinstalled my YunoHost instance to fresh 4.0.8.3 and encountered the issue.

Fixed it with your solution, though not limitating it to eth0:

mkdir -p /etc/yunohost/hooks.d/post_iptable_rules/
echo "iptables -A INPUT -p udp --sport 1900 -j ACCEPT" \
> /etc/yunohost/hooks.d/post_iptable_rules/001-fix-upnp
yunohost firewall reload
yunohost firewall upnp enable