netlify

netlify是一个部署静态网站的工具,自动帮你构建网站,把网站静态资源部署到CDN,开启HTTPS等。配合nikola,可以很方便的构建一个博客网站。

KCP快速可靠协议

KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。 参考:KCP

什么是sbrk

sbrk是一个Unix系统调用,用来改变进程数据段的大小,是很多内存分配程序(malloc)的基础之一(另一个是mmap)。 参看: Sbrk

Windows 10下使用OpenVPN

Windows 10发布没有多久,在Windows 10下面使用OpenVPN有一点Tricky。

  1. 这里下载最新OpenVPN Windows版软件。Windows 10一般是用这个版本:Installer (64-bit), Windows Vista and later
  2. 双击安装,默认选项即可。
  3. 将.ovpn配置文件拷贝进C:\Program Files\OpenVPN\config目录中
  4. 从开始菜单上找到OpenVPN GUI程序,不能直接点击打开,要右键点击它,选择用管理员运行(Run as administrator)。托盘上会多出一个OpenVPN图标,右键点击这个图标,选择Connect就可以连上OpenVPN了。连上后,图标会变成绿色。鼠标放在图标上,可以看到通过VPN获得的IP地址。
  5. 从开始菜单上找到Powershell,同样用右键点击,选择用管理员运行。
  6. 在Powershell中运行 Get-NetIPAddress 192.168.202.22,这里192.168.202.22是之前看到的VPN的IP,请替换成你在右下角托盘上看到的IP值。记下输出中的InterfaceAlias后面的字符串,这个例子里是Ethernet 3。网络连接
  7. 最后在Powershell中运行这个命令(请把其中的Ethernet 3替换成前面看到的InterfaceAlias):Set-NetIPInterface -InterfaceAlias "Ethernet 3" -InterfaceMetric 1
  8. 大功告成。连接各种被墙网站测试是否正常。

更新

上面的方法不能持久化,重启后,又要重新运行一遍那个命令才能有效果。能持久化的是下面这种方法:

  1. 按Win-R,输入ncpa.cpl,打开网卡配置窗口
  2. 右键点击VPN对应的网卡(就是上面找到的Ethernet 3),点击属性
  3. 点击Internet Protocol Version 4 (TCP/IPv4),再点属性
  4. 在弹出窗口中,点高级
  5. 最下面有一个Automatic Metric框,去掉框上的勾,然后在Interface Metric的框中写入数字1。

如何加密邮件

这里说的加密是加密邮件内容,端到端加密,而不是指传输加密。传输加密只保证你的邮件客户端到邮件服务器之间是加密的,而邮件服务器的提供商依然可以看到你的邮件,比如你用Yahoo邮箱,Yahoo公司就能看到你的邮件,有人就因此遭殃了。而这里说的加密,是指加密和签名邮件的内容,可以保证:

  • (签名)可以确保收件人收到的你的邮件确实是你发送的,而不是其他人冒充你发送的
  • (签名)可以确保收件人收到的你的邮件内容和你发送的内容是一致嗯,而没有被被其他人篡改过
  • (加密)可以确保只有你指定的收件人才能看到你的邮件内容,其他人不能看到你的内容

加密邮件常用有两套标准,分别是S/MIME和GnuPG。

S/MIME

S/MIME(Secure/Multipurpose Internet Mail Extensions)是一套被广泛支持的标准,在大多数邮件客户端(比如Mac OS Mail和iOS Mail应用)里面都可以直接使用。但使用S/MIME的麻烦之处在于收件人和发件人都需要有个人邮件证书。如果只有发送方有证书,只能发送带签名的邮件,双方有证书才能加密邮件。大多数提供SSL证书的公司都会提供收费的个人邮件证书服务,好在也有免费的选择。Comodo提供有效期一年的免费个人邮件证书。简单填写姓名邮件地址就可以申请,然后有一封邮件发到你的邮箱,里面有下载证书的链接。在需要使用加密邮件的平台上下载安装这个证书。具体的安装方法各个平台不太一样,Mac上面就是双击证书文件就可以了。iOS上也是差不多,最简单的方法但不是很安全的方法就是把这个证书文件发送到手机邮箱上,在邮箱中点击附件就可以导入了。

