浏览器,ftp客户端是主动连接的,你现在相当于被动连接了,所以一般浏览器,ftp客户端的用不了
-------
我的意思是,当外网的机器A想访问内网的资源(比如ftp以及某些限ip的web服务器)的时候,
先和内网的某台机器B建立UDP or TCP链接,然后A发请求给B,B再解析A的请求,访问A所请求的资源,将
数据回传给A。
就是A通过B访问一些资源,
这样的话要求A,B有自己的ftp或者浏览器的软件么?还是B运行象一个代理那样的软件,而在A上设置代理就可以?
采用透明代理技术应该可以解决这个问题。其结构如下图所示:
+-------------+ +--------------------+
| UDP Proxy | <=== NAT Tunnel ===>| Remote UDP Agent |
| ^ | | | | ^ |
|(2)| |(7) | | (3)| |(6) |
| | v | | v | |
| TCP Proxy | | Remote TCP Agent |
+-------------+ +--------------------+
^ | | ^
(1)| |(8) (4)| |(5)
| v v |
+-------------+ +--------------------+
| TCP-Based | | Remote Private |
| Client(s) | | Server(s) |
+-------------+ +--------------------+
其中:
-------------
TCP Proxy:实现TCP透明代理功能。与典型透明代理主要的不同在于:当需要连接Client端请求的远端服务器时,将连接请求发送给UDP Proxy,后面的事情就完全委托UDP Proxy来处理
UDP Proxy:它一方面负责与远端的Remote UDP Agent 建立 NAT Tunnel,同时接收来自TCP Proxy的各种请求,并通过NAT Tunnel与Remote UDP Agent进行数据交换。
Remote UPD Agent:完成来自UDP Proxy的请求,并将请求转发各 Remote TCP Agent;同时将 Remote TCP Agent 的反馈信息转发会UDP Proxy。
Remote TCP Agent:最终与目标服务器建立TCP连接,完成转发代理的最后一步。
数据流:如图。
-------------
实现:
-------------
- TCP Proxy 和 UDP Proxy功能可以集成在一个独立程序中,也可以分别在不同的程序中实现。
前者的好处是开发起来可能更容易一些(也可能更麻烦;-)):两个模块之间可以很容易的实现数据共享;
而后者则保证了系统整体可伸缩性。
如果你这是处于兴趣搞个练习的话,可以考虑方案1;即便如此,也建议在实现前仔细定义这两个模块之间的接口,没准哪天你想把它们分开呢
- Remote UDP Agent 和 Remote TCP Agent 的实现与上面相同。