vpnc 是一个开源的 VPN 客户端,可以用来连接 Cisco VPN 网关,在 VPS 上使用 vpnc 连接办公网络,可以实现在一个严格限制端口的办公网络里管理 VPS。我的 VPS 是 vpsvillage 的 32-bit Debian 系统,最近折腾了一通,笔记记录如下。
1. 首先要保证系统装有 tun 模块,不巧的是,我的 VPS 上的 kernel 模块全是 64-bit 的版本,这个应该是操作系统安装脚本的问题,联系客服后得知他们提供有 32-bit 的 kernel module 包,并且有个脚本帮助完成安装。
wget ftp://ftp.grokthis.net/pub/linux/modules/install_modules.sh
mv /lib/modules/`uname -r` /lib/modules/`uname -r`.orig
sh install_modules.sh
depmod -a
modprobe tun
2. 安装 vpnc
apt-get install vpnc
3. 导出 VPN 网关的配置文件
公司机器都是 windows 已经装有 Cisco VPN Client,通常在 C:\Program Files\公司\VPN Client\profiles 里面就能找到配置文件。vpnc 带有一个工具可以将 pcf 配置文件直接转换为 vpnc 的配置文件,工具默认安装在 /usr/share/vpnc/pcf2vpnc,是个 perl 脚本,依赖 LWP::Simple 模块,我的 VPS 上没有这个,perl -MCPAN -e 'install LWP::Simple' 等了很久也没完成,放弃。其实可直接根据 pcf 文件里面的内容,参考 /etc/vpnc/example.conf 写一个配置文件,只要 ——
4. 解码配置文件中的 enc_GroupPwd
vpnc 主页提供了个工具 cisco-decode,直接到那解码即可。
5. 默认情况 vpnc 建立了 vpn 隧道之后会把默认网关和 /etc/resolv.conf 修改掉,如果这时候你在外网 ssh 在鼓捣这个,那 ssh 连接就会断了并且再也连不上,要用到两个配置:Target networks 和 DNSUpdate。完整的 vpnc 配置文件示例:
IPSec gateway 12.34.56.78
IPSec ID CorpVPN
IPSec secret grouppassword
Xauth username myusername
Xauth password mypassword
Target networks 10.0.0.0/8 192.168.0.0/16
DNSUpdate no
6. vpnc 需要 root 权限,即使把它 chmod u+s 也没有用,因为它使用的一个库 libgcrypt 会在 init 的时候放弃 euid root 权限,导致不能对 tun0 设备进行 ioctl。
7. 在严格限制端口的办公网络内部,在 VPS 上放一个 cgi 程序来建立 VPN 隧道即可穿透端口限制,但是通常 web 服务都是普通用户(如 www-data, nobody)运行,要调用 vpnc,需要写个 wrapper:
/* VPNC.c */
#include <unistd.h>
#include <stdio.h>
int main(int argc, char **argv)
{
/* gcry_control from libgcrypt drops root euid privilege in vpnc.c */
setuid(0);
return execve("/usr/sbin/vpnc", argv, NULL);
}
然后
gcc -o VPNC VPNC.c
cp VPNC /usr/sbin/
chown root:www-data /usr/sbin/VPNC
chmod 4710 /usr/sbin/VPNC
在 cgi 程序中调用 VPNC 才能拥有 root 权限。vpnc-disconnect 也是一样。
8. cgi 程序的写法就各显神通了,我的 cgi 程序是 bash 脚本,可以 URL/vpnc/q 查询 IP,URL/vpnc/<key> 建立连接,URL/vpnc/d 断开连接,相关的 lighttpd 配置(适应任何脚本):
$HTTP["url"] =~ "^/cgi-bin/.*" {
cgi.assign = ( "" => "" )
}
2 Comments so far
wayne, on May 13, 2009 at 9:59pm, said:
果然还是写了个wrapper啊。。。
最后那个链接少了个l。。。
matt(w), on May 14, 2009 at 5:09pm, said:
嗯,已经改过来了。