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