Ubuntu 16.04でDante 1.4をTelegramのsocks5プロキシとして設定しました。
チャットは機能しますが、音声通話は機能せず、「接続」に失敗します。
Telegram音声トラフィックをプロキシするために設定する必要がある特別なものはありますか?
接続に単一の非特権(1024以上)TCP/UDPポート+ログイン+パスワードを使用しています。
ありがとう!
UPD:誰かに電話をかけている間のログの一部:
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
宛先デバイスでコールに応答できますが、接続がループし、30秒後にエラーが発生します。
ソックスを使用したUDPのプロキシーは、見かけよりも少し複雑なので、最初から始めましょう。
テレグラム呼び出し 靴下付きUDPを使用 。 Socks5 RFC1928 は、UDPをリレーするための次のシーケンスを定義します。
UDP ASSOCIATE
リクエストを送信します。これは、socks5サーバーにUDPデータグラムを送信するために使用されます。それらはゼロかもしれません(Telegramではそうです)(セクション4)。UDP ASSOCIATE
応答を送信します(セクション6) 。ご覧のとおり、単一のTCPポートを開くだけでは十分ではありません。 UDPが正しく機能するには、クライアントが自動的にバインドされたUDPポートに到達できる必要があります。 NATとファイアウォールは、状況をさらに複雑にする可能性があります。
テレグラム呼び出しはピアツーピアなので、udpassociate
コマンドは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
(これは実際のリレー用で、上記の4番目のステップです)もすべてのユーザーに許可する必要があります。
socks pass {
from: 0.0.0.0/0
to: 0.0.0.0/0
command: udpreply
log: error connect disconnect
}
Socks5サーバーがファイアウォールの内側にある場合は、UDPポートの範囲(たとえば[40000-45000
])を開き、udp.portrange: 40000-45000
行をudpassociate
ブロックに追加します(最初のコメントアウトされた例を参照してください)ポイント)。その後、Danteはその範囲のUDPポートのみをバインドします。
Socks5サーバーがNATの背後にある場合、UDP ASSOCIATE
要求への応答で返される宛先アドレスは、外部IPアドレスではなくローカルIPアドレスになります。そのローカルIPにクライアントが到達できる可能性は低いため、送信されたデータグラムは静かにドロップされます。
残念ながら、DanteはTCP接続の宛先アドレスを、クライアントがUDPデータグラムを送信する宛先として使用します( ソースコードのコメント を参照)。 NATは、このアドレスを外部アドレスからローカルアドレスに変換します。そのため、クライアントがその宛先アドレスを使用してプロキシに到達できるというDanteの仮定は崩れます。
Danteにパッチを適用する必要のない解決策は、iptablesを使用して、宛先アドレスをローカルから外部に変更することです(既知であり、変更しないと仮定)。
# 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
同じ問題が発生しました。解決策が見つかりました。 udpassociate bindreply udpreplyコマンドをconfファイルに追加する必要があります。これが音声通話で動作するconfファイルです。
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
}
socks pass {from:0.0.0.0/0 to:0.0.0.0/0 command:udpreply log:connect disconnect error socksmethod:username}
iptables -A INPUT -p udp -m multiport --dports 1024:65535 -j ACCEPT