Shell's Home

关于vpn的一些话

Aug 6, 2015 - 1 minute read - Comments

最近在弄一些关于vpn的事,又在quora上看到了好多关于vpn的问题。(不知为何quora总是推荐让我回答vpn的问题)其中很多问题极其傻,缺少基础性常识,一看就是外行问的。 其实也难怪,vpn的需求,并不只是专业人士有。有位朋友向我咨询vpn问题,他可既不是要翻墙,也不是专业人士。所以我打算把和vpn有关的一些常识写一下,以备咨询。 vpn能做什么? vpn能做什么,取决于你想要他做什么。vpn其实就是一个虚拟的线,连通两个地点,就如同真的接了一根线一般。只不过这个虚拟的线,实际上是由你到对方地点的网络来提供的支持。通常情况下,这么传数据会使得你的数据暴露在网络上。但是vpn里传输的所有数据都经过了加密,你可以认为传输者看不见。 所以,vpn能做什么呢? 有些公司阻止了员工访问很多网络。借助vpn,你可以绕到第三方的网络里去访问哪些网站。其实gfw也是同类情况,只是这家公司更大而已。 有些网络会监听访问,用来做一些对用户不利的事情。例如在国外,使用bt下载很可能会招致版权组织的诉讼。这时可以借助vpn来下载。或者某些公司也会监听用户的数据,例如qq。对于这类情况,你也可以用vpn跳出公司的网络。当然,如果你对这些问题已经有了顾虑,那么就不应当使用国产路由器。大部分国产路由器都会有监控用户数据的行为,很多甚至会修改。 vpn不能做什么? vpn的常规模型,是从用户实际上网的地点“逃逸”到vpn供应商那里。(我们不讨论一些特殊情况)所以,他解决不了一些问题。 例如你的网站没有加密,那么就无法期待vpn来帮你。除非你能让你的所有用户和网站全部连到同一个vpn上(所以访问你的网站前需要先拨vpn)。基于同一个理由,你无法用vpn对抗网站劫持。 同理,如果某个网站未加密,你也无法指望使用vpn保证安全。vpn只能保证守在你家门口的这些人(例如ISP)无法弄到数据。守在服务器门口的人(如果有的话)依然可以获得你和服务器的全部通讯。 vpn分为哪些种类,有什么特点? 一般来说,常见的vpn有这么几种。 pptp。最古典和最通用的vpn。windows里默认内置,搭建和使用都相当容易。但是由于特殊的网络设计,因此有些公司无法使用。而且有安全性隐患。对掌握极大资源的攻击者,内容基本透明。 ipsec+l2tp。windows里内置,大部分公司应当都可以连通(没有故意拦截的话)。对于除美国政府外的截听者,应该都比较安全。 openvpn。复杂和强大,模式多变。需要安装第三方程序,因此并不是很容易用。但是可以跨越大部分公司网络,不会有什么阻碍。安全性很高,也有一些算法可以用来对抗美国政府。由于中国政府的封锁,无法跨越国内外。 sstp。windows自己的协议。只需要一个ssl连接,因此跨越性比openvpn还好。新版windows里应该有内置。 AnyConnect。Cisco的协议,需要安装第三方程序。跨越性和安全性没有实用数据。 简单来说。如果你只是要用而已,并且没有被掌握极大资源的攻击者盯上,而且不是反美国政府。那么哪种方便用哪种。下面是一些系统的兼容性建议: windows: pptp, ipsec+l2tp, sstp linux: openvpn, pptp android: pptp, ipsec+l2tp, openvpn ios: pptp, ipsec+l2tp, anyconnect(似乎这是唯一一个能在ios上非越狱安装的vpn应用) 从上面我们可以看到,pptp其实是兼容性最好的,但是不是所有网络都支持。次之的是ipsec+l2tp。如果还有问题,openvpn应当能够解决你的问题。如果都不行,再考虑其他。sstp仅建议用于只有windows客户端的情况,anyconnect仅建议用于你钱足够多的情况。 所以大部分vpn供应商的协议选择都是pptp/ipsec+l2tp,或者多一个openvpn。这足以应付大部分情况。 这里 是我看到的一个比较全面的,关于vpn之间比较的页面。 使用了vpn,我的网络安全了么? 不一定。如我上面所说,vpn只保证了你家门口的安全。守护在服务器前的人依然可以获得数据。甚至,如果vpn供应商怀有恶意的话,他们也能够获得数据。所以这是一个ISP和VPN供应商,谁更可信的问题。 而且实际情况往往更加复杂。很多数据的获取,并不来源于源IP地址,而是在浏览器里植入了身份相关信息。浏览器的身份相关信息相当敏感,没有他们,你就无法在网站上登录。也因此,这些数据一旦被恶意者获得,他们就能借助你在第三方网站上的身份信息,获得你是谁。 对于这些威胁,vpn都是无能为力的。

