51

借助树莓派自己写代码突破联通对80端口的封锁

 5 years ago
source link: http://www.freebuf.com/geek/179078.html?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

*本文作者:xutiejun,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。

为了方便管理家里的无线路由器,特意在无线路由器的设置里开通了外网访问功能,但最新发现外网无论如何也无法远程访问无线路由器。刚开始以为无线路由器出现故障,后来经过调查才发现联通封锁了80端口导致无法通过外网访问无线路由器的管理界面。作为一个“程序猿”,本着“编码改变生活”的原则,决定通过编码来突破联通对80端口的封锁。在实现的过程中,也遇到过一些麻烦,分享出来可以使后来人少走弯路。

一、硬件环境:

1.联通宽带(独享公网IP)
2.TPLINK无线路由器
3.树莓派

二、开发思路:

首先在路由器上将树莓派设置为DMZ主机,这样做可以使外网访问到树莓派。然后在树莓派上搭建端口映射服务,使外网对树莓派特定端口的访问映射到无线路由器的80端口。思路如下图。

a6Jveue.jpg!web

三、开发过程:

1 将树莓派设置为DMZ主机

如下图所示。

7nIv6nz.jpg!web

2 将树莓派设置为固定静态IP

有必要将树莓派设置为固定静态IP,这样可以防止树莓派的IP变化。

设置方法如下 图所示。

aUz2imI.jpg!web

3 在树莓派上搭建端口映射服务

本人比较熟悉C++语言,所以本次端口映射服务会用C++语言实现。

简单介绍下端口映射的概念。

端口映射就是将端口映射服务主机的特定端口映射到局域网中另外一台机器上,当用户访问 端口映射服务主机 的特定端口时,服务器自动将请求映射到对应局域网分机。

80端口一般提供的是HTTP服务,下面简单介绍一下HTTP协议。

HTTP是一个属于应用层的面向对象的协议,基于TCP/IP通信协议来传递数据。HTTP协议永远都是客户端发起请求,服务器回送响应。

http协议图如下。

mURbm2b.jpg!web

http请求-响应模型图如下。

RBZVNbI.jpg!web

我设计的端口映射服务的 详细 处理流程如下:

1.树莓派上(192.168.1.101)监听的端口为8081。(不用8080,是因为有时8080也会被查封)
2.当树莓派监听到8081端口有请求时,与路由器(192.168.1.1)的80端口建立TCP连接,并把请求数据原封不动地传递给路由器。
3.当收到路由器的应答消息时,将应答消息原封不动地通过TCP连接传递给请求者。

为了支持多用户同时访问的情况, 当树莓派监听到8081端口有请求时,务必要创建一个新的线程,来执行上面的步骤2和步骤3,这一样就可以多用户同时访问了。

按照上面的思路编码后发现出现了问题。

虽然可以进入登录画面(见下图)。 IrIZnu3.jpg!web

但输入完登录密码,却进不了管理页面,返回如下错误见下图。 NNRZbqu.jpg!web

当时不清楚为什么会这样,决定用wireshark软件对正常访问和异常访问进行抓包进行对比,找出异常点。

通过抓包发现:

正确时,HTTP的HEAD头部情报如下图所示。

yYJNnmF.jpg!web

本次错误时, HTTP的HEAD头部情报如下图所 示。 aMj6raN.jpg!web

对比发现HEAD中的Host字段和Referer字段的情报存在差异。

后来通过一些列的调试,最终发现,Host字段必须是路由器的IP地址,否则访问路由器会出现异常。Referer字段中跳转IP地址必须为路由器的IP,否则访问路由器会出现异常。

所以当端口映射服务收到请求时,需要将 Host字段、 Referer字段中出现的IP地址强制修改为路由器的IP,这就就可以成功访问路由器了。

将端口映射服务的 详细 处理流程修改一下,如下:

1.树莓派上(192.168.1.101)监听的端口为8081。(不用8080,是因为有时8080也会被查封)
2.当树莓派监听到8081端口有请求时,与路由器(192.168.1.1)的80端口建立TCP连接,并把请求数据中Host、Referer字段中的IP强制修改为路由器的IP,再将数据传递给路由器。
3.当收到路由器的应答消息时,将应答消息原封不动地通过TCP连接传递给请求者。

到此整个端口映射服务就可以正常工作了。

整个 端口映射服务 代码已经发到了百度网盘上。

链接: https://pan.baidu.com/s/1UnnyIIGN87GMMRH6Um_a6A 密码: huxt

四、结尾

突破80端口的方法有很多种,虽然本次使用的不是最简单的那种,但通过自己动手解决问题会使自己有很大的成就感 。

最后引用王明阳的一句话与读者共勉。

“知行合一”

*本文作者:xutiejun,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK