我们都熟悉端口转发和NAT的问题:如果你想暴露一些东西来接受一个传入的连接,你需要在路由器上configuration端口转发,或者想出一些其他的黑魔法来“打洞”使用UDP的防火墙什么的。 我对整个“打洞”概念相当陌生,所以有人可以解释它是如何工作的?
从本质上讲,我想了解打孔技术是如何工作的,以及背后的理论,以及如果两个TCP连接可以通过第三方来桥接。 由于使用NAT处理外出 TCP连接没有问题,第三方是否可以桥接连接,以便双方仍然连接,但是没有通过第三方的stream量带宽成本?
这不是一个真正的stackoverflow的东西,但它当然可以做,我已经写了程序来做到这一点。
本质上你有一个程序,我将描述线程化的解决scheme。 两个线程接受(相同的端口,不同的端口,不pipe)。 当两个线程都有连接时,它们进入一个从套接字读取并写入其他套接字的模式。 当一个接收到EOF时,另一个是shutdown(),以便支持半开连接。
简单和容易。
卡尔提出了一个好的观点,我误解了这个问题。 他不希望stream量通过第三方。 那么这是一个可以解决的问题。 如果您有没有源端口映射的出站UDP连接,您可以安排双方发送一个UDP数据包,这将允许来回UDP连接。 在那个UDP通道上运行openvpn之类的东西,你就完成了。
如果你没有UDP连接,那么你只能做到这一点,如果你可以观察到外部stream量(后NAT),并有权访问可以伪造任意数据包的第三方。 那第三方可以伪造双向的SYN-ACK,双方都会认为另一方是服务器。 如果源端口被两个NAT系统改变,则这是行不通的,因为另一方不能确定地找出正确的目标端口来使用。