这样就可以给其他人发送带签名的邮件了。比如在Mac OS Mail中,标题栏左边就有一个勾,表示邮件已经签名,如下图所示。其他平台和邮件客户端也是类似的。

签名邮件

但签名左边的加密按钮确实不可以点的,因为加密需要知道收件人的证书的公钥才可以。所需要做的就是让收件人给你先发一封带签名的邮件。你收到的邮件会有一个Signed的标识,如下图,点击勾勾可以看到发件人的证书。如果证书是可以信任的话,那么会被系统自动安装。然后就可以发送加密邮件了

发件人证书

此时再给对方发信,会发现加密按钮是可以点亮的。

加密邮件

GnuPG

与S/MIME相比,GnuPG不需要去申请证书,可以自己生成证书。但是客户端支持比较差。Mac OS Mail需要安装插件,iOS上只有收费的第三方App支持。另外,Facebook支持你把自己的GnuPG邮件加密公钥放在你的Facebook Profile,这样你的Facebook好友都可以给你发送加密邮件了。Facebook自己的通知邮件也能以加密的形式发送给你。

(未完待续)

预防病毒的正确姿势

前段时间看到这篇文章,深有感触。现在身边很多小白们都在用错误的方法保护自己的计算机和手机,导致他们使用计算机或者手机的时候战战兢兢,不敢安装任何软件,也不敢打开别人给的链接,生怕中了病毒。而计算机也被一堆打着安全保护的旗子的软件拖垮,使用起来像蜗牛一样缓慢。即使这样,还是免不了经常被木马和病毒的侵扰。所以觉得有必要写一篇文章,讲讲预防病毒和木马的正确姿势。

本人从94年开始使用计算机,超过20年的使用经验。曾在DOS时代中过一次病毒(名字忘记了),用F-PROT杀之,此后一直使用杀毒软件预防病毒。但是到了2003年,中了冲击波病毒,此后对如何防病毒有了新的认识,然后就再也没有中过病毒了。以下是我总结出来的六条建议。

卸载安全软件

保护计算机安全是操作系统本身的责任,第三方杀毒软件是防不住病毒的。比如Linux和iOS都没有杀毒软件,也没有被病毒感染的危险。而本人在2003年的时候用Windows计算机,在安装了最新的杀毒软件情况下,也还是受到了冲击波病毒感染。可见杀毒软件对于预防病毒来说,效果是很有限的。而且有些杀毒软件本身就是病毒或者流氓软件,难以卸载或者安插后面,或者杀毒软件厂商本身也在制造病毒木马或者流氓软件,比如最近的卡巴斯基,还有众多国产杀毒软件公司就无须点名了。况且安装了安全软件还有很多坏处,安全软件占用大量内存,拖慢应用的执行速度,因此同样配置的电脑运行Linux总比运行装了杀毒软件的Windows快很多,而卸载杀毒软件后,系统运行速度总是有大幅地提升。

具体做法:

  • 如果已经安装了任何安全软件,卸载它们,包括XX杀毒,XX安全管家,XX安全卫士,XX安全浏览器,XX管家,XX手机卫士,XX手机助手,……
  • 如果是Windows上装了360百度之类的流氓安全软件,恭喜你,正常的官方的卸载程序可能无法彻底卸载它们,它们会在你的系统里面留下后台服务或者驱动程序继续运行。这时你就需要一些特殊的高级的技巧了(进入安全模式、修改注册表、删除隐藏文件等等),还是干脆重装系统吧。

安装最新操作系统补丁

如果操作系统本身有漏洞,其他任何安全措施都挡不住病毒。就像我说过的我中冲击波的经历,就是因为操作系统有漏洞,被远程攻击。那再装上网络防火墙是不是就好了?答案是否定的。操作系统除了有被网络攻击的漏洞外,还可能有其他类型的系统漏洞,比如提权漏洞,可以让普通权限下的病毒或者木马程序获得管理员权限,进而感染系统文件。何况有些服务是用户特意要对外提供,比如文件共享,不能通过网络防火墙关闭。

