web-dev-qa-db-ja.com

Dante socks5プロキシサーバー経由のテレグラムコールが機能しない

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秒後にエラーが発生します。

8
Steve Stifler

ソックスを使用したUDPのプロキシーは、見かけよりも少し複雑なので、最初から始めましょう。

テレグラム呼び出し 靴下付きUDPを使用 。 Socks5 RFC1928 は、UDPをリレーするための次のシーケンスを定義します。

  1. クライアントはTCP socks5接続をインスタンス化します。
  2. クライアントは、クライアントのソースアドレスとポートを含むUDP ASSOCIATEリクエストを送信します。これは、socks5サーバーにUDPデータグラムを送信するために使用されます。それらはゼロかもしれません(Telegramではそうです)(セクション4)。
  3. Socks5サーバーは、このTCP socks5接続のデータグラムを中継するためのランダムなUDPポートをバインドし、クライアントが中継するデータグラムを送信するアドレスとポートを含むUDP ASSOCIATE応答を送信します(セクション6) 。
  4. データグラムを送信するには、クライアントは、サーバーがそのデータグラムを中継する宛先アドレスとポートを含むヘッダーをペイロードに追加する必要があります(セクション7)。
  5. サーバーは、TCP socks5接続が終了するまでUDPポートをバインドしたままにします。

ご覧のとおり、単一のTCPポートを開くだけでは十分ではありません。 UDPが正しく機能するには、クライアントが自動的にバインドされたUDPポートに到達できる必要があります。 NATとファイアウォールは、状況をさらに複雑にする可能性があります。

Danteを使用したUDPリレー設定

  1. テレグラム呼び出しはピアツーピアなので、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
    }
    
  2. udpreply(これは実際のリレー用で、上記の4番目のステップです)もすべてのユーザーに許可する必要があります。

    socks pass {
        from: 0.0.0.0/0
        to: 0.0.0.0/0
        command: udpreply
        log: error connect disconnect
    }
    
  3. Socks5サーバーがファイアウォールの内側にある場合は、UDPポートの範囲(たとえば[40000-45000])を開き、udp.portrange: 40000-45000行をudpassociateブロックに追加します(最初のコメントアウトされた例を参照してください)ポイント)。その後、Danteはその範囲のUDPポートのみをバインドします。

  4. 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
    
5
KostyaEsmukov

同じ問題が発生しました。解決策が見つかりました。 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
}
4
dmitry8080

クライアントの音声トラフィックを許可する

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