ipv6试用手记

Aug 5, 2015 - 1 minute read - Comments

ipv6地址 概要 挑简单的讲吧。 ipv6地址总计128位,分为8个段,每个段16位。hex表示的话,每段最多有四位。在写出ipv6地址的时候,用:分割。所以一个经典的地址写出来是这个样子的: aaaa:bbbb:cccc:dddd:eeee:ffff:gggg:hhhh 这里有两个缩写。一,如果一个数字的开始有连续的0,可以忽略。好比0001和1是一样的。二,如果有多个连续的段是0,可以缩写为::,但是只能缩写一次(这样才能确定一个唯一的地址)。例如以下是一个缩写过的地址。 aaaa:b:c:d::1 这个地址等同于 aaaa:000b:000c:000d:0000:0000:0000:0001 ipv6地址分类 ::/128 未定义 ::1⁄128 回环地址(127.0.0.1) fe80::/10 局部地址 ::ffff:0:0/96 ipv4映射地址 ff00::/8 广播地址(其实更小,不过我的路由表里就是这样写的,全保留给他了) 更多地址请去看wikipedia。 EUI-64地址 简单来说就是通过mac地址的48位,扩充到64位,作为ipv6地址的最后64位。 ipv6地址分配和基本网络设定 ipv6下有两种ip自动分配方案。通常都建议无状态的方案。 dhcp 一种还是经典的dhcp,这种方案分配出来的地址比较紧凑连续,空间利用率高。坏处是ip地址并不唯一固定。在多数情况下dhcp都会尽力分配和上次一样的ip下来。但是在地址池比较满和系统缓存被清理的情况下,并没有保证。 在interfaces里,dhcp的写法大致如下: iface ethX inet6 dhcp slaac 另一个是嫌地址太大的slacc。基本原理就是给一个组织(例如家里)分配一个/64的段,然后用EUI-64(似乎是)给里面的所有设备分ip。所以这样分出来的ip完全一致。 在interfaces里,slaac的写法大致如下: iface ethX inet6 auto dns ipv6里进行配置还需要注意一点,你的DNS需要支持AAAA记录。不然拿着网址查出一个ipv4记录来就很尴尬,还得退化到ipv4去访问。这和直接使用ipv4没什么区别,反而更糟。 实际上,大部分DNS都支持AAAA记录,只是程序会不会默认去查而已。 另一个问题是,如果你的DNS服务器地址是ipv4的,也会使得你无法完全脱离ipv4网络。因此需要一个有ipv6地址的DNS。一般你的ipv6链路供应商会提供一个ipv6的DNS。 firewall slaac使用icmpv6,所以需要在防火墙上打开icmpv6协议的进入。 tunnel breaker he提供一个6to4的tunnel,但是需要你有静态ip地址。(其实凭心而论这真不是一个太高的要求,很多VPS供应商完全可以直接搞一个48的段给自己的机房分64的段)作为普通用户,没有静态地址怎么办?那就只有用vps先接到tunnel,然后再tunnel回家了。 tunnel to he 很容易,配一根6to4的tunnel就好。tunnel breaker的网站上还很贴心的提供了不同系统下的详细配置。 这里特别提一下。HE很贴心的提供了两段地址。一段ipv6是你和HE的隧道地址。另一段地址也会路由给你,这才是你内部应当使用的ip地址群。所以原则上说,你可以在隧道中使用(本来应当在)你和HE之间使用的地址的部分。 tunnel to yourself 先随便打一根二层的隧道。 二层的理由是,如果使用三层隧道,那么隧道本身就需要察知ip。于是ipv6的支持就变成隧道的事了。而二层的隧道并不需要知道上面跑什么协议。 最简单的当然是gre隧道。但是gre隧道需要在远端确定本地ip地址,这和直接打一根tunnel回家没什么区别。 我用的方法是用任何一种二层或三层vpn打到vps上,然后上面再跑gre。这样一举解决了加密和静态地址的问题,顺便还解决了ipv6兼容性的问题。当然,代价也很高。由于是在vpn里套gre,所以头部很大,mtu就要开的比较小。 另一个玩法是用ipsec的tunnel模式打通两个网段,于是gre也可以直接通到vps上(甚至可以直接打ipv6 tunnel)。然而ipsec的tunnel模式需要知道双端ip地址,所以其实还是没有什么用。 顺便吐槽一下routeros的ipsec,实在是太废物了。 当然,也可以用支持ipv6的三层隧道。PPTP都有ipv6支持。当然,我看了一眼,要把ipv6 tunnel回来还是有点问题的。 无论怎么配置,这根隧道要用你和HE之间tunnel的部分地址。例如你和HE的tunnel是这个样子: a:b:c:d::1⁄64 <-> a:b:c:d::2⁄64

