用 OpenVPN 实现双方 NAT 内 VPN 连接的尝试

学校位于墙外,宿舍宽带上下 100Mbps,如此优势不拿来架代理简直浪费.. 问题在于宿舍网络位于 NAT 后面没公网 IP,也没有 UPnP 这类方便的东西。不仅架代理麻烦,开 MC / TR 服务器什么的也很麻烦.. 尤其是在双方都是内网的情况下。

困难

于是做了不少尝试,比如宿舍内通过 VPN 连接自家路由器,然后将数据包通过自家路由器转发到宿舍路由器上,但这样做怎加了额外的延时,且受家里带宽限制。再比如通过 UDP 打洞 来实现双方直连..
但是如此一来,要用 UDP 来传送 TCP 内容,就需要自己实现 TCP 的各种功能,还要追踪连接,太过复杂大大超出自己能力水平(太弱了。所以就想着用各种办法偷懒。

绕开难点

上学期做的一个尝试是,用 tun 虚拟网卡,直接转发IP包。如此一来,TCP 全由系统实现,避开了这些复杂的事… (参见《OpenWrt 上使用 Python 操作 TAP/TUN》)最后止步于放假回家,和 Windows 下修改路由表的一些问题(很想具体喷一下但是这就扯远太了)。

前段时间忽然想到,OpenVPN 可使用 UDP 建立连接。如此一来,只要自己先(用少量代码)完成 UDP 打洞,而后的操作就可以全权交由(相当完善的) OpenVPN 处理,工作量、复杂度急剧下降。

具体实现

先简单重复一下 UDP 打洞的具体过程。 继续阅读

用 pcap_sendpacket 时别开 IP Forwarding

至少在我 Windows 7 下是这样的,用 pcap_sendpacket() 时别开系统的 IP forwarding 功能。
否则的话.. 包不会直接被送出去,而是会被系统路由一次再发。发生这种情况时,发送一个包,在本机会抓到两个包:前者没问题;后者 TTL 减一,源 MAC 和 目的 MAC 可能会被修改。但只有后一个包会被送出本机。

IP forwarding 默认是关闭的,修改注册表项HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\IPEnableRouter开启或关闭。启用后系统就成了个路由器,会根据路由表转发目标IP不是自己的包。我也忘了当时为什么开启来了。

不知道这是个例还是 WinPcap 的 bug ,别告诉我这是个 feature 就行…

利用上网卡转发短信至邮箱,来电提醒

想法

SMS to Email 效果

SMS to Email 效果

唔,最早的想法是:学校离家较远所以有两张SIM卡,而且由于资费原因只能分别在两地使用,想通过互联网代理,使得可以在一地同时使用两张卡..

最早想到的是使用闲置低端安卓机,后来发现手头闲置的一张华为数据卡(EC1261)可以利用,遂试着捣鼓出一个这玩意..

本文实现:

  • 将所收短信转发至指定 E-mail
  • 挂断来电并回复短信,同时发送 E-mail 提醒

虽然还不能接打电话,但至少接收各种验证短信不再麻烦了呢 🙂

设备

闲置 华为数据卡 EC1261 一张
装 ubuntu 的 Cubieboard 一块 继续阅读

GFWList 兼容 Squid

这两天在玩 Squid,一个功能颇为丰富的网络代理(缓存)软件。
GFWList 是一个 AutoProxy 维护的一个列表,顾名思义。

Squid 通过 ACL 为每个访问分类,为每个请求分类,控制行为。与目的网站相关的有:dstdomain(目标域名)、dstdom_regex(目标域名,正则表达式) 和dst_as(目标 AS 号)等,具体用法见 官方文档

GFWList 使用的是 Adblock 一样的格式,给它全转成正则表达式,然后使用dstdom_regex匹配就好了。写了个转换脚本(gfwlist2regex.py,运行后自动下载转换生成黑白名单,方便日后更新。 继续阅读

MMA7455L + Python + Cubieboard

MMA7455L (PDF) 三轴加速度传感器,可以使用 I2C 或者 SPI 总线连接。两者 Cubieboard 均有提供,虽然不懂有多大区别但是 SPI 要四根线好麻烦所以就用 I2C 了..(

与 Cubieboard 的连接参照 WikiPB18 (TWI1-SCK)PB19 (TWI1-SDA) 两根接在模块的 SCLSDI 口上,接好电源(3.3V)和地线,模块的 CS 也接在电源上(以使能 I2C)。官网 ubuntu 镜像默认启用 I2C-1,若未启用则需修改 Fex 文件:twi1_used = 1

可以使用 i2c-tools 确认连接正确。装好后输入i2cdetect -y 1,如果出现1d(MMA7455L 的地址),说明连接无误可以通讯。

在 Cubieboard 上使用 Python 读取加速度数值,代码在这:MMA7455L.py,目前实现功能有:

  • 读取 8 或 10 位的 X, Y, Z 轴加速度数值(-127 ~ 128 / -511 ~ 512);
  • 切换 ±2g, ±4g 和 ±8g(set_range());
  • 自动校准(set_offset()clear_offset())。

继续阅读