在 Ubuntu 上架设 OpenVPN 的智能网关

如果你没有一款支持 OpenWRT 等系统的路由器,又想让私有网络里的其它终端都能使用比较智能的网关翻墙的话,那么可以使用下面介绍的方法。

首先你需要有一个国外的 OpenVPN 账号,其次私有网络里有一台终端安装了 OpenVPN 客户端,这里就以 Ubuntu 系统为例,其它系统类似。

安装 OpenVPN
OpenVPN 在 Ubuntu 系统里的打包是服务端和客户端共享的,只是配置文件不同。

sudo apt-get install openvpn

导入证书
准备好你的证书和密钥,一共三个文件,分别是 ca.crt、client.crt、client,key,复制到 /etc/openvpn/keys/ 目录。

sudo mkdir /etc/openvpn/keys
sudo cp ca.crt client.crt client.key /etc/openvpn/keys/

生成智能路由表
http://code.google.com/p/chnroutes/downloads/list 下载 chnroutes_ovpn_linux

python chnroutes_ovpn_linux
sudo mkdir /etc/openvpn/scripts
sudo cp vpnup vpndown /etc/openvpn/scripts/

编写配置文件

sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/client.conf
sudo vim /etc/openvpn/client.conf  # 下面是需要修改的部分
remote my-server-1 1194  # my-server-1 修改成 vpn 服务器地址
 
user nobody
group nogroup
 
ca keys/ca.crt
cert keys/client.crt
key keys/client.key
 
scripts-security 2
up scripts/vpnup
down scripts/vpndown

启动和停止 VPN 服务
由于 OpenVPN 是系统服务,而且是开机自动启动的。

sudo service openvpn start # 启动服务
sudo service openvpn stop # 停止服务

设置 NAT

sudo sysctl net.ipv4.ip_forward=1
sudo vim /etc/sysctl.d/10-ip-forward.conf
net.ipv4.ip_forward=1
sudo iptables -t nat -A POSTROUTING -j MASQUERADE
sudo iptables-save > /tmp/firewall.rules
sudo cp /tmp/firewall.rules /etc/
sudo vim /etc/rc.local
# /etc/rc.local
/sbin/iptables-restore < /etc/firewall.rules
exit 0

其它终端设置
其它终端修改原来的网关地址为新的智能网关地址,如果使用DHCP服务器分配地址的,可能给智能网关使用手动指定的地址,然后将DHCP服务器的地址分配中修改网关为智能网关的地址。

Over!

Ubuntu 服务器安装与配置 OpenVPN 服务

安装 OpenVPN

sudo apt-get install openvpn

配置 OpenVPN
1. 证书生成

sudo cp -a /usr/share/doc/openvpn/examples/easy-rsa/2.0/ /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa/
sudo ln -s easy-rsa/keys /etc/openvpn/keys
sudo mkdir /var/lib/openvpn/
sudo vim vars  # 编辑 vars
export KEY_COUNTRY=""
export KEY_PROVINCE=""
export KEY_CITY=""
export KEY_ORG=""
export KEY_EMAIL=""

注意:KEY_COUNTRY 和 KEY_PROVINCE 都以两个大写字母表示。

source ./vars
./clean-all
./build-ca
./build-key-server server
./build-key client
./build-dh

注意:./build-key-server 与 ./build-key 使用默认选项即可。
2. 服务器配置

sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
sudo gunzip server.conf.gz
sudo vim server.conf # 编辑 server.conf,修改下面的部分
ca keys/ca.crt
cert keys/server.crt
key keys/server.key
 
dh keys/dh1024.pem
 
ifconfig-pool-persist /var/lib/openvpn/ipp.txt
 
push "redirect-gateway def1"
 
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
 
status /var/lib/openvpn/status.log
 
user user
group group

3. 启动OpenVPN服务

sudo service openvpn start

配置 NAT

sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j SNAT --to-source xxx.xxx.xxx.xxx # 公网IP
sudo sysctl net.ipv4.ip_forward=1
sudo vim /etc/sysctl.d/10-ip-forward.conf
net.ipv4.ip_forward=1

导出客户端证书

sudo cp /etc/openvpn/keys/{ca.crt,client.crt,client.key} ~  # 将这三个文件打包下载到客户端即可

Over!

Terminal for CM 6 ROM

CM 6 集成的终端程序在普通用户权限下无法访问存储卡和网络,这个对权限做了一些修改。

下载
http://heiher.info/sftp/android/Term.apk

安装方法

su
mount -o remout,rw /system
cp /sdcard/Term.apk /system/app/Term.apk
chmod 644 /system/app/Term.apk
mount -o remount,ro /system
exit

Over!