程序员交友选择题

Jul 21, 2015 - 1 minute read - Comments

问题 你用过lamp么? 你键盘最左边一列磨损最严重的键是? 你喜欢3p么?为什么? 如果你需要改一张图,电脑里又没有装有关软件,你会怎么做? 答案 没有的就算了吧。 caps lock万岁,其他去死。 python万岁,其他去死。 首先从可信源下载编译好的包,如果没有下载源码安装。 (去商店购买一份ps的去死) (去下载盗版ps的立刻拨打110)

网络值机和无登机牌登记试用手记

Jul 16, 2015 - 1 minute read - Comments

最近要去北京,用的去哪儿订的票。他们(准确说是东航)提供了手机值机和无登机牌登机的功能,我就试了一下。 首先在起飞前会收到一个消息,回复姓名和座位偏好之后,就会自动办理登机手续,并发给一个短信。里面包含安检口,座位号和二维码。 看来这个流程只适用于没有行李的旅客。如果有行李的话,还是要去柜台一趟办理托运。当然,由于我都是随携,所以这部分没有测试。 然后短信会提示你到哪里过安检。我不知道是否是只有这几个安检口才支持,所以我还是老老实实的从指定的安检口(不是所有)过去了。拿手机(当然还要身份证)给他后,他会扫一下,给你一张安检条。 然后等飞机,等了好久,居然还延误了。 到登机的时候,还要在登机口和廊桥口两次检查。登机口是要安检条和手机(二维码),廊桥只要安检条。 其他和持登机牌登机没有区别。 下面感想。 手机值机还是挺方便的。可以预先挑好自己喜欢的座位,而且如果没有托运就不必在柜台愚蠢的排队,节约大家的时间。 安检条不知道是怎么回事,看来是没协调完的缘故。从技术上说,可以将安检信息放在二维码里,过登机口和廊桥的时候直接扫码搞定的。我估计是因为东航是东航,虹桥是虹桥。所以东航的系统打通的再好,虹桥的系统不跟着升级也没用,只能打张安检条来过关。 而且下发短信的信息也有点问题。虽然有使用指引,但是却没有登机口。我居然还要问安检。考虑一下登机牌上有什么信息,把他们都做进去好么? 总体来说还是挺满意的。方便,省事,而且不废纸。

cache和buffer的区别

Jul 11, 2015 - 1 minute read - Comments

