通过端口映射突破防火墙

本文转自: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也可以如此优雅。^_^

代码如下:

 

 

 

好的,关于端口映射防火墙配置,可以按照以下步骤进行: 1. 端口映射 端口映射是将外网的请求通过路由器映射到内网的指定端口上。在应用程序部署在内网服务器上时,需要将部署的端口映射到外网,以供外部用户访问。端口映射需要在路由器上进行设置,具体的操作方式可能会因为不同的路由器品牌而有所不同。一般的步骤如下: - 打开路由器管理页面,登录后进行设置; - 找到端口映射或端口转发设置; - 输入内网服务器的IP地址和需要映射的端口号; - 保存设置后,外部用户就可以通过路由器的公网IP地址和映射的端口号访问内网部署的应用程序了。 2. 防火墙配置 为了保证服务器的安全,需要对服务器上的端口进行防火墙配置,只允许指定的端口进行访问,其他的端口都要进行禁用。防火墙配置需要在服务器上进行设置,具体的操作方式可能会因为不同的操作系统而有所不同。一般的步骤如下: - 打开防火墙配置文件,例如Ubuntu系统上的配置文件为`/etc/ufw/applications.d/appname`,CentOS系统上的配置文件为`/etc/firewalld/zones/public.xml`; - 在配置文件中添加需要开启的端口,例如: ``` [appname] title=Application Name description=Application Description ports=8080/tcp, 3306/tcp ``` - 保存配置后,重新加载防火墙配置,例如: ``` sudo ufw app update appname sudo ufw allow appname ``` 或者 ``` sudo firewall-cmd --zone=public --add-service=appname --permanent sudo firewall-cmd --reload ``` 以上就是一个简单的端口映射防火墙配置的流程,具体的操作可能会因为服务器环境、操作系统等因素而有所不同,需要根据实际情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值