通过端口映射突破防火墙

本文转自:http://www.csharpwin.com/csharpspace/2244.shtml

 

 

在我做的项目中,经常遇到一种如下形式的网络结构。

 

出于安全的考虑,server处于防火墙之后,client无法直接访问,只能通过telnet登陆到proxy server上访问。在这种方式下,就无法利用cient上的各种强大的桌面工具(如数据库客户端等),只能通过telnet的命令行形式交互,确实有些不便。

我们可以通过端口映射解决这个问题,实现client到server的"直接访问"。当client想访问server时,只需要与proxy的某个端口建立连接,proxy监听到这个连接后,建立一个与server的连接(client的目标),同时提供这两个连接的消息传输管道。这样,所有client发到proxy的消息都发送到了server上,server的消息也发送到了proxy上,从而实现了client到server的访问。

由于连接的数目可能较多,并且proxy程序起着一个消息中转的作用,因此程序本身需要较高的socket通信效率,所有的操作都不能阻塞,否则严重影响其它的进程通信,因此程序中的socket的连接,通信方式都必须采用异步操作。(多线程的方式如果连接的进程较多时则开销太大)。

这种方式十分简单有效,并且不需要对客户端和服务器端做任何修改。不足的地方有如下几处:

  1. proxy需要中转所有的消息,负荷较大。(不过处理目前的几十个客户端应用是绰绰有余,并且目前的通信瓶颈一般在internet上)
  2. 需要在proxy上建立端口监听,并且所监听的端口需要能被client直接访问,这种情况的网络很多时候得不到满足。(大多时候proxy只开放了几个有限的端口,并无多余的端口让端口映射程序绑定)

本来我用C#写了一个,程序非常简单,这里就不拿出来了。

后来由于要把这个程序放到Unix服务器上长期运行,我就用C++重写了一下,最初我是用socket api写的,可程序的可读性总是不尽人意,后来就改用了asio库(asio 0.3.8 rc3,与早期的asio库不兼容),通过boost的asio,function,smart_ptr这几个库的运用,一个C++版的端口映射程序便诞生了,精简、高效、安全、跨平台,原来c++下的异步socket也可以如此优雅。^_^

代码如下:

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值