2015年2月19日星期四

SSL/TLS的原理以及互联网究竟是如何工作的(7) ————IP和他的情人

 
SSL/TLS的原理以及互联网究竟是如何工作的(7)
                                                                             ————IP和他的情人

我:啊呀,情人节到了啊,只可惜我根本就没法过:( 又有段时间没来这里了,大局域网的消息依旧被传得很火热,还有人担心MAC地址会泄露身份,以及一批人不明白前置代理是怎么回事,问题真多啊!

IP:啊,是你啊。情人节快乐!(和一个身份不明的家伙牵着手)

我:情人节不快乐!你旁边那家伙是谁啊?

IP:哈哈,对不起啊,不小心刺激到你了。介绍一下,这是ARP(Address Resolution Protocol,地址解析协议),是我的好伙伴哦,我必须要在他的帮助下才能应对局域网呢。

我:地址解析协议?这家伙和DNS什么关系啊?

IP:他和DNS一点关系都没有,都工作在不同的层上好吧!对了,上次我说会找一些应对NAT的手段[1],我翻阅了一些资料,稍微有了一些眉目:

1,像webRTC的STUN协议[2]那样借助于第三方服务器的帮助,是一种办法,但会造成严重的安全隐患,而且某种意义上破坏了P2P(完全的P2P是不需要第三方服务器的);

2,NAT工作在第三层网络层,实质上是一种代理[3],所以那些工作在网络层之下的VPN们可以轻易刺穿NAT(也就是说常见的PPTP,L2TP,SSTP等工作在数据链路层上的VPN协议工作时不会受到NAT困扰)。当然,其他工作在网络层之下的程序也不会被NAT困扰,P2P软件可以考虑一下。

3,进行端口转发[4],让本来躲在NAT之后的设备变得可见,需要对网关进行设置,让外部设备知道网关地址和对应设备的端口从而建立连接。

我:等一下,IP,为什么说工作在数据链路层的VPN可以轻易刺穿NAT呢?

IP:你觉得这些层在工作的时候是如何互相配合的?

我:流水线的形式?

IP:......对于发起连接的一端来说,是从上到下的洋葱形式:应用层协议先封装好数据,然后交给传输层(咱先讨论一般情况,代理协议这些不算在内)的TCP或UDP,再次封装之后交给网络层,被封装为IP数据报,然后再在网卡驱动的帮助下被封装为帧,最后转变为物理信号发送出去。这一过程实际上就是不断增加头部(帧是有尾部的)的过程,就好象一层层包上洋葱皮一样。而工作在数据链路层的VPN协议则是将数据封装为了特殊的帧,根据帧头部的地址寻址而不是IP地址,那么自然就能轻易穿透NAT了(请注意是虚拟的帧不是物理的帧,物理帧头部的地址还是你的MAC地址)。说起MAC地址......

ARP:咳咳,该我出场了!很多人都以为只需要IP地址就能完成网络通信了,其实不是的,局域网的话是必须要配合MAC地址才能完成点对点的通信。想起来了吗?数据链路层就是负责点对点的通信的[5],而MAC(Media Access Control,介质访问控制)则是数据链路层的一个子层(另一个子层是逻辑链路控制子层),这一层处于软件和硬件的交界处,负责对上层屏蔽物理介质的差异(也就是说,不管你用的是无线还是ADSL还是光纤,上层协议都不用管,怎样都能正常工作)。

我:数据链路层的工作是网卡负责的吧?

ARP:对,网卡驱动发挥了重要作用。顺便说一句,网卡的全名叫做网络接口卡(Network Interface Card),每个网卡都自带一个独一无二的硬件地址,就是MAC地址。MAC地址总共有48位,也就是说可以唯一性标定2^48个设备,迄今为止MAC地址还是很充足的,预计在2100年左右耗尽。[6]

接下来该说说我的工作流程了:首先,我向局域网中所有设备吼一嗓子:“喂,你们当中的谁是这个IP地址的所有者?我需要你的MAC地址!”(广播)然后那个家伙听到了之后就回应:“喂,是我,我的MAC地址是12-34-56-78-9A-BC(IPv4地址是点分十进制,而MAC地址是短线分十六进制)”然后就可以建立连接了!

我:原来是这样。对了,我似乎从来都没有听说过谁因为MAC地址被查水表了,这是怎么回事?照你的说法,MAC地址也是唯一的啊,很多品牌机销售商都会把顾客身份和MAC地址捆绑在一起,这不是可以拿来查水表吗?

ARP:首先,MAC地址是可以手动修改的,百度一下都有一大堆教程[7],就算登记也没用啊:) 啊,你可能比较好奇你访问的网站能不能知道你的MAC地址吧,答案是:没可能知道!因为......

IP:这里该我出场了!你的数据要经过N个路由器才能到达目标网站,而路由器这家伙工作在网络层上:简单来说,路由器的工作流程就是存储——转发:路由器接收到了数据帧,很好!然后就剥离帧头和帧尾,露出IP头,再查看目的地IP地址,接着用动态路由协议算出最短路径(根据hop数和传播延迟以及其他一些参数),然后根据路由表,将数据包重新封装成帧,转发出去。

