通过代理实现用mptcp协议与传统服务器交互

背景&原理

De Coninck, Quentin, et al. "Poster: evaluating android applications with Multipath TCP." Proceedings of the 21st Annual International Conference on Mobile Computing and Networking. ACM, 2015.

受上篇文章2.2节using multipath tcp on smartphones的启发,文章中介绍,由于mptcp还处于研究阶段,支持mptcp协议的网站和手机应用屈指可数。虽然所有比较流行的apps都是通过tcp建立客户端和服务端的连接,但是很难在短时间内让他们全都支持mptcp。

为了解决这一问题,也就是在不改动服务端使用普通tcp协议的情况下,使得同时具备蜂窝和无线这两大接口的移动设备可以充分利用mptcp的优势,我们可以在这两者之间建立一个支持mptcp协议的代理服务器。

每当客户端发起tcp连接时,都会首先被重定向到代理服务器上,由代理服务器和传统服务器建立常规的tcp连接。由于代理服务器可以支持mptcp协议,因此,代理服务器作为客户端和服务端的桥梁,使得客户端可以同时使用蜂窝和无线接口利用mptcp协议和传统服务器交互。

文献中使用代理服务器,本文也将介绍代理服务器的安装和配置方法。

由于蜂窝接口的ip和无线的ip不在一个网段内,本文还将介绍路由/网关的端口映射配置方式,使得局域网中的代理服务器可以映射到路由器的公网ip上,使得蜂窝对其可见。

ubuntu下代理服务器服务端配置

安装

ubuntu自带python,但不自带pip,首先安装python-pip

sudo apt-get install python-pip

使用pip安装代理服务器

sudo pip install shadowsocks

配置

创建代理服务器配置文件,路径随意,我是放在/home路径下

cd /home
sudo nano config.json

配置如下

{
"server":"my_server_ip",
"server_port":8388,
"local_port":1080,
"password":"mypassword",
"timeout":300,
"method":"aes-256-cfb"
}

配置说明,以下为带注释的配置说明,实际操作不要带注释

{
"server":"0.0.0.0",  //0.0.0.0代表当前设备的IP
"server_port":8388,  //服务器端口,在0到65535任取,须确定端口没被占用
"local_port":1080,  //本地端端口,socks代理服务器默认端口,同上
"password":"mypassword",  //服务认证时的密码
"timeout":300,  //超时时间(秒)
"method":"aes-256-cfb"  //加密方式,可选"bf-cfb","aes-256-cfb","des-cfb","rc4",等等。默认是一种不安全的加密,推荐用 "aes-256-cfb"
}

赋予配置文件权限

sudo chmod 755 /home/config.json

安装加密方式的支持

sudo apt-get install python-m2crypto

开启代理服务

ssserver /home/config.json

开机自启

编辑/etc/rc.local文件

sudo nano /etc/rc.local

exit 0的上一行加入如下代码

/usr/lacal/bin/ssserver -c /home/config.json

重启服务器,代理服务已经可以自动启动

安卓系统代理客户端配置

http://jingyan.baidu.com/article/95c9d20d4da021ec4f75614a.html

介绍代理客户端的资源太多了,安卓客户端的中文名为,直接下载安装,填写服务器地址,以及在配置服务器时设置的端口,密码,加密方式,就通过右上角的代理开关开启代理服务了。

问题来了,一般实验室计算机家庭计算机都不具备公网IP,蜂窝接口的数据访问不到架设在局域网内的服务器,如何让蜂窝数据也能通过代理?

通过端口映射设置使得局域网内服务器对公网可见

端口映射是NAT的一种,功能是把在公网的地址转翻译成私有地址。端口映射将外网主机的IP地址的一个端口映射到内网中一台机器,提供相应的服务。当用户访问该IP的这个端口时,服务器自动将请求映射到对应局域网内部的机器上。

端口映射过程就如同:你家在某一小区一号楼,你的朋友来找你,找到小区门口,不知道你住在几层,然后问保安,保安查到你的名字然后告诉你在几楼,所以你的朋友很轻松的找到了你的家,在这个过程中,保安通过业主的名字查到业主的门牌号这就是一种映射关系。

当然,端口映射有一个前提,你有修改局域网配置的权限(路由器/网关服务器密码),如果服务器所在局域网的路由/网关还是局域网,还需要进一步向上一级映射,直到映射到公网。

一般路由器都有支持端口映射功能,自行百度,不做赘述。

我们实验室用的是网关服务器,这里介绍一下如何在网关服务器中配置iptables实现端口映射。

http://jingyan.baidu.com/article/c85b7a641af8d8003bac95db.html

和百度经验所描述的情况相似,网关服务器有两张网卡,eth0连外网,ip为x.y.z.w,eth1连内网,ip为192.168.100.1。根据服务端的配置,需要把发往地址x.y.z.w的8388的包转发到ip地址为192.168.100.120(代理服务器的局域网地址)的8388端口,设置如下:

IPTABLES -t nat -A PREROUTING -d x.y.z.w -p tcp -m tcp --dport 8388 -j DNAT --to-destination 192.168.100.120:8388
IPTABLES -t nat -A POSTROUTING -s 192.168.0.0/255.255.0.0 -d 192.168.100.120 -p tcp -m tcp --dport 8388 -j SNAT --to-source 192.168.100.1

还有一点, 在filter表中还应该允许从eth0连接192.168.100.120地址的8388端口:

IPTABLES -A INPUT -d 192.168.100.120 -p tcp -m tcp --dport 8388 -i eth0 -j ACCEPT

现在,处于公网中的设备就可以通过公网ip对已经配置好的服务器享受代理服务了,在客户端中将服务器地址从局域网ip改成公网ip即可。

posted @ 2016-09-18 16:45  bryanting  阅读(1617)  评论(3)    收藏  举报