我已经混淆了 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 秒后出现错误。
用袜子代理 UDP 比看起来要复杂一些,所以让我们从头开始。
电报呼叫将UDP与袜子一起使用。Socks5 RFC1928定义了以下中继 UDP 的顺序:
- 客户端实例化 TCP socks5 连接。
- 客户端发送一个
UDP ASSOCIATE
请求,其中包含客户端的源地址和端口,该请求将用于将 UDP 数据报发送到 socks5 服务器。它们可能是零(在电报中它们是)(第 4 节)。 - Socks5 服务器绑定一个随机 UDP 端口,用于中继此 TCP socks5 连接的数据报,并发送
UDP ASSOCIATE
响应,其中包含客户端应发送要中继的数据报的地址和端口(第 6 节)。
要发送数据报, - 客户端必须向有效负载添加一个标头,其中包含目标地址和端口,服务器应在其中中继该数据报(第 7 节)。
- 服务器将保持 UDP 端口绑定,直到 TCP socks5 连接终止。
如您所见,打开单个TCP端口是不够的。要使 UDP 正常工作,客户端必须可以访问自动绑定的 UDP 端口。NAT和防火墙可能会使情况进一步复杂化。
带 Dante 的 UDP 中继配置
-
电报呼叫是点对点的,因此应允许
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
}
允许客户端的语音流量
袜子通过{ 从: 0.0.0.0/0 到: 0.0.0.0/0 命令: udpreply 日志:连接断开连接错误 袜子方法:用户名 }
iptables -A 输入 -p udp -m 多端口 --dports 1024:65535 -j 接受
您应该在电报设置中启用通过代理的呼叫。