不废话,上干货。 根据引用1和2的说法,cache是用来缓存文件的,buffer是用来缓存块设备的。在2.4之前,这俩是独立的,所以很多文件缓存两遍。在2.4之后,两个联起来了,所以一个文件只缓存一遍,这个大小算cache的。 linux通过page cache做所有的文件IO。写的时候,只标记这个cache页面为dirty,一个周期循环的刷写系统会去把这个脏页面刷到磁盘上。而读的返回也在page cache里。如果没有命中,那么就先载入。page cache是一个长期存在的东西,是一个几乎只会增大的怪物。他的唯一回收理由就是系统耗尽内存,需要释放部分来用。 而buffer缓存的是块设备数据。正常来说,这些数据都应该和page cache一致。里面只有部分数据会不在page cache里,例如文件元数据。 http://www.quora.com/Linux-Kernel/What-is-the-major-difference-between-the-buffer-cache-and-the-page-cache http://www.quora.com/What-is-the-difference-between-Buffers-and-Cached-columns-in-proc-meminfo-output

flash禁用教程

Jul 7, 2015 - 1 minute read - Comments

最近flash一堆漏洞,大家禁用了吧。 firefox 附加组件 -> 插件 -> flash -> 禁用 chrome 浏览”chrome:plugins”页面。 找到flash,禁用。 safari Preferences Security Allow Plugins旁边的Website Settings Adobe Flash Player, disable 检测 http://www.bilibili.com/video/av2533651/ 来吐槽的说明你的设置有问题。 PS:注意,youtube已经不使用flash了。 参考 图文教程: http://www.redmondpie.com/disable-flash-in-chrome-firefox-safari-other-web-browsers-to-keep-your-pc-safe-from-vulnerabilities/ (全英文,但是可以看图)

hosts配错导致ldap安装问题一例

Jun 30, 2015 - 1 minute read - Comments

不废话了,要装ldap。 ubuntu下,最简单的方法是修改/etc/hosts,添加自己的域名,例如ldap.shell909090.org。然后安装包的时候,就会使用dc=shell909090,dc=org作为basedn。里面自动添加一个admin。 结果在某机器上,丫硬是一直管自己叫nodomain。 当然,内容可以后改。但是很麻烦。先要删除原始的,添加新的。还有一堆杂七杂八的问题。关键是,为啥TMD这么简单一个问题我居然搞不定。 方法1 绕过。 怎么绕? 经过检查发现,basedn这些东西,其实都是从debconf里读的,而不是直接来自系统。所以我可以重设debconf来修改配置。 echo slapd slapd/domain string shell909090.org | debconf-set-selections echo slapd shared/organization string shell909090.org | debconf-set-selections 然后再安装,就全部正确了。 方法2 为什么? 检查同样发现了本质的原因。如果debconf里没有配,则去读取hostname -d。在一台机器上,这个配置没事,另一台就不行。 经过我反复测试,发现原因是这样的。 hostname -d读取域名的时候,是寻找/etc/hostname对应的域名作为行尾的那行,而不是127.0.0.1所在的那行。。。 而出问题的那台机器,/etc/hosts配置和没问题的那台严格一致。包括机器编号! 谁TM抄卷子把名字也抄了?

婚姻平权——写在美高等法院裁定全美同性婚姻合法边上

Jun 29, 2015 - 1 minute read - Comments