“剥离帧头和帧尾”,也就是说你的MAC地址这会儿就被过滤掉了,那么经过了N个路由器之后,到达目标网站的数据帧的MAC地址早就不是你的MAC地址了,目标网站上哪知道你的MAC地址去呢?如果是经过代理就更加不用担心了,代理服务器连IP头都修改掉了,还会不修改帧头?

不过在有一种情况下MAC地址存在危险性:Wi-Fi(大名IEEE802.11无线局域网标准),因为在无线局域网之下多台设备是共用一个IP地址的,此时靠广播传播数据(所以此时你的数据很容易被窃取),而接入点会记录下使用者的MAC地址,事后有被定位的可能。

我:这样啊,那我就放心了。

IP:我听你提起很多人不明白前置代理是怎么回事,那么我就再受累解答一下吧:这得先从代理说起。VPN是通过修改系统路由表的方式自动把操作系统内所有数据路由到虚拟网卡上再进行封装的[8],而常见的赛风啊,shadowsocks,Tor,自由门无界,goagent这些就没有那么大的本事了。使用这些翻墙软件时都需要对浏览器设置代理(有的软件已经把这一步自动化了,但是本质并没有改变),这一步究竟有着什么样的意义呢?

我们就以shadowsocks为例吧:shadowsocks启动之后,首先与远程服务器建立连接,同时在本地PC上建立一个local proxy,这个local proxy默认监听本机的1080端口。我们将浏览器代理设置为127.0.0.1 1080(127.0.0.1表示本机),实际上就是强制浏览器发起连接时把数据先交给监听1080端口的local proxy,然后local proxy用自己的协议处理数据,再将处理后的数据发送到远程服务器上,最后远程服务器冒充客户端与目标网站建立连接。

其他需要设置浏览器代理的翻墙软件也是一样的原理,具体过程就是:浏览器——》本机上的local proxy——》远程服务器——》目标网站。

前置代理无非是多了一步而已,以shadowsocks+Tor为例,过程是:浏览器——》本机上的onion proxy(Tor的本机代理,监听端口为9150)——》本机上的local proxy(shadowsocks的本机代理,监听端口为1080,在此之前已经设置好Tor的前置代理是shadowsocks)——》shadowsocks远程服务器——》Tor入口节点——》Tor中间节点——》Tor出口节点——》目标网站

我:也就是说此时我的数据先被Tor协议处理,再被shadowsocks协议处理,所以shadowsocks远程服务器除了我的真实IP和Tor入口节点的IP之外其他什么都不知道,没错吧?

IP:没错,就是这样。在这种情况下前置代理本身的安全性其实无所谓了,不过我还是不推荐国产VPN,因为那个自带的客户端可能会干出扫描硬盘之类的破事外加很多人都报告说国产VPN根本就把Tor节点给屏蔽了[9]。

我:对了,关于webRTC事件,最近有人反映Chrome的webRTC Block扩展失效了,不过我测试发现这扩展还是成功阻止了我的公网IP的泄露的。对于Chrome的粉丝来说,应该怎么办呢?

IP:没有好办法,要么全局禁用JavaScript[10],要么改用firefox吧。Tor Browser是默认禁用了webRTC的,是个不错的选择。对了,期待下次你能带男朋友过来:)

我:(生气的表情)我不需要男朋友!

IP:好吧,不过不管你带不带男朋友,都欢迎你来做客!

科普文链接集合:https://plus.google.com/109790703964908675921/posts/TpdEExwyrVj

参考资料:
1,SSL/TLS的原理以及互联网究竟是如何工作的(6)
                                                                    ——嘿,我是IP!
https://plus.google.com/109790703964908675921/posts/8GLWQxp5yJN
2,破坏匿名的凶手——WebRTC
https://plus.google.com/109790703964908675921/posts/1KjRdwo3jid
3,“在代理人的帮助下,我们来到了自由的互联网”(1)
https://plus.google.com/109790703964908675921/posts/5kWkXKdysQz
4,https://en.wikipedia.org/wiki/Port_forwarding
5,SSL/TLS的原理以及互联网究竟是如何工作的(1)
                                    ————“每个协议生而平等”
https://plus.google.com/109790703964908675921/posts/jew5dx6V2Lt
6,https://en.m.wikipedia.org/wiki/Media_access_control_address
7,http://blog.sina.com.cn/s/blog_62106c8e0100g1cq.html
8,翻墙软件的选择与安全系数(8)
                                                 ————VPN是什么?
https://plus.google.com/109790703964908675921/posts/h7zyq2jvbqY
9,VPN翻墙,不安全的加密,不要相信墙内公司https://plus.google.com/109790703964908675921/posts/AXgoJutf5sz
10,"We Feel Safe in a Dangerous Place"(1)
                                                               ————强大而危险的JavaScript
 https://plus.google.com/109790703964908675921/posts/USnmvAgSas1

没有评论:

发表评论