我们都熟悉端口转发和 NAT 的问题:如果您想要将某个东西暴露给接受传入连接,则需要在路由器上配置端口转发,或者使用 UDP 等其他黑魔法在防火墙上“打洞”。我对整个“打洞”概念还不太熟悉,有人能解释一下它是如何工作的吗?
本质上,我想了解打洞技术是如何工作的,背后的理论是什么,以及两个 TCP 连接是否可以通过第三方桥接。由于传出TCP 连接由于是用 NAT 处理的,第三方是否可以桥接连接以便双方仍然连接,但没有通过第三方的流量带宽成本?
答案1
这实际上不是 stackoverflow 的事情,但它肯定可以做到,而且我已经编写了程序来做到这一点。
本质上你有一个程序,我将描述线程解决方案。两个线程接受(相同端口,不同端口,等等)。当两个线程都有连接时,它们进入一种模式,从其套接字读取并写入另一个套接字。当一个收到 EOF 时,另一个将关闭(),以便支持半开连接。
簡單又容易。
Karl 指出我误解了这个问题,他的观点很正确。他不希望流量通过第三方。好吧,这是一个可以解决的问题。如果您有出站 UDP 连接而没有源端口映射,则可以安排双方发送 UDP 数据包,然后允许来回进行 UDP 连接。在该 UDP 通道上运行类似 openvpn 的程序,一切就绪了。
如果您没有 UDP 连接,那么实际上只有当您能够观察外部流量(NAT 后)并能够访问可以伪造任意数据包的第三方时,您才能做到这一点。该第三方可以双向伪造 SYN-ACK,并且双方都会认为对方是服务器。如果两个 NAT 系统都更改了源端口,则此方法不起作用,因为另一方无法确定要使用的正确目标端口。