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,否则就直连。

用Nikola在github上写博客

用blogger写博客一直很不爽,因为它的编辑器实在太烂了,也不能用markup language来写。而很早之前想用Jekyll部署博客到github上,尝试了很久也没有成功,只好放弃了。

最近在 Awesome Python 上看到一组用Python实现的静态页面生成工具,其中就有既支持Markup又支持部署到github的PelicanNikolaTinkerer

简单对比了一下:Tinkerer的插件很少,首先淘汰;Pelican没有直接从blogger导入的插件,淘汰;最终就是Nikola了,能从blogger导入,插件很多,而且名字很喜欢。

开始安装,非常容易,一条命令就完成了,前提是要有Python环境:

pip install nikola

要创建一个目录存放博客,运行下面这个命令,然后回答一堆问题,就完成了。

nikola init blogdir

用下面这个命令创建一篇新文章,文章默认是reStructuredText格式,也可以指定成MarkDown或者其他的。

nikola new_post

本地预览效果的话,需要运行下面这个命令,然后在浏览器里面打开 http://localhost:8000 就能预览到效果了。

nikola auto

预览完成后,就可以发布到github。

nikola github_deploy

很简单。唯一要花时间的就是学习reStructuredText了。

moinmoin不能显示中文名字的网页

Ubuntu 14.04上安装moinmoin 1.9.7后,发现所有名字是中文的维基页面都没法打开。看日志是werkzeug包抛出来的错误。

Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/werkzeug/wsgi.py", line 558, in __call__
    cleaned_path = cleaned_path.encode(sys.getfilesystemencoding())
UnicodeEncodeError: 'ascii' codec can't encode characters in position 4-7: ordinal not in range(128)

Ubuntu自带的werkzeug是0.9.4,把它替换成最新版本后就正常了。替换的方法是先用pip装一个最新的
pip install werkzeug
然后把它的安装路径加到moin.wsgi配置里面:
sys.path.insert(0, '/usr/local/lib/python2.7/dist-packages/')

Shadowsocks的OpenWrt LuCI图形界面

抽空做了一个Shadowsocks在OpenWrt上的图形管理界面,这是我做的第一个OpenWrt模块,第三个lua程序,可能会有很多错误,欢迎大家反馈给我。

这个包的功能包括
  • ShadowSocks配置,支持Socks5代理和重定向两种方式
  • 带CN geoip数据库,供iptable-mod-geoip模块使用
  • 自动重定向所有非中国流量到ShadowSocks代理
  • 自动去除DNS污染
  • 在自动重定向模式下,自定义不需要走代理的国外IP (尚未实现)
  • 手动添加GFW返回的错误IP (尚未实现)
  • 英文、中文本地化(中文尚未实现)


使用方法:

  • 先安装shadowsocks, iptables-mod-geoip, iptables-mod-u32包
  • 下载这个包,并安装。可以在OpenWrt上运行:
  • 打开OpenWrt图形配置界面,在Service->Shadowsocks下可以看到配置界面
  • 前三个打勾,并填写Shadowsocks信息(地址,端口,密码),然后应用就可以了。

下载链接:暂时只有ar71xx架构的包

在HG255D上安装OpenWRT的全自动翻墙方案

一直在用之前的博文《基于OpenWrt路由器的全自动翻墙方案》里描述的方案来翻墙,相当的爽。所以考虑给父母和亲戚朋友家也装上这个方案。遂在淘宝上淘了一个最便宜的支持OpenWrt的路由器HG255D,官方网站openwrt.org上并没有提供它的固件下载,国内一些讨论openwrt的网站提供了它的固件,但是没有提供完整的配套的软件包,只能从其他地方下载软件包。这样会因为kernel版本不匹配导致不能安装kmod包,从而不能实施那个自动翻墙方案。只能开始自己打包自己的固件。