具体做法:

  • 使用官方还在支持和维护的操作系统,这样才能获得最新的安全补丁。比如,不要使用Windows XP,很古老的Mac OS X和Linux发行版。对于Android手机来说,如果厂商已经放弃你的Android手机型号,不提供最新的安全补丁,那么你也必须马上放弃你的手机,换一部厂商能够继续提供最新安全补丁的手机。
  • 使用官方的更新渠道更新你的系统。Windows上使用系统自带Windows Update功能,Mac上使用App Store,iOS上在系统设置中检查与下载更新,Linux上使用自带包管理器(比如Ubuntu的APT),Android上也使用系统自带的更新功能。不要通过第三方渠道或者工具,比如360之类的软件,来安装系统补丁。
  • 经常检查操作系统有无更新(可以设置自动定时检查更新)。如果有更新,立刻安装更新。不要老是推迟你的Windows安装补丁和推迟重启。不要让你的iOS的“设置”程序右上角总有一个红色的数字1。

只从正规渠道下载安装软件

安装应用软件通常需要管理员权限,如果安装程序被人篡改加入木马或者病毒,那么它就可以绕过操作系统的安全权限,这样可能非常严重的危害。通过正规渠道下载安装软件可以确保安装程序是软件厂商或者作者发布的版本,不是被别人篡改的版本。很多操作系统都有官方的应用市场,官方的应用市场有专人监管,如果有人在官方应用市场中上传病毒或者木马,通常无法通过审核或者会被很快清除。而众多第三方的下载网站以及盗版下载网站则相反,它们充斥着木马与病毒,从这些地方下载是极其危险的。Android的第三方市场上的软件,很多都被篡改,加入了广告,甚至木马和病毒。所以不要使用Android第三方应用市场。也不要使用第三方的安装工具,比如什么什么助手之类的,它们也是同样的问题。

具体做法:

  • iOS平台用App Store安装应用,Android用Google Play安装应用,Mac首先用Mac App Store搜索你需要安装的应用,Linux首先使用系统包管理器搜索应用(比如Ubuntu的APT),Windows 8(或者以上)首先使用Windows Store搜索应用。如果你的Android手机没有自带Google Play应用商店,你可以Google一个叫OpenGapps的东西装上,同时卸载或者禁用手机上的第三方的应用市场。
  • 如果官方市场中搜索不到需要的应用,或者操作系统没有官方市场(比如Windows 7),那么就去软件的官方网站下载。你可以用Google搜索来找到应用的官网。不要用百度搜索,因为通过百度往往找不到官方网站,而把你导向第三方下载地址。不要问我怎么才能打开Google,这个问题请自行Google之……
  • 如果嫌搜索官方网站再下载很麻烦,还可以使用一些可靠的包管理工具,比如Windows上可以用Chocolatey,Mac可以用HomeBrewHomeBrew Cask。它们会帮助你方便地从官方网站下载安装软件。
  • 官方网站下载有时可能会有点慢,可以用一些多线程下载工具加快下载速度,比如multiget之类的。但不要用P2P下载软件,比如迅雷,这些软件会从不信任的第三方下载软件。
  • 尽量不要使用国产的不开源的免费软件,它们的盈利模式通常不健康,要么充满了广告,要么盗取用户隐私,要么捆绑其他软件,要么不能卸载等等。

更新所有软件到最新版本

很多应用软件也会有安全漏洞,这也会导致感染木马,比如用有安全漏洞的微软Office打开别人发送的来的word文档,就可能会中木马。很多浏览器插件可能会有安全漏洞,在浏览恶意网站的时候,轻则可能导致隐私泄漏,重则可能导致操作系统中病毒,比如Adobe Flash插件,各种银行的插件等都可能有安全漏洞。

具体做法:

  • 经常使用软件自带更新功能或者到官方网站更新应用,不要使用第三方工具或者第三方网站下载更新。
  • 卸载或者禁用不常用的浏览器插件。

以非管理员方式登录操作系统

用权限较低的非管理员用户登录系统,即使执行了恶意程序,也可以大大限制恶意程序的危害。为什么Windows比Linux/Mac病毒多很多?一个重要原因就是因为Windows用户通常使用管理员用户Administrator登录。

