Bonjour tout le monde,

ça fait un moment que je travaille sur un site web pour un client et ma dernière mission était d'implementer une fonctionnalité realtime donc j'ai fait appel à NodeJS/Socket.IO.

En locale tout fonctionne à merveille, les clients se connectent et communiquent avec le serveur. Sur le serveur de production c'est different, le client est incappable de contacter le serveur.

Pour tester la connection j'ai créer un simple serveur socket:

var server = require('http').createServer();
var io = require('socket.io')(server);

const PORT = 3000;
io.on('connection', function (socket) {
    console.log('A client Connected');
    socket.on('test',function() {
        console.log('A client sent a message');
        socket.emit('receive');
    });
});

console.log('starting server on port ', PORT);
io.listen(PORT);

Et sur ma page web j'ai inclut Socket.io et et j'utilise ça pour tester la connection:

var socket = io(window.location.origin+':3000');
// = io('https://monsite.exemple:3000');

socket.emit('test');
socket.on('receive',function () {
    console.log('server response');
});

Mais, bien évidemment ça ne fonctionne pas -> Je dois ouvrir les ports de mon serveur;

En utilisant iptables j'ai essayer d'ouvrir le port 3000 mais rien n'y fais, il reste fermer. (J'ai essayer avec d'autre ports, par exemple 2424 mais le problème persiste)

Voici le resultat de iptables -L --line-numbers (voir INPUT ligne 5 et OUTPUT ligne 1)

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    fail2ban-postfix-sasl  tcp  --  anywhere             anywhere             multiport dports smtp
2    fail2ban-pureftpd  tcp  --  anywhere             anywhere             multiport dports ftp
3    fail2ban-dovecot-pop3imap  tcp  --  anywhere             anywhere             multiport dports pop3,pop3s,imap2,imaps
4    fail2ban-ssh  tcp  --  anywhere             anywhere             multiport dports ssh
5    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:3000

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:3000

Chain fail2ban-dovecot-pop3imap (1 references)
num  target     prot opt source               destination
1    RETURN     all  --  anywhere             anywhere

Chain fail2ban-postfix-sasl (1 references)
num  target     prot opt source               destination
1    RETURN     all  --  anywhere             anywhere

Chain fail2ban-pureftpd (1 references)
num  target     prot opt source               destination
1    RETURN     all  --  anywhere             anywhere

Chain fail2ban-ssh (1 references)
num  target     prot opt source               destination
1    REJECT     all  --  (some IP)       anywhere             reject-with icmp-port-unreachable
2    RETURN     all  --  anywhere             anywhere

En utilisant un client en locale (sur la machine de prod); la socket se connecte sans soucis.

Je ne comprends pas comment faire j'espère que vous pourrez m'aider et merci d'avance.

PS: Le site est en HTTPS (les ports 80,443 et sont donc déjà utilisé par apache)
PS2: J'ai fait un coup de /etc/init.d/networking restart sans succès

3 réponses


Arbiter0x
Auteur
Réponse acceptée

J'ai du mal à determiner l'interface de mon reseau; j'utilise google cloud. J'ai finalement reglé mon problème en créeant un second "Compute Engine" (+- un vps) et l'associé a un sous-domaine. Sur ce Compute Engine j'ai lancé le serveur socket sur le port 80. Le problème est reglé =)

Merci beaucoup pour ton aide jeanMat !

Essaye ça
iptables -A INPUT -i eth0 -p tcp --dport 3000

A personnaliser si ton interface réseau n'est pas eth0

sous un distrib de type debian, un simple "ifconfig" te permetra de connaître le nom de ton interface réseau