我正在使用 TUNTAP 进行 Python 隧道项目。在 TUNTAP 接口上接收的数据包含原始 IP 数据包,包括所有标头。我可以做两件事之一。
在接收端,我正在用 Twisted 收听。在传出端,我将有一个转储 IP 数据包的原始套接字。在转储数据包之前,程序将源地址与服务器的源地址交换。它还重新计算 TCP 和 UDP 校验和。它还使用以下方法之一交换端口。此信息在 NAT 表中进行跟踪
1)每个用户使用一个端口,例如
US.ER.01.IP:10000 ----> SE.RV.ER.IP:3000 ----> facebook.com:80
US.ER.01.IP:10001 ----> SE.RV.ER.IP:3000 ----> facebook.com:80
US.ER.02.IP:3000 ----> SE.RV.ER.IP:3001 ----> facebook.com:80
如果第二个用户同时请求 1 个 facebook,这会导致问题吗?系统如何知道如何路由 facebook 的回复。它在端口 3000 上传入,因此属于 user1,但它是否被映射回 10000 或 10001?
2)为每个连接使用一个唯一的端口,例如
US.ER.01.IP:10000 ----> SE.RV.ER.IP:3000 ----> facebook.com:80
US.ER.01.IP:10001 ----> SE.RV.ER.IP:3001 ----> facebook.com:80
US.ER.02.IP:3000 ----> SE.RV.ER.IP:3002 ----> remoteHost.com:22
我怎么知道何时从 NAT 表中删除条目?使用这种方法,我可以看到 NAT 表很快填满。对此的解决方案是:
I could wit for FIN packets from the server. This will not work with UDP though.
I could age the NAT entry on each hit. I could then run garbage collection
every N seconds. I see this being an issue if garbage collection runs
and how would a server's delayed response get to the proper host if it gets
deleted from the table.
还有从原始套接字读取的问题。我知道如何发送一个,但是否可以接收单独的 IP 数据包。原始套接字能否在每个 sock.recieve(65535) 调用中接收一个数据包,是否可能接收多个 IP 数据包?
哪种实现最好?我应该注意的任何其他提示或事项?
编辑:
好的,所以我有很多客户。如果您误解了我,则在客户端和自身之间使用 enitre /30。这只是使隧道成为可能的抽象。我也不认为这很重要,但是 websocket 实际上通过 LAN 上的“代理”(IPdata 只是重新打包到一个新的 websocket 中,但是映射是唯一的)。我不想让解释变得如此混乱。我看不出这有什么改变。
Client PC CLIENT PC Client PC----->LAN INTERNET
Client 1: 10.1.1.2 ----> 10.1.1.1 ----> Websocket(IPdata) ----> Browser ---> newWebSocket(IPData) ----> SE.RV.ER.IP
Client 2: 10.1.1.4 ----> 10.1.1.3 ----> Websocket(IPdata) ----> Browser ---> newWebSocket(IPData) ----> SE.RV.ER.IP
Client 3: 10.1.1.6 ----> 10.1.1.5 ----> Websocket(IPdata) ----> Browser ---> newWebSocket(IPData) ----> SE.RV.ER.IP
每个客户端都将其默认路由设置为隧道端点(例如 10.1.1.1)。客户端获取 IP 数据报,将其放入 websocket,将 websocket 发送到 LAN 上的浏览器,然后将其发送到服务器(或者可能是另一个代理)。websocket 内部包含原始 IP 数据报(源为 10.1.1.2 或其他一些内部 IP)。
需要注意的是,服务器从 Internet 接收到包含货物的 websocket 消息(带有私有源地址)。python服务器将如何使用它?自己创建一个新隧道,然后将数据包原始转储到隧道中并适当地路由?
或者也许我可以使用映射?
我如何能够在这个 websocket 链上“映射”隧道抽象?客户端没有通往互联网的路线,但可以访问可以访问互联网的“浏览器”。这似乎与 VPN 隧道的情况相同。抽象如下:
Client 1: 10.1.1.2 ----> 10.1.1.1 ----> Websocket(IPdata) ----> Browser ---> newWebSocket(IPData) ----> SE.RV.ER.IP -> Internet
10.1.2.2------------------------------------------------------------------------------------> 10.1.2.1 ----> Internet
如果您知道任何让我走上正轨的资源,那就太好了!