最近心情不好,又没有钱靠买物来分神,只好折腾一些不用花钱的东西,于是很无聊的在VPS上装了个OpenVPN Server,把家里所有能用OpenVPN的设备都折腾了个遍,

更无聊的是我决定把这记录写下来,

 

 

首先是安装配置OpenVPN Server,VPS用的是CentOS 5.5,懒得自己编译,yum安装一下就好,

(其实我是为了用PAM管理用户名/密码认证的方式自己编译过,因为yum安装的2.1.4的openvpn-auth-pam.so死活认证不了,折腾了2个小时都不行只好自己用2.0.9的重新编译安装过才行,不过后来放弃了用户名密码认证用证书认证)

安装完鸟修改一下配置启动服务,为了后头在客户端用autoddvpn在vpn连接和中断时自动修改路由,persist-tun不能启用,同时因为是ADSL拨号,MSS和分片也要额外配置

local a.b.c.d #服务器的IP地址,这里应该写不写也可以
port 1194 #服务侦听的端口号
proto udp #貌似官方是推荐用UDP协议的
dev tun #路由模式,用tun就好
ca /etc/openvpn/keys/ca.crt #指定证书所在
cert /etc/openvpn/keys/server.crt #指定证书所在
key /etc/openvpn/keys/server.key #指定证书所在
dh /etc/openvpn/keys/dh1024.pem #指定证书所在
server 10.8.0.0 255.255.255.0 #VPN Client会获得的IP地址段
ifconfig-pool-persist ipp.txt #使同一用户始终获得一个IP并记录在ipp.txt里头
push "dhcp-option DNS 8.8.8.8" #推送DNS Server配置到客户端
keepalive 10 120 #判断连接是否可用
comp-lzo #启用LZO压缩
persist-key #vpn通道重启时不用重新读密匙,有用么?
;persist-tun #这个要comment掉,因为要跟后头的autoddvpn配合
log-append /var/log/openvpn/openvpn.log #日志记录所在
verb 3 #日志详细程度
mssfix 1300 #指定最大传输单元
fragment 1300 #指定分片设置

 

Client设备配置,

家里要两台AP才能完全覆盖,用的都是linksys,一台WRT610N一台E3000,firmware都是tomato USB,

E3000配置为gateway模式,用ADSL拨号连接Internet,配置为DHCP Server,在DNSMasq将DHCP推送的网关配置为E3000,DNS也推送为8.8.8.8防止DNS poisoning

配置方式在Advanced–>DHCP/DNS–>Custom Configuration填入以下内容

dhcp-option=6,<DNS地址>

dhcp-option=3,<网关地址>

 

WRT610N配置为router模式,网关指向WRT610N,配置为DHCP Server,并配置为openvpn client,

首先启用jffs,然后将证书,配置文件什么的一股脑放到/jffs某文件夹里,先配置客户端文件

up ‘/jffs/openvpn/vpnup.sh openvpn’ #vpn tunnel up时执行autoddvpn脚本
down ‘/jffs/openvpn/vpndown.sh openvpn’ #vpn tunnel down时执行autoddvpn脚本
daemon #驻留后台
client #配置为客户端
dev tun11 #指定tun接口名称,需跟openvpndd的配置对应,tomato firmware默认即使用tun11
proto udp #使用udp协议,和服务器对应
remote <服务器IP 地址> 1194 #服务器IP地址和端口号
nobind #客户端使用动态接口,写不写应该都一样
persist-key #vpn通道重启时不用重新读密匙
#persist-tun #这句不能有或要comment掉,否则vpn down的时候脚本不会生效
comp-lzo yes #使用LZO压缩
#redirect-gateway def1 #这句同样不能有,否则会多一条到openvpn server的默认路由,移动设备要直接连vpn把这句uncomment就好
verb 3 #日志详细程度
ca ca.crt #指定证书所在
cert client.crt #指定证书所在
key client.key  #指定证书所在
log-append /tmp/openvpn.log #日志文件所在
fragment 1300 #指定分片设置,和服务器对应
resolv-retry infinite #断线后始终尝试重连
keepalive 10 30 #keepavlive polling interval

 

然后下载autoddvpn grace mode的脚本,配置只有特定的流量才走vpn通道,稍做修改

vpnup.sh

38行,由于WRT610N不是拨号到internet的设备,因此把OLDGW=$(nvram get wan_gateway)改为OLDGW=$(nvram get lan_gateway),

66行,改为OPENVPNDEV=’tun11′

vpndown.sh

39行,OLDGW=$(nvram get lan_gateway)

58行/72行,把tun0都改为tun11

同目录新建一个vpnup_custom,添加自定义的需走vpn的流量,

 

 

终端:

HTPC要用utorrent/迅雷/emule之类的,手工配置IP地址,并把网关指向E3000

其余的终端统统DHCP,该走vpn的走vpn,不该走的该怎么走怎么走

 

iOS设备如果JB了可以用GuizmOvpn,把配置和证书打个包zip下载到设备就好,还可以在app内修改配置,傻瓜又好用,

 

 

Android必须有对应kernal版本编译好的tun.ko,MIUI用CM7来改是有的,不过default没load,去market装个OpenVpn Setting配置一下就好~

还有什么好折腾的呢…


继续继续,发现DNSMasq也是可以分组来配置DHCP的option的,首先是定义一个分组,

例如分组为net:2,分组可分配的地址段可用起始,结束地址定义,不过我用的全部都是静态,就只写网段和掩码好了,然后后头跟个static

dhcp-range=net:2,192.168.7.0,255.255.255.0,static

写完分组定义分组对应的option,

dhcp-option=net:2,3,<DNS地址>
dhcp-option=net:2,6,<网关地址>

最后写MAC-IP的静态映射和地址租用有效时间,

dhcp-host=<MAC Addr>,net:2,<IP Addr>,1440m

打完收工~

Reference:

http://www.thekelleys.org.uk/dnsmasq/docs/dnsmasq-man.html