具体做法:

  • Mac和Linux系统通常已经是非管理员用户登录,不需要做什么。
  • 如果是Windows系统,需要在操作系统控制面板的用户管理中创建一个普通用户,并用这个普通用户登录。需要安装软件或者用管理员权限执行某些程序时,在程序上点击右键,选择以管理员执行。
  • Android和iOS正常情况下都是以普通用户登录运行的。iOS不要越狱。Android不要root。

定时备份

无论如何完备的防范措施,也是无法彻底杜绝系统被病毒和木马感染的可能性。很多时候,系统被病毒感染后,数据也会被破坏,只能从备份恢复。而有些病毒一旦感染,这些病毒是无法或者很难被彻底从系统中清除的,除非重装系统。除此以外,备份还可以避免其他原因引起的数据丢失,比如硬盘损坏,误操作等。

具体做法:

  • 定时进行全盘备份。所使用的备份软件最好支持增量备份,并保留多份备份,这样可以恢复到更早的备份,避免备份中也含有病毒而无法恢复。Mac可以使用Time Machine,Windows也有自带的备份工具。iOS可以选择备份到iCloud或者iTunes,
  • 不仅备份你的操作系统本身,还要备份你的数据。数据比程序更重要,而且数据中也可能藏有木马。
  • 加密你的备份。避免因备份失窃而泄露私密数据。

总结

要避免你的计算机、手机系统被病毒木马和其他恶意软件侵害,不能依靠一个所谓的安全软件,而是要改变你使用它们的习惯,而以上这些是最重要也是比较容易做到的几条建议,希望你也和我一样,用正确的姿势,不再有被恶意程序破坏的担忧,愉快地使用你的计算机和手机。欢迎你在下面的评论中,提出问题、建议或者意见。

ubuntu下安装L2TP VPN服务器

