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.
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:
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).UDP ASSOCIATE
, contenant l'adresse et le port où le client doit envoyer les datagrammes à relayer (section 6).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.
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
}
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
}
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.
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
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
}
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