FreeRADIUS+PostgreSQL+OpenVPN搭建VPN认证系统
最近从Ramhost上又订了一个Nano plan,用来搭建认证VPN的系统
环境:Ubuntu 9.10 x86, 128M RAM
Freeradius 2.1.0, RADIUS for OpenVPN 2.1beta9, OpenVPN 2.1, PostgreSQL 8.4.4
OpenVPN是什么应该不用解释了。
FreeRADIUS是一个开源的RADIUS系统,目前是最为广泛使用的RADIUS,至于什么是RADIUS可以看这里:
-
安装组件
所需要的组件基本上都在Ubuntu的package source里面,用apt-get就可以装。
sudo apt-get install freeradius freeradius-postgresql postgresql openvpn build-essential libgcrypt11-dev
-
修改配置文件
Freeradius的配置文件位于/etc/freeradius
/etc/freeradius/clients.conf
这个文件控制连接的客户端的地址以及secret code。
地址不需要改变,因为我们是本地访问(openvpn到freeradius)。
secret要记下来,测试和写配置文件的时候要用。默认是testing123
/etc/freeradius/sql.conf
这个文件控制连接到sql的参数。
要改的地方:
database=”sql” 改成 database=”postgresql”
Connection info那里一般来说改密码就可以了。
/etc/freeradius/sql/postgresql/dialup.conf
取消
sql_user_name = "%{%{Stripped-User-Name}:-%{%{User-Name}:-none}}"
前面的注释,把下一行注释掉。/etc/freeradius/sites-enabled/default
取消掉authorize, preacct和accounting段中sql前面的注释,注释掉所有的files, unix, radwtmp和radutmp。
Postgresql的配置文件做如下修改:
/etc/postgresql/8.4/main/postgresql.conf
找到
listen_addresses
,把引号里面的地址改成*/etc/postgresql/8.4/main/pg\_hba.conf
把
local all all
那里的ident改成md5加入一行
host all all 0.0.0.0/0 md5
-
建立数据库
sudo -u postgres createuser radius --no-superuser --no-createdb --no-createrole -P
密码与sql.conf中connection info的密码一致。
sudo -u postgres createdb radius --owner=radius
然后
sudo cp /etc/freeradius/sql/postgresql/schema.sql ~/
psql -U radius radius < ~/schema.sql
然后连到sql上面,用psql或者pgadmin都可以。
psql里面输入如下命令:
insert into radgroupreply (groupname,attribute,op,value) values ('Users','Auth-Type',':=','Local'); insert into radgroupreply (groupname,attribute,op,value) values ('Users','Service-Type',':=','Dialout-Framed-User'); insert into radgroupreply (groupname,attribute,op,value) values ('Users','Framed-IP-Address',':=','255.255.255.254'); insert into radgroupreply (groupname,attribute,op,value) values ('Users','Framed-IP-Netmask',':=','255.255.255.0'); insert into radgroupreply (groupname,attribute,op,value) values ('Users','Acct-Interim-Interval',':=','600'); insert into radcheck (username,attribute,op,value) values ('test','Cleartext-Password',':=','test'); insert into radusergroup (username,groupname) values ('test','Users');
最后q退出。
-
初步测试
sudo /etc/init.d/freeradius stop sudo freeradius -X & radtest test test localhost 1649 testing123
如果出现类似如下信息:
Sending Access-Request of id 204 to 127.0.0.1 port 1812 User-Name = "test" User-Password = "test" NAS-IP-Address = 255.255.255.255 NAS-Port = 0 rad_recv: Access-Accept packet from host 127.0.0.1:1812, id=204, length=38 Service-Type = Framed-User Framed-IP-Address = 255.255.255.255 Framed-IP-Netmask = 255.255.255.0
即Access-Accept时,则说明freeradius和postgresql已经成功地连接起来了,否则要退回去检查配置。
-
配置OpenVPN
首先要把OpenVPN和Freeradius连接起来,这里是通过OpenVPN的插件Radiusplugin for OpenVPN。
wget http://www.nongnu.org/radiusplugin/radiusplugin_v2.1_beta9.tar.gz tar zxvf radiusplugin_v2.1_beta9.tar.gz cd radiusplugin/ make
应该会在当前目录下生成radiusplugin.so和radiusplugin.cnf,拷到/etc/openvpn。
修改/etc/openvpn/radiusplugin.cnf:
OpenVPNConfig=/etc/openvpn/openvpn.conf sharedsecret= testing123
这里secret要与clients.conf中间的一致。 同时后面server段中的name要改成FreeRadius服务器的IP(本例中是本机localhost)
然后生成OpenVPN的key:
sudo su cp -R /usr/share/doc/openvpn/examples/easy-rsa /etc/openvpn cd /etc/openvpn/easy-rsa/2.0 . ./vars ./clean-all ./build-ca ./build-key-server server ./build-key client1 ./build-dh
然后把生成的ca.crt拖到客户端上,用winscp连到ssh就可以。
配置OpenVPN服务端:
sudo nano /etc/openvpn/openvpn.conf
dev tun proto udp port 1194 ca /etc/openvpn/easy-rsa/2.0/keys/ca.crt cert /etc/openvpn/easy-rsa/2.0/keys/server.crt key /etc/openvpn/easy-rsa/2.0/keys/server.key dh /etc/openvpn/easy-rsa/2.0/keys/dh1024.pem user nobody group nogroup server 10.8.0.0 255.255.255.0 client-cert-not-required username-as-common-name plugin /etc/openvpn/radiusplugin.so /etc/openvpn/radiusplugin.cnf status /var/log/openvpn/status.log 1 log /var/log/openvpn/openvpn.log reneg-sec 600 persist-key persist-tun push "redirect-gateway def1" push "dhcp-option DNS 8.8.8.8" push "dhcp-option DNS 208.67.222.222" comp-lzo
客户端:
client dev tun proto udp remote your-server-address 1194 resolv-retry infinite nobind persist-key persist-tun script-security 2 explicit-exit-notify 3 ca ca.crt auth-user-pass verb 3 ns-cert-type server comp-lzo
再向/etc/rc.local中加入如下内容:
# add iptables rule for openvpn iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o venet0 -j SNAT --to-source your-server-ip-address # restart openvpn after 1 hour in case tun device got broken on reboot sleep 3600 /etc/init.d/openvpn stop sleep 10 /etc/init.d/openvpn start
加到exit 0前面。
重启等一个小时之后连接服务器应该会提示输入用户名密码,之后看到OpenVPN变绿就表示成功了。可以连到whatsmyip.org检查。
用户名密码可以通过pgadmin连到sql上面去修改,在radcheck里面。
本文参考了如下资料,在此表示感谢:
http://blog.chinaunix.net/u1/36506/showart_457803.html
https://forum.ramhost.us/bbs/viewtopic.php?id=4
http://wiki.freeradius.org/SQL_HOWTO