在http://www.voip-info.org/wiki/index.php?page_id=2716它说“请注意,SSH 隧道不是 VoIP 媒体路径加密的可行方法。”为什么在使用不安全的 VOIP 协议(例如常规 SIP)时不能使用 SSH 隧道(而不是 VPN)进行 VOIP 加密?
答案1
SSH 协议在 TCP/IP 堆栈的 TCP 部分之上运行。SIP 或其他类型的 voip 通常在 UDP 协议之上运行。
TCP 和 UDP 之间的一个显著区别是 TCP(某种程度上)保证每个数据包的交付。而 UDP 则不然。它是“发射后不管”的。其结果是,如果出现网络故障,TCP 将停止并尝试重新发送丢失/损坏的数据包。而使用 UDP,这些数据包将直接丢失。
当您将其应用于 VOIP 时,丢失的 UDP 数据包只会使呼叫者产生乱码。丢失的 TCP 数据包会导致通话过程中出现不一致和烦人的延迟、乱码和其他干扰。
在某些数据包丢失并不严重的应用中,例如 voip 或流音乐或某些类型的流视频或一些其他实时相关的应用,UDP 是完全可以接受的,而 TCP 则提供了不必要的开销和复杂性。
SSH 协议期望无损连接,因为对于它来说,每个数据包对于确保 SSH 连接内部加密数据的完整性都至关重要。
答案2
我认为我们只能猜测作者的意图和目标受众(请记住这篇文章写于 5 年前)。我认为问题在于 SSH 旨在处理 TCP 流而不是 UDP。
尽管我发现通过 SSH 隧道传输 UDP这似乎是一种更复杂的黑客攻击 - 可能对 VOIP 网络来说并不理想。同样,虽然一些 VPN(例如 OpenVPN)可以创建 TCP 隧道,但我认为您会发现大多数人更喜欢 UDP 隧道,因为它们对数据包丢失的容忍度更高。
看看 chTCP 与 UDP 隧道的特点,如果 UDP 隧道丢失了它不关心的数据包,它会丢弃它并期望封装的流(如果是 TCP)或应用程序(如果是 UDP)来处理它。TCP 隧道将尝试重新发送数据包,这可能会突然大幅增加连接的抖动,使 VOIP 连接非常不愉快 - 特别是当端点很远的时候。
答案3
请注意,SSH 隧道不适用于 VoIP媒体路径加密。
强调我的。
媒体流通常在 SIP 呼叫期间使用以下方式进行协商:会话描述协议通常作为双向音频流使用实时传输协议。
摘自维基百科中有关 RTP 的文章:
传输控制协议 (TCP) 虽然已针对 RTP 进行了标准化,但通常不用于 RTP 应用,因为 TCP 更看重可靠性而非及时性。相反,大多数 RTP 实现都基于用户数据报协议 (UDP)。
关于 UDP 和 TCP 之间的差异的其他答案确实适用(尤其是尝试通过 SSH 建立 UDP 隧道),但对 SIP 的影响不如对 RTP 的影响大。SIP 完全能够在 TCP(甚至 SCTP)之上运行。网络的延迟和/或重传可以由传输协议(TCP/SCTP)处理,或者在传输层(UDP)未提供这些功能的情况下,SIP 有自己的重传和超时机制。
但是,您可能也会遇到通过 SSH 路由 SIP over TCP 隧道的问题。这与 SIP 穿越 NAT 并不容易的原因类似。SIP 和 SDP 主体中的许多标头都包含相关的 IP 地址,您可能在隧道中隐式隐藏了这些地址。应用层网关通常在 NAT 场景中处理此问题。
事实上,如果您不小心,您可能最终会通过 SSH 隧道传输 SIP,而根本没有隧道传输 RTP!