论婚姻 从法律上说,婚姻是一种保证性和生育权的制度。他主要反映了统治阶级是如何看待性和生育权的。例如婚姻双方是否在性上面排他,或者是否对称的排他(女性出轨和男性出轨的后果不一样)。双方如何抚养后代(特别是离婚的情况下),如何界定后代继承权。 婚姻制度在开始的时候,出现的目地主要是两个。 规范性权力。 促进生育。 其实你仔细想,如果不是因为上两个因素,你爱找谁上床生育,关统治者什么事?最远古时期,一男一女两个生娃,恐怕也不会找民政局去登个记什么的吧。但是随着社会制度的形成,尤其是“私产”和“继承”制度的形成,你找谁上床就不是你一个人的事了。想象一下,如果每个地方的土皇帝都占有了所有的女性,那么其他人怎么办?会不会产生战争?如果一个女性和多个男性保持关系,那么谁(注意以前男性占有多数社会资源)应当抚养她的后代? 所以,世界各个地方开始不约而同的出现了婚姻制度。当然,随着各地情况不一样,婚姻制度也千差万别。例如中国允许一个男性占有多个女性,但是其中只有一个拥有完整的权利。其他女性的权利就会有缺损。伊斯兰教似乎也允许多个妻子(据我听说最多四个)。有些被占领区甚至有“初夜权”的说法(参见“勇敢的心”)。 进入近代,婚姻制度主要是双方具有极度亲密的关系,以及由此衍生的各种权利和限制。例如妻子通常是丈夫的保险受益人,而且拥有在丈夫失去意识时做出各种决定(例如医学决定)的权力。当然,如果你误信非人,这点也经常被用来骗取保险。当然,这种制度同样的,也鼓励生育。 然而这对同性爱人来说并不公平,因为生育要求的基础是一男一女。他们认为自己被歧视了,所以他们也希望在法律的架构下分享各种权利。在同性婚姻不合法的前提下,他们无法和他们爱的人共享各种权利,甚至无法参加告别仪式(因为实际拥有权利的人,例如父母,甚至妻子,可以禁止他们前来)。而且很多同性爱人,因为婚姻的理由被迫和异性结婚。这不但造成了同性爱人的悲剧,还会祸及和他们结婚的无辜者。 区分婚姻的定义 我认为应当将“亲密双方共享权利”和“性以及生育”分开,甚至性和生育都应当分开。某个权利或限制,到底是给予“亲密双方”还是“有性关系双方”,抑或是给予“一个孩子的父母”。在今天看来,三者不再完全的等同,而且分别越来越大。 性和生育的关系 今天,男女找谁上床不再和婚姻划上等号。你可以坚持婚前无性,但是你不能强迫所有人结婚后才发生关系。 当然,在很多地区,婚姻对性的纯洁性(尤其是女方纯洁性)的要求还是非常苛刻的。据我所知,很多地方,丈夫发现妻子不纯洁后,可以将她送回娘家。她的父亲或者兄弟为了洗刷耻辱,会将其生生打死。而丈夫发现偷情的妻子,可以私自处以投石的刑罚。国家并不会惩罚凶手。 但是在另一些地方,性已经和婚姻没有什么太大联系了。我的预计是这些地方会越来越多,逐渐扩大。 当然,有一些权利和限制是需要给予性的,例如儿童色情的禁止等。但是这事和婚姻关系不大。 生育和亲密关系的关系 如果你想清楚的话,其实两者没有关系。想的更开一点,你可以管“共同生育”的关系叫做“婚姻”,管“亲密关系”的关系叫做另一个名词。只要你彻底分开两者的权利细节,其实并没有特别的理由去阻碍同性爱人分享权利,承诺责任。 例如,为什么要阻止同性的爱人能够共享关系内财产呢? 又例如,为什么要阻止双方承诺扶养对方的义务呢? 将两者分开后,你会突然发现——为什么要阻止同性婚姻呢?完全没有道理么。非但不需要阻止同性婚姻,而且到底是“嫁”猫“嫁”狗都无所谓(实际上法律意义上说对象必须具有人格)。到底是“娶”男人“嫁”亲爹,其实完全没有必要阻止——这既不体现性,也不体现生育。 但是我比较倾向于认为,既然生育和亲密关系是两回事,那么很多为生育而制定的规定就不应当延续到亲密关系上。这种改变不是把结婚条款中的服务双方必须是一男一女改成可以同性就结束的。 例如有些国家为了鼓励生育,对夫妻婚后的财产税收缴纳有相当的优惠。我不清楚婚后纳税是否完全是为了鼓励生育,但如果有这种成分的话,那么把这种鼓励延续到同性关系上就是不正确的行为。 同性性关系 这节是最复杂和有争议的一节。 把生育和亲密关系分离,其实不是解决问题的终点,而是问题的开始。很多问题,是同性关系中特有的。你要把它在亲密关系中规范,那就对异性婚姻者不适用。所以同性婚姻的出现,必然开始很多对同性性关系的规范。当然,这些也不一定在婚姻法范畴内。 例如鸡奸罪。你不可能允许同性结婚,却宣布鸡奸有罪。我靠,这是在逗我玩么? 又例如强奸。很多国家强奸罪的客体,必须是一男一女,甚至必须是男性对女性。那问题来了。一对亲密关系中的双方,其中一方受到第三方(三者都是同性)的强奸。但是只能以故意伤害论处?或者更夸张的情况。一对男同性爱人结婚,婚后其中一人被一个女色魔强上(好可怕,这比中国的电视剧更荒谬)。对于这种情况,也不能算强奸? 如果不修正这点,恐怕也不是有点荒谬吧。 oh, BTW。美国法律已经规定强奸罪可以是任何性别对任何性别了,所以以上例子仅仅是例子,OK? 我在说什么 开始的时候,我们需要管理一些关于性,生育之类的问题。于是架构师发明了一个叫做“婚姻”的类,在上面附加了规则,事情就结束了。 后来发现,婚姻这东西其实没法满足需求。因为婚姻上的很多规则是生育的,但是有一些同性的couple需要用他。 怎么办呢?拆类呗? 这个重构工作居然持续了20-30年,你们还好意思说程序员慢?

一个有趣的python问题

Jun 24, 2015 - 1 minute read - Comments

quiz 今天在twitter上看到一个有趣的问题。 t = (1, 2, [30, 40]) t[2] += [50, 60] 结果是什么? t = (1, 2, [30, 40, 50, 60]) TypeError 都不是 1,2都发生 出乎意料的,结果是4。 为什么,我们来分析一下。 disassemble >>> t = (1, 2, [30, 40]) >>> def f(): t[2] += [50, 60] >>> import dis >>> dis.dis(f) 以下是结果。 LOAD_GLOBAL 0 (t) LOAD_CONST 1 (2) DUP_TOPX 2 BINARY_SUBSCR LOAD_CONST 2 (50) LOAD_CONST 3 (60) BUILD_LIST 2 INPLACE_ADD ROT_THREE STORE_SUBSCR LOAD_CONST 0 (None)

list.append的性能分析

Jun 17, 2015 - 1 minute read - Comments

在python2.7.5的源码中,list的append操作最终调用的是Python-2.7.5/Objects/listobject.c:266这里的app1(请帮我复核一下,Python的源码有很多隐藏的手脚不容易看见)。 在app1里,使用了list_resize来进行resize,而list_resize间接用到了PyMem_RESIZE。按照我的阅读,这个应该是层层转到realloc上的。 下面就是查glibc源码的事了。我看到的应该是glibc-2.19/malloc/malloc.c:2951这里的__libc_realloc函数。这个函数很长,我大致读了一下。这里分了两个分支。一个是2992行的chunk_is_mmapped。如果我没理解错的话,我们的内存块不可能没有mapped。那么另一个就是2996行的HAVE_MREMAP,这个是编译时宏,我也不知道我的系统上是不是打开的。如果没打开的话,肯定是走alloc,copy,free的流程。 所以我就用strace跟踪了一下,结果确实调用了mremap。 这个函数在linux内核中。我使用的源码是linux-3.2,结果在linux-3.2/mm/mremap.c:535这里。 大致看了一下函数实现。首先试图处理缩小,如果不行的话试图在扩展到最大(vma_to_resize),如果这样还是不行,先试试看能不能追加映射(vma_expandable/vma_adjust)。如果都不行,他还是用的创建并移动的方法。(We weren’t able to just expand or shrink the area, we need to create a new one and move it..)。 所以,总体来说,list.append的复杂度还是O(n)级。但是由于remap的内核实现,因此比直接搬数据应该会快一些。具体表现可能要以测试为准了。 但是这里就有一个疑惑。难道python现在删除了复杂的内存层,将mm管理直接用系统的来支持么?我记忆中python源码解析里讲过python有一个巨复杂无比的内存控制系统。难道全用系统管理了么?对此我查了一下 2.6 / 2.7 的python mm文档。里面倒是明确提到不要同时使用系统api和python api来管理内存。但是并没有明确说明如何处理的实现。但是我在系统里并没有找到第二个实现(debug不算),唯一的实现在Python-2.7.5/Include/pymem.h:76,是直接转到realloc上去的。 貌似在新证据出现前,我得认为python使用的glibc api来处理的mm问题。