首先是参考了这篇文章《3步定制hg255d的trunk固件》,定制一个固件,带需要的kmod。
1. 下载trunk的ramips的ImageBuilder http://downloads.openwrt.org/barrier_breaker/14.07-rc2/ramips/rt305x/OpenWrt-ImageBuilder-ramips_rt305x-for-linux-x86_64.tar.bz2

2. 解开压缩文件,修改Makefile
tar xjf OpenWrt-ImageBuilder-ramips_rt305x-for-linux-x86_64.tar.bz2
cd OpenWrt-ImageBuilder-ramips_rt305x-for-linux-x86_64
vi target/linux/ramips/image/Makefile
查找255, 有两行和hg255d相关,去掉这两行前面的“#”

3. 运行make创建固件,会生成bin/ramips/openwrt-ramips-rt305x-hg255d-squashfs-sysupgrade.bin,就可以用来刷机了。在原文的基础上需要加上kmod-ipt-u32, kmod-ipt-geoip, iptables-mod-u32, iptables-mod-geoip。

make image PROFILE=HG255D  PACKAGES="arptables base-files block-mount busybox chat comgt curl dnsmasq dropbear firewall hostapd hostapd-common hostapd-utils ip ip6tables ipset iptables iptables-mod-conntrack-extra iptables-mod-filter iptables-mod-ipopt iw jshn kernel kmod-8021q kmod-arptables kmod-ath kmod-ath9k-common kmod-ath9k-htc kmod-brcmfmac kmod-brcmutil kmod-bridge kmod-carl9170 kmod-cfg80211 kmod-crypto-aes kmod-crypto-arc4 kmod-crypto-authenc kmod-crypto-cbc kmod-crypto-core kmod-crypto-deflate kmod-crypto-des kmod-crypto-ecb kmod-crypto-hash kmod-crypto-hmac kmod-crypto-iv kmod-crypto-manager kmod-crypto-md5 kmod-crypto-pcompress kmod-crypto-rng kmod-crypto-sha1 kmod-crypto-wq kmod-eeprom-93cx6 kmod-fs-ext4 kmod-fs-vfat kmod-gpio-button-hotplug kmod-gre kmod-gre6 kmod-ifb kmod-input-core kmod-ip6-tunnel kmod-ip6tables kmod-ipip kmod-ipsec kmod-ipsec4 kmod-ipsec6 kmod-ipt-compat-xtables kmod-ipt-conntrack kmod-ipt-conntrack-extra kmod-ipt-core kmod-ipt-filter kmod-ipt-ipopt kmod-ipt-ipsec kmod-ipt-ipset kmod-ipt-nat kmod-ipt-nathelper kmod-ipt-sysrq kmod-iptunnel kmod-iptunnel4 kmod-iptunnel6 kmod-ipv6 kmod-leds-gpio kmod-lib-crc-ccitt kmod-lib-crc-itu-t kmod-lib-crc16 kmod-lib-textsearch kmod-lib-zlib kmod-llc kmod-mac80211 kmod-mmc kmod-mppe kmod-nfnetlink kmod-nls-base kmod-p54-common kmod-p54-usb kmod-ppp kmod-pppoe kmod-pppox kmod-pptp kmod-rt2500-usb kmod-rt2800-lib kmod-rt2800-mmio kmod-rt2800-soc kmod-rt2800-usb kmod-rt2x00-lib kmod-rt2x00-mmio kmod-rt2x00-usb kmod-rt73-usb kmod-rtl8187 kmod-rtl8192c-common kmod-rtl8192cu kmod-rtlwifi kmod-rtlwifi-usb kmod-sched-connmark kmod-sched-core kmod-scsi-core kmod-scsi-generic kmod-slhc kmod-stp kmod-tun kmod-usb-core kmod-usb-rt305x-dwc_otg kmod-usb-serial kmod-usb-serial-ch341 kmod-usb-serial-ftdi kmod-usb-serial-pl2303 kmod-usb-storage kmod-usb-storage-extras libblobmsg-json libc libcurl libcyassl libevent2 libgcc libip4tc libip6tc libiwinfo libiwinfo-lua libjson-c libjson-script liblua liblzo libmnl libncurses libnfnetlink libnl-tiny libopenssl libpcap libpolarssl libpopt libpthread libreadline librt libstdcpp libubox libubus libubus-lua libuci libuci-lua libusb-1.0 libustream-cyassl libxtables lua luci luci-app-commands luci-app-firewall luci-app-qos luci-i18n-english luci-lib-nixio luci-mod-admin-full luci-proto-3g luci-proto-ipv6 luci-proto-ppp luci-ssl luci-theme-bootstrap mtd netifd openvpn-openssl opkg ppp ppp-mod-pppoe ppp-mod-pptp procd px5g qos-scripts resolveip swconfig tc tcpdump-mini terminfo  ubox ubus ubusd uci uclibcxx uhttpd uhttpd-mod-ubus usb-modeswitch wireless-tools wpa-supplicant wpad zlib kmod-ipt-u32 kmod-ipt-geoip iptables-mod-u32 iptables-mod-geoip kmod-ipt-nat-extra iptables-mod-nat-extra kmod-ipt-nathelper-extra kmod-ipt-tproxy kmod-ipt-lua kmod-ipt-ipp2p kmod-ipt-dnetmap iptables-mod-lua iptables-mod-ipp2p iptables-mod-dnetmap luci-i18n-chinese"

