我的emacs配置组织

好久都没进行这一方面的整理,找了一下,之前的那个emacs配置 模式还是在5年前,其实, 这个配置方式我用了至少4年的样子,直到去年初才换了一种方式。

之前的那个配置的主要缺点是不容易同步,比如我现在基本上要在这些环境的电脑中运行:

系统 CPU
Ubuntu(GUI) X86
Ubuntu(CMD) ARM/X86
CENTOS(CMD) X86
Win XP X86
Win 7(本地或远程) X86
MAC X86

系统不算多,但关键是个数多,比如光Ubuntu,不同的位置加起来也有10多个了,总不能每 个都去配置,时间长了,不同的电脑上的配置或多或少都有差别,而且,即使一个单独的配 置,一个压缩包都快接近100MB了,更何况还要维护每个插件的更新,于是我决定更新我的 配置管理了。

继续阅读我的emacs配置组织

亚马逊主机被墙的一些反思

今天发现的亚马逊主机被墙,后来思考了一下,考虑从技术处识别的破绽,觉得原来的方案 有问题,特记录如下,以作教育。

在这台主机上, 主要开通了下面的服务:

服务 端口 备注
openvpn 10122  
ssh 22 远程登录
dns 10153 仅支持持tcp查询
shadowsocks 8080 用于翻墙

关于openvpn服务

所有的客户端不会主动连接这个服务,我在国内主机上创建了一个到这个服务器上的ssh代 理连接,连接到国内的服务器上,所有客户端使用代理的方式,连接到远程主机上,这个很 少用,流量也不大,因此问题可能不大。我曾经考虑过由远程主机主动发起,但openvpn的 客户端似乎有问题,反正没成功,不了了之了。

ssh服务不用说了,一般不会因为这个封吧。

shadowsocks服务采用的是aes-256-fb,自定义密码,应该也没问题。

剩下的就是dns了,在很早之前,我用的是韩国的dns,然后有一天发现韩国的dns不返回任何 内容了,而这个dns没有打开ICMP,因此无法ping成功,不返回任何有用的查询说不定是因 为被墙了。然后我就用了一段时间的google dns,问题在于google 的dns速度太慢了(其实 我的这个理解是错误的,使用google dns的时候其实是走了代理的)。后来考虑速度,就在 亚马逊的主机上添加了pdnsd的服务,然后本地的pdnsd指向这个服务器。大概用了一个月的 样子,被封了。

在所有的流程中,除了pdnsd的查询没有被加密外,其他的内容都是被加密的,而tcp dns的查询, 无论是从特征识别还是关键字过滤,都是可以被发现的,因此被墙也就不难理解了。

netgear R7000 shadowsocks客户端

各种不爽,最近拿到款netgear r7000路由器几个月,竟然无法翻墙。

第三方dd-wrt,刷了之后却无法安装软件,等于废了120%,还各种不稳定。 至于openwrt,不用提了,满脸伤心泪,早知道当初就弄个openwrt列表中的了。 后来实在受不了openwrt raspberry pi的各种问题(虽然最后有可能是个伤心的误会),决 定试试tomato了。刷了之后,还是一堆问题,最后却没办法直接刷回去了。

既然tomato也是开源的,那就找找源代码吧,结果竟然找到了完整的源代码,感谢shibby

我之前也找了dd-wrt源代码,由于不在官方列表中,各种不爽,各种缺失,最后不了了之。 在和GFW的激烈战斗中,终于下完整了所有源代码。首先编译检查,没有任何问题。我并不 想将shadowsocks编译到固件中,这样不利于更新,因此,我决定放到jffs2中。

结果与使用方法

shadowsocks客户端 将jffs挂载到opt下,我的这个版本的选项在Administration->JFFS中,对tomato不熟悉, 没有发言权,enable JFFS, 然后format/erase, 填入”当挂载的时候执行命令”以下内容

mount -o bind /jffs/opt /opt && /opt/bin/start_cron.sh

start_cron.sh在压缩包的bin目录下,之所以这样弄是为了将检查shadowsocks和pdnsd的脚 本加入到定时任务中,这样一旦由于某种原因挂了之后,可以自动的重新启动。之所以这样 弄是因为在我的这个版本中,计划任务的这个无论如何都无法启动执行,不知道tomato的这 个问题原因在那儿,而tomato又使用的是cru,并非常用的cron,反正就这样,能用就行。 pdnsd和shadowsocks的配置都在etc中,自己酌情配置,pdnsd中我配置的是google的dns,走 tcp。

自己编译

我编译出来的shadowsocks可能比较老旧,如果你想自己编译的话,这里就是方法了:

  1. 将shadowsocks和pdnsd的源代码放置到源代码的router目录下。
  2. 在router/Makefile中添加如下内容:
obj-y += shadowsocks-libev
obj-y += pdnsd

shadowsocks-libev:
    cd shadowsocks-libev && CC=$(CC) STRIP=$(STRIP) \
        CPPFLAGS="-Os -Wall $(EXTRACFLAGS) -ffunction-sections -fdata-sections -I$(TOP)/zlib" \
        LDFLAGS="-L$(TOP)/zlib -ffunction-sections -fdata-sections -Wl,--gc-sections -fPIC" \
        $(CONFIGURE) --prefix=$(INSTALLDIR)/shadowsocks-libev

shadowsocks-libev-install: shadowsocks-libev
    $(MAKE) -C shadowsocks-libev install

pdnsd: 
    cd pdnsd && CC=$(CC) STRIP=$(STRIP) \
        CPPFLAGS="-Os -Wall $(EXTRACFLAGS) -ffunction-sections -fdata-sections -I$(TOP)/zlib" \
        LDFLAGS="-L$(TOP)/zlib -ffunction-sections -fdata-sections -Wl,--gc-sections -fPIC" \
        $(CONFIGURE) --prefix=$(INSTALLDIR)/pdnsd --with-cachedir=$(INSTALLDIR)/pdnsd

pdnsd-install: pdnsd
    $(MAKE) -C pdnsd install
  1. 编译路由器代码,在我这边是这样子的:
make r7000e
  1. 编译后的那两个软件包在arm-uclibc/install下的各自的目录中