web-dev-qa-db-fra.com

Les appels télégrammes via le serveur proxy Dante socks5 ne fonctionnent pas

J'ai configuré Dante 1.4 sur Ubuntu 16.04 en tant que proxy socks5 pour Telegram.

Les discussions fonctionnent, mais les appels vocaux ne le sont pas, échouant à "Connexion".

Dois-je configurer quelque chose de particulier pour pouvoir utiliser le trafic vocal Telegram par proxy?

J'utilise un seul port TCP/UDP non privilégié (> 1024) + login + mot de passe pour la connexion.

Merci!

UPD: C'est un morceau de bûche pendant que j'essaie d'appeler quelqu'un:

Apr 15 23:05:38 (1523736338.510915) danted[22977]: info: pass(1): udp/udpassociate [: username%[email protected] 192.168.1.30.36562

Apr 15 23:08:33 (1523736513.020190) danted[22989]: info: pass(1): udp/udpassociate [: username%[email protected] 192.168.1.30.49065

Je peux répondre à l'appel sur le périphérique de destination, mais la connexion est en boucle et une erreur se produit après 30 secondes.

8
Steve Stifler

La procuration UDP avec des chaussettes est un peu plus complexe qu'il n'y paraît, commençons donc par le début.

Appels télégrammes utilisez UDP avec des chaussettes . Socks5 RFC1928 définit la séquence suivante pour relayer UDP:

  1. Le client instancie une connexion TCP socks5.
  2. Le client envoie une demande UDP ASSOCIATE, contenant l'adresse et le port source du client, qui sera utilisée pour envoyer des datagrammes UDP au serveur socks5. Ils peuvent être des zéros (dans Telegram, ils le sont) (section 4).
  3. Socks5 Server lie un port UDP aléatoire pour relayer les datagrammes pour cette connexion socks5 TCP et envoie une réponse UDP ASSOCIATE, contenant l'adresse et le port où le client doit envoyer les datagrammes à relayer (section 6).
  4. Pour envoyer un datagramme, le client doit ajouter un en-tête à la charge utile, contenant une adresse de destination et un port, où le serveur doit relayer ce datagramme (section 7).
  5. Le serveur maintiendra le port UDP lié jusqu'à la fin de la connexion TCP socks5.

Comme vous pouvez le constater, l’ouverture d’un seul port TCP ne suffit pas. Pour que UDP fonctionne correctement, le port UDP lié automatiquement doit être accessible par le client. Les NAT et les pare-feu pourraient compliquer davantage la situation.

Configuration de relais UDP avec Dante

  1. Les appels de télégramme sont homologue à homologue. La commande udpassociate doit donc être autorisée à 0/0:

    socks pass {
        from: 0.0.0.0/0
        to: 0.0.0.0/0
        # udp.portrange: 40000-45000
        command: udpassociate
        log: error connect disconnect
    }
    
  2. udpreply (pour la retransmission réelle, la 4ème étape ci-dessus) devrait également être autorisé pour tout le monde:

    socks pass {
        from: 0.0.0.0/0
        to: 0.0.0.0/0
        command: udpreply
        log: error connect disconnect
    }
    
  3. Si votre serveur socks5 est derrière un pare-feu, ouvrez une plage de ports UDP (disons 40000-45000) et ajoutez la ligne udp.portrange: 40000-45000 au bloc udpassociate (voir l’exemple mis en commentaire au premier point). Ensuite, Dante lierait les ports UDP uniquement dans cette plage.

  4. Si votre serveur socks5 se trouve derrière un NAT, l'adresse de destination renvoyée dans la réponse à la demande UDP ASSOCIATE serait une adresse IP locale plutôt qu'une adresse externe. Il est peu probable que le client puisse atteindre cette adresse IP locale. Par conséquent, les datagrammes envoyés seraient supprimés en mode silencieux.

    Malheureusement, Dante utilise l'adresse de destination de la connexion TCP comme adresse à laquelle le client doit envoyer les datagrammes UDP (voir le commentaire dans le code source ). NAT modifie cette adresse d'une adresse externe à une adresse locale. Par conséquent, l'hypothèse de Dante selon laquelle le client peut atteindre le proxy en utilisant cette adresse de destination est rompue.

    Une solution possible, qui ne nécessite pas de correctif pour Dante, serait d'utiliser iptables pour changer l'adresse de destination d'une adresse locale à une adresse externe (en supposant qu'elle soit connue et qu'elle ne change pas):

    # 203.0.113.12 – the external IP
    # 1080/tcp - Dante TCP port
    # 40000:45000 – Dante UDP portrange
    iptables -t nat -A PREROUTING -p tcp --dport 1080 -j DNAT --to-destination 203.0.113.12
    iptables -t nat -A PREROUTING -p udp --dport 40000:45000 -j DNAT --to-destination 203.0.113.12
    
    # If external address is not added to any network device on that 
    # machine, then add it to the loopback interface, so the kernel 
    # would know where to route the DNATed packets:
    ip addr add 203.0.113.12/32 dev lo
    
4
KostyaEsmukov

J'ai eu le même problème. Trouvé la solution. Vous devez ajouter udpassociate bindreply udpreply aux commandes conf file voici mon fichier de configuration qui fonctionne avec les appels vocaux.

logoutput: syslog /var/log/danted.log
internal: ip port = 1080
external: ip
socksmethod: username

user.privileged: root
user.unprivileged: nobody


client pass {
from: 0.0.0.0/0 to: 0.0.0.0/0
log: error connect


}
socks pass {
from: 0.0.0.0/0 to: 0.0.0.0/0
command: bind connect udpassociate bindreply udpreply
log: error connect
}
4
dmitry8080

Autoriser le trafic vocal des clients

les chaussettes passent { de: 0.0.0.0/0 à: 0.0.0.0/0 commande: udpreply log: erreur de déconnexion de connexion socksmethod: nom d'utilisateur }

iptables -A INPUT -p udp -m multiport --ports 1024: 65535 -j ACCEPTER