然后就是按照各种论坛的帖子把这个固件刷进去,还缺shadowsocks,从这里下载一个:http://shadowsocks.org/en/download/clients.html (后缀是_ramips_24kec.ipk)。把它拷贝到openwrt上安装就完成了。剩下的就和之前的文章一样了。

http://ch3n2k.com/~czk/openwrt-ramips-rt305x-hg255d-squashfs-sysupgrade.bin
http://ch3n2k.com/~czk/CNgeoip.tar.gz
http://ch3n2k.com/~czk/shadowsocks-libev-polarssl_1.4.6_ramips_24kec.ipk


注 HG255D是Little Endian的架构





基于OpenWrt路由器的全自动翻墙方案

此方案DNS部分已经失效,请参考https://github.com/felixonmars/dnsmasq-china-list

这个全自动翻墙方案有如下特点:

  • 本方案基于路由器,所以任何连接该路由器的主机都可以自动翻墙。
  • 本方案使用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编辑器操作,会最简单的打开编辑保存功能就可以了。

    翻墙方案安装步骤

    • 远程登录OpenWrt路由器。如果不知道如何登录,看之前的第一次登录帮助。
    • 编辑/etc/init.d/dnsmasq文件,在一堆append_bool开始的行中间,加如下这一行:
      append_bool "$cfg" allservers "--all-servers"
    • 编辑/etc/config/dhcp添加如下一行 
              option allservers '1'
    • 编辑/etc/config/network文件,在wan配置(config interface 'wan')中,国外公开DNS服务器(比如8.8.8.8,8.8.4.4,208.67.222.222等)加入DNS 服务器的列表,放在ISP提供的DNS服务器后面(ISP提供DNS可以在/tmp/resolv.conf.ppp 文件中看到),比如:(这里180.168.255.18是ISP提供的DNS。)

      config interface 'wan'
              option peerdns    '0'
              option dns '180.168.255.18 8.8.4.4 208.67.222.222'
    • 重启网络

      # /etc/init.d/network restart
    • 下载安装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
    • 尝试在路由器上运行ss-redir命令,如果打印出一堆帮助信息,说明安装正确了。如果打印出类似下面找不到链接库的错误:

    # ss-redir
    ss-redir: can't load library 'libpolarssl.so.5' 
    这时就需要创建一个符号链接来解决这个问题:

    # cd /usr/lib
    #  ln -s libpolarssl.so.1.3.4 libpolarssl.so.6
    • 配置shadowsocks。编辑配置文件/etc/config/shadowsocks.json,将shadowsocks服务器参数写在这个配置文件里面。修改/etc/init.d/shadowsocks,把所有ss-local替换为ss-redir。
    • 然后重启shadowsocks。
    # /etc/init.d/shadowsocks enable
    # /etc/init.d/shadowsocks restart
    • 安装iptables nat-extra、geoip和u32模块。

    # opkg update
    # opkg install iptables-mod-geoip
    # opkg install iptables-mod-nat-extra
    # opkg install iptables-mod-u32 
    • 生成IP国家信息数据库。在某台Mac或者Linux上下载并解压缩xtables-addons源码,然后按照这篇文档的步骤生成IP数据库。如果不介意较老的数据库,可以直接从这里下载一个生成好的。
    • 将中国的IP信息(CN开始的文件)拷贝到路由器/usr/share/xt_geoip/BE或者/usr/share/xt_geoip/LE。是BE还是LE取决于你的路由器的CPU架构是Big Endian还是Little Endian。如果你不确定你的路由器是什么架构类型,可以两个目录都放进去。
    • 将如下防火墙规则写入 /etc/firewall.user 。前面一半用以将TCP流量重定向到shadowsocks,后面一半用来解决DNS污染。粗体部分替换为你的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 #iOS notification
    iptables -A fuckgfw -t nat -p tcp --dport 1723 -j RETURN #PPTP connection
    #Redirect all others to Shadowsocks
    iptables -A fuckgfw -t nat -p tcp -j REDIRECT --to-port <shadowsocks local port>
    #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 
    iptables -N dnsfilter -t mangle
    iptables -F dnsfilter -t mangle
    iptables -t mangle -I dnsfilter -p udp -m udp -m u32 --u32 "0&0x0F000000=0x05000000 && 22&0xFFFF@16=0x00000000,0x042442b2,0x0807c62d,0x253d369e,0x2e52ae44,0x3b1803ad,0x3cbf7cec,0x402158a1,0x4021632f,0x4042a3fb" -j DROP
    iptables -t mangle -I dnsfilter -p udp -m udp -m u32 --u32 "0&0x0F000000=0x05000000 && 22&0xFFFF@16=0x4168cafc,0x41a0db71,0x422dfced,0x480ecd63,0x480ecd68,0x4a7d2771,0x4a7d7f66,0x4a7d9b66,0x4e10310f,0x5d2e0859" -j DROP
    iptables -t mangle -I dnsfilter -p udp -m udp -m u32 --u32 "0&0x0F000000=0x05000000 && 22&0xFFFF@16=0x80797e8b,0x9f6a794b,0xa9840d67,0xb4a829af,0xc043c606,0xca6a0102,0xcab50755,0xcb620741,0xcba1e6ab,0xcf0c5862" -j DROP
    iptables -t mangle -I dnsfilter -p udp -m udp -m u32 --u32 "0&0x0F000000=0x05000000 && 22&0xFFFF@16=0xd0381f2b,0xd1244921,0xd155e58a,0xd1913632,0xd1dc1eae,0xd35e4293,0xd5a9fb23,0xd8ddbcb6,0xd8eab30d,0xf3b9bb1e" -j DROP
    iptables -t mangle -I dnsfilter -p udp -m udp -m u32 --u32 "0&0x0F000000=0x05000000 && 22&0xFFFF@16=0xf3b9bb27,0xffffffff,0x4a7d2766" -j DROP
    iptables -t mangle -I PREROUTING -m udp -p udp --sport 53 -j dnsfilter
    • 重启firewall
    # /etc/init.d/firewall restart
    • 这时可以测试自动翻墙功能是否工作。可以打开这个网页看看现在IP是不是你的国外ShadowSocks服务器的IP。然后打开这个网页看显示的是不是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 ,功能类似iptables geoip,让目标IP是国外的走上层ShadowSocks,否则就直连。