虽然已经有PPTP VPN服务器,但是我的Windows phone只支持L2TP,而且听说L2TP的安全性更好一些,所以打算在VPS上把L2TP装起来。于是Google了很多篇文章(比如, #扶梯# Ubuntu 14.04下安装L2TP微皮恩 Debian/Ubuntu环境下架设L2TP/IPSec VPN 等等),但是最终都没有成功。客户端总是提示服务器没有响应。

于是开始仔细比对配置文件,没有错啊。

是不是Mac的客户端有问题?尝试Windows phone和ipad也不行。

是不是因为家里路由器的原因?尝试3G网络也没有用。

是不是服务器IPSEC端口被墙了呢?在国内服务器上用同样的方法装了也没有用。

开启调试模式,在/var/log/auth.log里面有很多错误信息,但是google这些错误信息都找不到正确的解决办法。

有很多人也有类似问题,但是没有找到解决办法(比如: http://citron.moe/?p=13

一愁莫展的时候,搜索到这样一篇文章: Openswan L2TP / IPSEC / PSK established connection, but no activity on XL2TPD 一试就好了。

这应该是Openswan的版本不同造成的,网上多数文章都描述的老版本的配置方法。新版本需要对配置做一些改动。

浪费了半天时间,休息!

新的基于OpenWrt路由器的(不完全)自动翻墙方案

之前一直在用这篇文章里面的方法配置OpenWRT路由器翻墙, 但是最近伪大的防火墙又升级了,防DNS污染的招不管用了。所以紧急找了下面这个方法,需要一些人工维护工作,不完全自动了。

方案

这个方案使用如下的技术手段:
  • OpenWrt路由器软件
  • Shadowsocks加密Socks5代理
  • iptables geoip模块
  • shadowsocks tunnel转发DNS请求
  • iptables u32或string模块过滤错误的DNS结果(已经失效)
  • dnsmasq带国内CDN列表,这个列表需要经常更新。
  • ChinaDNS-C智能分流DNS请求

特点

这个自动翻墙方案有如下特点:
  • 本方案基于路由器,所以任何连接该路由器的主机都可以自动翻墙。
  • 本方案使用shadowsocks翻墙,速度优于VPN和SSH。
  • 本方案基于目标IP的地理位置,决定是直接连接目标IP还是翻墙连接。对于所有中国IP会直接连接,所以不影响访问国内网站的速度。 即使是根据DNS查询做优化的网站也不会有影响,因为该方案优先使用国内DNS服务器的结果。所有非中国的IP都会选择翻墙连接。 有人觉得这样不是最有效率的因为不是所有国外IP都是被封的,但是我觉得凡是流过GFW的流量,都要翻墙加密才是安全的, 否则就有可能遭遇各种不幸。
  • 这个方案最大优点是可以使你完全感觉不到GFW的存在,这会使你的上网习惯有很大的变化。
  • 缺点是UDP包不能翻墙。这是Shadowsocks的特性决定的。

准备工作

开始前我们需要做的准备有:
  • 在路由器上安装OpenWrt。OpenWrt支持这些硬件。以TP-LINK TL-WDR4300为例, 在硬件列表上可以找到它的链接,点击后有详细的安装步骤。
  • 配置OpenWrt可以正常上网。这里有刚安装进行第一次登录的帮助。 这里有基本配置帮助。
  • 准备一台安装了Shadowsocks的国外服务器。如果没有的话,可以去任何VPS提供商那里买一台廉价的VPS,在上面装上shadowsocks。 安装步骤在这里有。
  • 要会用基本的VI编辑器操作,会最简单的打开编辑保存功能就可以了。

安装步骤

接下来我们开始动手安装
  1. 远程登录OpenWrt路由器。如果不知道如何登录,看之前的第一次登录帮助。

  2. 下载安装ShadowSocks for OpenWrt。在这里(可能需要翻墙才能打开)可以找到源代码和编译好的安装包(只支持部分架构)。比如我的路由器是ar71xx架构,直接下载编译好的shadowsocks-libev-polarssl_1.4.6_ar71xx.ipk就可以了,可以运行:

    wget  http://shadowsocks.org/nightly/shadowsocks-libev-polarssl_1.4.6_ar71xx.ipk
    opkg  update
    opkg  install  libpolarssl
    opkg  install  shadowsocks-libev-polarssl_1.4.6_ar71xx.ipk`
    
  3. 尝试在路由器上运行ss-redir命令,如果打印出一堆帮助信息,说明安装正确了。如果打印出类似下面找不到链接库的错误:

    ss-redir: can't load library 'libpolarssl.so.5'
    

    这时就需要创建一个符号链接来解决这个问题:

    cd /usr/lib
    ln -s libpolarssl.so.1.3.4 libpolarssl.so.6
    
  4. 配置shadowsocks。编辑配置文件/etc/config/shadowsocks.json,将shadowsocks服务器参数写在这个配置文件里面。修改/etc/init.d/shadowsocks,把所有ss-local替换为ss-redir。

  5. 然后重启shadowsocks。

    /etc/init.d/shadowsocks enable
    /etc/init.d/shadowsocks restart
    
  6. 下载中国CDN域名列表,放在/etc/dnsmasq.d/目录下。(如果没有这个目录,先创建它。)

  7. 在/etc/dnsmasq.conf文件中加入如下一行:

    conf-dir=/etc/dnsmasq.d
    
  8. 重启dnsmasq:

    /etc/init.d/dnsmasq restart
    
  9. 创建一个新文件/etc/init.d/ss-tunnel,带如下内容:

    #!/bin/sh /etc/rc.common
    
    START=95
    
    SERVICE_USE_PID=1
    SERVICE_WRITE_PID=1
    SERVICE_DAEMONIZE=1
    
    CONFIG=/etc/shadowsocks.json
    
    start() {
        service_start /usr/bin/ss-tunnel -c $CONFIG -l 5353 -L 8.8.4.4:53 -u
    }
    
    stop() {
        service_stop /usr/bin/ss-tunnel
    }
    
  10. 运行下面这个命令来启动ss-tunnel:

    /etc/init.d/ss-tunnel enable
    /etc/init.d/ss-tunnel start
    
  11. 安装iptables nat-extra、geoip模块。

    opkg update
    opkg install iptables-mod-geoip
    opkg install iptables-mod-nat-extra
    
  12. 生成IP国家信息数据库。在某台Mac或者Linux上下载并解压缩xtables-addons源码,然后按照这篇文档的步骤生成IP数据库。如果不介意较老的数据库,可以直接从这里下载一个生成好的。

  13. 将中国的IP信息(CN开始的文件)拷贝到路由器/usr/share/xt_geoip/BE或者/usr/share/xt_geoip/LE。是BE还是LE取决于你的路由器的CPU架构是Big Endian还是Little Endian。如果你不确定你的路由器是什么架构类型,可以两个目录都放进去。

  14. 将如下防火墙规则写入 /etc/firewall.user 。将TCP流量重定向到shadowsocks。(假设shadowsocks的本地端口是1080)

    iptables -N fuckgfw -t nat
    iptables -F fuckgfw -t nat
    
    #bypass DNS servers
    iptables -A fuckgfw -t nat -p tcp -d 8.8.8.8 -j RETURN
    iptables -A fuckgfw -t nat -p tcp -d 8.8.4.4 -j RETURN
    iptables -A fuckgfw -t nat -p tcp -d 208.67.222.222 -j RETURN
    iptables -A fuckgfw -t nat -p tcp -d 208.67.220.220 -j RETURN
    
    #bypass local connections
    iptables -A fuckgfw -t nat -p tcp -d 192.168.0.0/16 -j RETURN
    iptables -A fuckgfw -t nat -p tcp -d 172.16.0.0/12 -j RETURN
    iptables -A fuckgfw -t nat -p tcp -d 10.0.0.0/8 -j RETURN
    iptables -A fuckgfw -t nat -p tcp -d 127.0.0.0/8 -j RETURN
    
    #bypass iOS notification, PPTP and other connections
    iptables -A fuckgfw -t nat -p tcp -d 17.0.0.0/8 --dport 5223 -j RETURN
    iptables -A fuckgfw -t nat -p tcp --dport 1723 -j RETURN
    
    #Redirect all others to Shadowsocks
    iptables -A fuckgfw -t nat -p tcp -j REDIRECT --to-port 1080
    
    #goto fuckgfw chain if the destination is not China IP
    iptables -A prerouting_rule -t nat -m geoip -p tcp ! --destination-country CN -j fuckgfw
    
  15. 重启firewall

    # /etc/init.d/firewall restart
    
  16. 这时可以测试自动翻墙功能是否工作。可以打开 http://icanhazip.com/ 这个网页,看看现在IP是不是你的国外ShadowSocks服务器的IP。然后打开 http://pv.sohu.com/cityjson 这个网页,看显示的是不是ISP提供的国内IP地址。测试是否能打开facebook和youtube。如果都可以,大功告成!

变化

本方案可以有以下一些变化的方案
  • 可以用SSH Tunnel代替ShadowSocks。优点是国外的SSH服务器更容易找到,缺点是速度不如ShadowSocks。

  • 可以用VPN代替Shadowsocks。优点是UDP也能翻墙,缺点是,速度较慢,配置比较复杂。

  • 可以在ShadowSocks之上架设HTTP Proxy(比如polipo),然后在浏览器和其它应用中手动配置代理翻墙。

  • 可以配置自动代理发现,让浏览器不复杂配置就可以自动翻墙。路由器上添加一个主机名wpad,指向路由器的IP。 在路由器 /www/ 目录下添加一个wpad.dat文件,内容类似:

    function FindProxyForURL(url,host) {
        if( isPlainHostName(host) ||
             isInNet(host, "10.0.0.0", "255.0.0.0") ||
             isInNet(host, "192.168.0.0", "255.255.0.0") ||
             isInNet(host, "127.0.0.0", "255.0.0.0") ||
             dnsDomainIs(host, ".cn")
         )  return "DIRECT;";
         return "SOCKS 192.168.1.1:1080; PROXY 192.168.1.1:3128;";
         //shadowsocks地址和http代理地址
     }
    

    IE、Mac或者iPhone上都可以打开自动代理配置选项来自动发现这个配置。

  • 可以在ShadowSocks和Http代理之间,加一个`smartproxy <https://github.com/ch3n2k/smartproxy>`_,功能类似iptables geoip,让目标IP是国外的走上层ShadowSocks,否则就直连。