11

我已将 Ubuntu 16.04 上的 Dante 1.4 配置为 Telegram 的 socks5 代理。

聊天正常,但语音通话不正常,“连接”失败。

为了代理电报语音流量,我需要配置什么特别的东西吗?

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

谢谢!

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

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

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

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

4

4 回答 4

7

使用 socks 代理 UDP 比看起来要复杂一些,所以让我们从头开始。

电报呼叫使用带有 socks 的 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. 服务器将保持 UDP 端口绑定,直到 TCP socks5 连接终止。

如您所见,仅打开一个 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
    
于 2018-04-23T07:29:03.907 回答
5

我有同样的问题。找到了解决方案。 您必须将 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
}
于 2018-04-19T21:36:01.127 回答
2

允许客户的语音流量

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

于 2018-04-19T16:10:30.587 回答
-2

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

于 2018-04-16T16:30:08.123 回答