电报通过Dante socks5代理服务器无法正常工作

时间:2018-04-16 10:51:40

标签: proxy telegram socks dante

我已经将Dante 1.4在Ubuntu 16.04上作为电报的socks5代理进行了调整。

聊天正在工作,但语音通话不是,“连接”失败。

为了代理Telegram语音流量,我需要配置一些特殊的东西吗?

我正在使用单个非priveleged(> 1024)TCP / UDP端口+登录+密码进行连接。

谢谢!

UPD:当我试图打电话给某人时,这是一块日志:

pb.setVisibility(View.GONE);
        Picasso.with(getApplicationContext())
                .load(thumbUrl) // thumbnail url goes here
                //.placeholder(R.drawable.progress_animation)
                .resize(width, width)
                .transform(new BlurTransformation(getApplicationContext(), 25, 1))
                .into(imageview, new Callback()
                {
                    @Override
                    public void onSuccess()
                    {
                        pb.setVisibility(View.GONE);
                        Log.e(TAG,"OnSuccess");
                        Picasso.with(getApplicationContext())
                                .load(url) // image url goes here
                                .resize(width, width)
                                .placeholder(imageview.getDrawable())
                                .into(imageview);
                        iv_reDownload.setVisibility(View.GONE);
                    }

                    @Override
                    public void onError()
                    {
                        pb.setVisibility(View.GONE);
                        Log.e(TAG,"OnError");
                        Picasso.with(getApplicationContext())
                                .load(url) // image url goes here
                                .resize(width, width)
                                .placeholder(imageview.getDrawable())
                                .into(imageview);
                        iv_reDownload.setVisibility(View.VISIBLE);
                    }
                });

我可以在目标设备上接听电话但连接正在循环并在30秒后收到错误。

4 个答案:

答案 0 :(得分:4)

我遇到了同样的问题。找到了解决方案。 您必须将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
}

答案 1 :(得分:4)

使用socks代替UDP比看起来要复杂得多,所以让我们从头开始。

电报呼叫use UDP with socks。 Socks5 RFC1928定义了以下用于中继UDP的序列:

  1. 客户端实例化TCP socks5连接。
  2. 客户端发送UDP ASSOCIATE请求,其中包含客户端的源地址和端口,该请求将用于将UDP数据报发送到socks5服务器。它们可能是零(在电报中)(第4节)。
  3. Socks5 Server绑定一个随机UDP端口,用于中继此TCP socks5连接的数据报,并发送UDP ASSOCIATE响应,其中包含客户端应发送要中继的数据报的地址和端口(第6节)。 LI>
  4. 要发送数据报,客户端必须向有效负载添加一个标头,其中包含目标地址和端口,服务器应在该数据报中继该数据报(第7节)。
  5. 服务器将保持UDP端口绑定,直到TCP socks5连接终止。
  6. 如您所见,打开单个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数据报的地址(参见the comment in the source code)。 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
      

答案 2 :(得分:2)

允许客户'语音流量

袜子传递{     从:0.0.0.0/0到:0.0.0.0/0     命令:udpreply     log:connect disconnect错误     socksmethod:用户名 }

iptables -A INPUT -p udp -m multiport --dports 1024:65535 -j ACCEPT

答案 3 :(得分:-2)

您应该在电报设置中通过代理启用呼叫。