【发布时间】:2012-11-04 01:03:57
【问题描述】:
我正在使用 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 数据包?
哪种实现最好?还有什么其他提示或我应该注意的事情吗?
编辑:
好的,我有 N 多个客户。如果您误解了我,则使用 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
如果您知道任何能让我走上正轨的资源,那就太好了!
【问题讨论】:
标签: python sockets networking nat