为 Home 加密的用户启用 OpenSSH 证书认证

Ubuntu 不知从什么时候在安装时增加了用 ecryptfs 为 Home 启用加密的支持,要说这个功能挺好的,不用担心私有的文件会泄漏。但是你可能已经发现这样的加密引发了一个问题,启用了这样的加密功能的用户,无法通过增加 ~/.ssh/authorized_keys2 公钥实现证书认证。下面我们就来解决这个问题。

Home 加密的实现
1. 系统会创建 /home/.ecryptfs/ 文件夹,并在里面创建以用户名命名的文件夹,这个以用户名命名的文件夹里还创建了 .ecryptfs 和 .Private 两个文件夹,分别用于保存加密配置信息和加密后的数据。
2. 在用户的真实 Home(即没有挂载 ecryptfs 前的 Home )里有两个重要的符号链接文件 .ecryptfs 和 .Private 分别链接到 /home/.ecryptfs/用户名/.ecryptfs 和 /home/.ecryptfs/用户名/.Private 。
3. 当用户登录时,如果认证通过,会自动将真实 Home 里的 .ecryptfs 挂载到 真实 Home 文件夹上,即 /home/用户名/,这时用户名主目录就变成加密后的了,可以看到里面有很多的文件。
4. 当用户注销,自动卸载加密主目录。

解决办法
1. 复制证书的公钥到 /tmp 目录待用。
2. 注销用户,转到虚拟控制台(Ctrl+Alt+Fx)。
3. 登录用户,执行命令 ecryptfs-umount-private,完成后执行 cd /home/用户名 可以看到里面的文件已经不是原来的了。
4. 执行命令 mkdir .ssh 创建一个 .ssh 文件夹,复制刚才存放在 /tmp 里的公钥文件到刚创建的 .ssh 文件夹里,命名为 authorized_keys2。
5. 执行命令 ecryptfs-mount-private 并注销用户
6. 转到图形界面登录。
注:没有图形界面,直接做 2-5。

Over!

GObject 初始化可失败类的派生类模板

此模板派生于 GObject 类,并实现了 GInitableIface 接口,其函数调用序列如下

** (process:1755): DEBUG: hev_iobj_new
** (process:1755): DEBUG: hev_iobj_class_init // 只有首次实例化被调用
** (process:1755): DEBUG: hev_iobj_initable_iface_init // 只有首次实例化被调用
** (process:1755): DEBUG: hev_iobj_constructor
** (process:1755): DEBUG: hev_iobj_init
** (process:1755): DEBUG: hev_iobj_constructed
** (process:1755): DEBUG: hev_iobj_initable_init
** (process:1755): DEBUG: hev_iobj_dispose
** (process:1755): DEBUG: hev_iobj_finalize

无论其初始化是否成功,其函数调用都是如上,当初始化失败(hev_iobj_initable_init 函数返回 FALSE),hev_iobj_new 函数返回 NULL,并设置参数 error。调用者通过其 error 参数判断错误类型。

源代码下载

编译

gcc -o hev-test hev-test.c hev-iobj.c `pkg-config --cflags --libs gio-2.0`

Over!

联创网络认证客户端 for Linux

本客户端是根据矿大版本的协议重写的而成的,原是为我的一个朋友(现在徐州工业学院)做的。此程序版权为所有人吧,想怎么用怎么用吧。

ihipop 维护的 deb 包
http://code.google.com/p/linkage-4-linux/

客户端分为两个交互界面:命令行和图形界面(GTK)

图形界面
代码仓库:http://git.heiher.info/linkage-gtk.git

命令行
代码仓库:http://git.heiher.info/linkage.git

权限设置
此程序可以不以 root 用户执行,通过执行下面的命令后

sudo setcap cap_net_raw,cap_net_admin=eip linkage-gtk

使用方法
考虑各个系统连接网络的方式不同,程序中没有去调用DHCP客户端获取IP地址,由用户手动操作。认证并连接网络的流程大概是这样的。
1. 断开当前网络接口的连接
2. 启动认证管理器运行认证
3. 当提示验证成功时,连接当前网络接口运行获取IP
4. 获取到IP地址,网络连接成功。

Over!

Linux 系统中普通用户使用 Wireshark

自从 Linux kernel 2.2 开始,已经将一部分的程序的一部分能力放到文件系统中管理了,此举使我们不使用 root 用户运行 wireshark 成为了可能。有关能力设置的具体手册,可以参考 capabilities(7)

安装工具程序

sudo apt-get install libcap2-bin

设置能力

sudo setcap cap_net_raw,cap_net_admin=eip /usr/bin/dumpcap

试试用普通用户执行 wireshark 可以看到网卡了吧。

Over!