PPTP+FreeRADIUS+MySQL搭建VPN认证和流量控制
 最近帮论坛上朋友建了个OpenVPN+PPTP的VPN服务器,记下来过程以备不时之需。
 系统环境是CentOS 5.6 xen,所有过程中软件均从源码编译。
 需要软件:
 PopTop: http://poptop.sourceforge.net/
 PPPd: http://ppp.samba.org/
 FreeRADIUS: http://freeradius.org/
 RADIUSClient: http://wiki.freeradius.org/Radiusclient
 MySQL: http://www.mysql.com/
 同时为了方便管理数据库,最好再装个php,使用phpmyadmin来管理。
 编译过程很简单,pptpd、pppd和freeradius都是
     | 1 | ./configure &&make&&makeinstall | 
       就可以了。
 完成之后freeradius的启动脚本在redhat/里面,pptpd需要自己写一个,很简单:
       | 3 | # Startup script for pptpd | 
       | 6 | # description: PPTP server | 
      | 8 | # config: /etc/pptpd.conf | 
      | 10 | # Source function library. | 
     | 11 | . /etc/rc.d/init.d/functions | 
     | 12 | # See how we were called. | 
       | 15 |         echo-n"Starting pptpd: " | 
     | 16 |         if[ -f /var/lock/subsys/pptpd ] ;then | 
         | 21 |         /usr/local/sbin/pptpd -d | 
      | 23 |         touch/var/lock/subsys/pptpd | 
       | 26 |         echo-n"Shutting down pptpd: " | 
       | 29 |         rm-f /var/lock/subsys/pptpd | 
              | 39 |         echo"Usage: $0 {start|stop|restart|status}" | 
           ——————————————————————————–
 然后修改一些FreeRADIUS的配置文件,位于/usr/local/etc/raddb/
 sites-enabled/default
 在所有的unix和files前面加上注释,并去掉所有sql前面的注释。
 radiusd.conf
 去掉include sql.conf前面的注释。
 clients.conf
 这个文件控制连接的客户端的地址以及secret code。
 secret要记下来,测试和写配置文件的时候要用。默认是testing123
 sql.conf
 这个文件控制连接到sql的参数。
 改成实际数据库的用户名和密码。
 sql/mysql/dialup.conf
 取消
     | 1 | sql_user_name ="%{%{Stripped-User-Name}:-%{%{User-Name}:-none}}" | 
       前面的注释,把下一行注释掉。
 同时如果需要打开simultanoues-use(控制同时在线用户数)的话需要把simul_query_check取消注释。
 ——————————————————————————–
 然后建立基本数据库:
     | 1 | /usr/local/mysql/bin/mysql -uroot -p | 
           | 1 | createdatabaseradius; | 
     | 2 | grantallprivilegesonradius.*toradius@localhost identifiedby"radiuspassword"; | 
             | 1 | /usr/local/mysql/bin/mysql -uradius -p radius < /usr/local/etc/raddb/sql/mysql/schema.sql | 
       建立表格:
     | 1 | INSERTINTOradgroupreply (groupname,attribute,op,VALUE)VALUES('user','Auth-Type',':=','Local'); | 
     | 2 | INSERTINTOradgroupreply (groupname,attribute,op,VALUE)VALUES('user','Service-Type',':=','Framed-User'); | 
     | 3 | INSERTINTOradgroupreply (groupname,attribute,op,VALUE)VALUES('user','Framed-IP-Address',':=','255.255.255.255'); | 
     | 4 | INSERTINTOradgroupreply (groupname,attribute,op,VALUE)VALUES('user','Framed-IP-Netmask',':=','255.255.255.0'); | 
     | 5 | INSERTINTOradgroupreply (groupname,attribute,op,VALUE)VALUES('user','Acct-Interim-Interval',':=','600'); | 
     | 6 | INSERTINTOradgroupreply (groupname,attribute,op,VALUE)VALUES('user','Max-Monthly-Traffic',':=','5368709120'); | 
     | 7 | INSERTINTOradgroupcheck (groupname,attribute,op,VALUE)VALUES('user','Simultaneous-Use',':=','1'); | 
       以上前四行不用改动,acct-interim-interval是计算流量的间隔(600秒),意味着每隔10分钟记录当前流量。倒数第二行是每月最大流量,这里是5G(单位是字节)。最后一行是允许同时连接数目。
 ——————————————————————————–
 输入测试用户信息:
      | 1 | INSERTINTOradcheck (username,attribute,op,VALUE)VALUES('test','Cleartext-Password',':=','test'); | 
     | 2 | INSERTINTOradusergroup (username,groupname)VALUES('test','user'); | 
       用户名与密码必须以明文/NTLM Crypt形式保存,因为MS-CHAPv2不支持MD5保存的密码。
 ——————————————————————————–
 由于上步中有非内置的attribute Max-Monthly-Traffic,所以需要在/usr/local/etc/raddb/dictionary里面定义:
 ATTRIBUTE Max-Monthly-Traffic 3003 integer
 ——————————————————————————–
 初步测试:
     | 1 | /etc/init.d/freeradius stop | 
      | 3 | radtesttesttestlocalhost 1649 testing123 | 
       如果结果中有Access-Accept就代表成功了,否则退回去检查设置。
 测试成功的话添加在认证时检测流量的语句,打开/usr/local/etc/raddb/sites-enabled/default,找到authorize一节插入:
      | 2 | Group-Name :="%{sql:SELECT groupname FROM radusergroup WHERE username='%{User-Name}' ORDER BY priority}" | 
      | 4 | if("%{sql: SELECT SUM(acctinputoctets+acctoutputoctets) FROM radacct WHERE username='%{User-Name}' AND date_format(acctstarttime, '%Y-%m-%d') >= date_format(now(),'%Y-%m-01') AND date_format(acctstoptime, '%Y-%m-%d') < = last_day(now());}">="%{sql: SELECT value FROM radgroupreply WHERE groupname='%{Group-Name}' AND attribute='Max-Monthly-Traffic';}") { | 
         ——————————————————————————–
 设置radiusclient:
 打开/usr/local/etc/radiusclient/radiusclient.conf,修改
 authserver localhost:1812
 acctserver localhost:1813
 修改server:
 最后加上localhost secret(就是FreeRadius的client.conf里面定义的secret)
 修改dictionary:
 最后加上
 INCLUDE /usr/local/etc/radiusclient/dictionary.merit
 INCLUDE /usr/local/etc/radiusclient/dictionary.microsoft
 如果没有dicitionary.microsoft的话看这里:http://wiki.freeradius.org/PopTop
 ——————————————————————————–
 一切正常后设置pptp:
 把源码包里面的options.pptpd和pptpd.conf拷到/etc/
 修改options.pptpd:
 取消ms-dns前面的注释,后面的ip改为8.8.8.8
 加入一行noaccomp,以提供对iOS 4.3+的支持(否则连上就断)。
 最后加上插件:
 plugin /usr/local/lib/pppd/2.4.5/radius.so
 plugin /usr/local/lib/pppd/2.4.5/radattr.so
 radius-config-file /usr/local/etc/radiusclient/radiusclient.conf
 修改pptpd.conf:
 ppp路径改为/usr/local/sbin/pppd
 option路径为/etc/options.pptpd
 注释掉logwtmp避免619错误
 最后的localip根据需要设置
 示例:localip 192.168.100.1
 remoteip 192.168.100.100-150
 重要的一点:一定要注释掉delegate,之前没有注释结果连接的时候log显示LCP terminated by peer跟着一堆乱码直接掉线,客户端则显示720,注释掉就好了。(虽然个人认为不应该注释,因为delegate的作用是让radius来处理ip分 配)
 启动服务测试下是否能连接,多用radiusd -X看输出信息。
 ——————————————————————————–
 最后是相应的iptables设置:/etc/sysconfig/iptables
 nat里面加入:
 -A POSTROUTING -s 192.168.100.0/255.255.255.0 -o eth0 -j MASQUERADE
 filter里面加入:
 -A INPUT -i lo -j ACCEPT
 -A INPUT -i ! lo -d 127.0.0.0/8 -j REJECT
 -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
 -A OUTPUT -j ACCEPT
 -A INPUT -p gre -j ACCEPT
 -A INPUT -p tcp -m state –state NEW –dport 1723 -j ACCEPT
 -A INPUT -p icmp -m icmp –icmp-type 8 -j ACCEPT
 -A INPUT -j REJECT
 -A FORWARD -i ppp+ -p tcp -m tcp –tcp-flags FIN,SYN,RST,ACK SYN -j TCPMSS –set-mss 1356
 设置mss以防止过大的包被丢弃,从而造成无法载入。
 大功告成!
 本文参考:
 http://wiki.freeradius.org/PopTop
 http://freeradius.1045715.n5.nabble.com/group-variable-td2776238.html
 http://hi.baidu.com/ox188/blog/item/4ae1373f33d90fe455e723a4.html
 http://www.accountingenhancements.com/filetree/pptp-HOWTO-linux-2.6.9.txt
 http://discussions.apple.com/thread.jspa?threadID=2778039&start=60&tstart=0
 原文:http://tomem.info/blog/2011/04/562
 ==========
 架设L2TP/IPSec + MySQL + FreeRADIUS认证VPN
  接上次那篇PPTP的文(https://tomem.info/blog/2011/04/562),这篇讲下如何搭建L2TP VPN。平台依然是CentOS 5.6 x86,源码方式安装。
 说实在的搭建L2TP over IPSec VPN让人头痛不少,主要是因为需要好几个内核模块支持。因而如果你使用的是OpenVZ的VM的话基本上可以忽略这篇文章-2.6.32以下的内核不支持IPSec虚拟化。
 如果是Xen的话,在确定能用PPTP的基础上(包括IP转发,etc),执行以下命令确认必需的模块都存在(xfrm_user可能编入了内核,所以没有检测):
  
     | 1 | modprobe af_key && modprobe ah4 && modprobe esp4 && modprobe ipcomp && modprobe xfrm4_tunnel &&echo"All IPSec modules are loaded" | 
       如果出现All IPSec modules are loaded则该VM有所有需要的内核模块,否则不能建L2TP over IPSec。
 6月21日更新:最近搞了个日本的VPS,执行上面命令发现模块都存在但是都没加载,而且连ppp的也没有(lsmod | grep -w ‘af_key\|ah4\|esp4\|ipcomp\|xfrm4_tunnel\|ppp_generic\|ppp_mppe \|ppp_deflate’)  结果在/etc/sysconfig/modules里面手工添加了。
 结果在/etc/sysconfig/modules里面手工添加了。
 ———————————————————————————————————-
 成功之后下载需要的软件包:
 首先安装一些编译需要的软件包:
 yum install bison flex lsof gmp gmp-devel libpcap libpcap-devel
 然后下载OpenSwan、xl2tpd和rp-l2tp。
 OpenSwan: http://www.openswan.org/code/
 xl2tpd: http://www.xelerance.com/services/software/xl2tpd/
 rp-l2tp: http://sourceforge.net/projects/rp-l2tp
 OpenSwan编译安装:make programs && make install
 xl2tpd:make && make install
 rp-l2tp我们只需要其中的l2tp-control,执行以下命令:
      | 2 | cphandlers/l2tp-control /usr/local/sbin/ | 
      | 4 | ln-s /usr/local/sbin/l2tp-control /var/run/xl2tpd/l2tp-control | 
       ———————————————————————————————————-
 写IPSec的配置文件:
 需要修改的地方:
 protostack=auto改成protostack=netkey
 最后加上
     | 1 | # sample VPN connections, see /etc/ipsec.d/examples/ | 
     | 2 | include /etc/ipsec.d/l2tp-psk.conf#添加l2tp配置 | 
      | 4 | #Disable Opportunistic Encryption | 
     | 5 | include /etc/ipsec.d/no_oe.conf#添加oe配置 | 
       注意缩进!上面添加的几行必须是紧靠左边(左边不能有空格)。
 然后新建l2tp-psk.conf和no_oe.conf(来自https://suoluo.org/2010/04/4/)
  
     | 1 | nano /etc/ipsec.d/no_oe.conf | 
            | 1 | nano /etc/ipsec.d/l2tp-psk.conf | 
            | 2 | rightsubnet=vhost:%no,%priv | 
     | 3 | #forceencaps=yes #这个参数默认是启用的,但如果连接失败抓包分析看到不停的循环在和500端口交换PSK的话就去掉它 | 
         | 8 | # Configuration for one user with any type of IPsec/L2TP client | 
     | 9 | # including the updated Windows 2000/XP (MS KB Q818043), but | 
     | 10 | # excluding the non-updated Windows 2000/XP. | 
       | 13 | # Use a Preshared Key. Disable Perfect Forward Secrecy. | 
      | 15 | # PreSharedSecret needs to be specified in /etc/ipsec.secrets as | 
     | 16 | # YourIPAddress  %any: "sharedsecret" | 
         | 21 | # we cannot rekey for %any, let client rekey | 
        | 25 | left=1.2.3.4#VPS的IP地址 | 
     | 26 | leftnexthop=1.2.3.5#网关地址,通过route -n 可以查看 gateway地址 | 
     | 27 | # or you can use: left=YourIPAddress | 
      | 29 | # For updated Windows 2000/XP clients, | 
     | 30 | # to support old clients as well, use leftprotoport=17/%any | 
          | 36 | # Using the magic port of "0" means "any one single port". This is | 
     | 37 | # a work around required for Apple OSX clients that use a randomly | 
     | 38 | # high port, but propose "0" instead of their port. | 
     | 39 | rightprotoport=17/%any | 
       同样的要注意缩进。在两个conn之间的语句要向右缩进一格。
 设置预置密钥:
     | 1 | nano /etc/ipsec.secrets: | 
           | 1 | YOUR.SERVER.IP.ADDRESS %any: PSK"YourSharedSecret" | 
        
 最后修改/etc/sysctl.conf:
     | 1 | # Settings for OpenSwan IPSec implementation | 
     | 2 | net.ipv4.conf.all.send_redirects = 0 | 
     | 3 | net.ipv4.conf.default.send_redirects = 0 | 
     | 4 | net.ipv4.conf.all.accept_redirects = 0 | 
     | 5 | net.ipv4.conf.default.accept_redirects = 0 | 
     | 6 | net.core.xfrm_larval_drop = 1 | 
       ———————————————————————————————————-
 测试下IPSec:
     | 1 | /etc/init.d/ipsec start | 
        如果是类似如下结果就可以继续了(不能有Failed,N/A可以)。
 Checking your system to see if IPsec got installed and started correctly:
 Version check and ipsec on-path                                 [OK]
 Linux Openswan U2.6.33/K2.6.18-194.11.4.el5xen (netkey)
 Checking for IPsec support in kernel                            [OK]
 SAref kernel support                                           [N/A]
 NETKEY:  Testing XFRM related proc values                      [OK]
 [OK]
 [OK]
 Testing against enforced SElinux mode                           [OK]
 Checking that pluto is running                                  [OK]
 Pluto listening for IKE on udp 500                             [OK]
 Pluto listening for NAT-T on udp 4500                          [OK]
 Two or more interfaces found, checking IP forwarding            [OK]
 Checking NAT and MASQUERADEing
 Checking for ‘ip’ command                                       [OK]
 Checking /bin/sh is not /bin/dash                               [OK]
 Checking for ‘iptables’ command                                 [OK]
 Opportunistic Encryption Support                                [DISABLED]
 pluto listening那个与lsof有关,如果显示failed检查是否装了lsof。
 ———————————————————————————————————-
 测试通过后修改xl2tpd的配置:
 如果你的ipsec verify结果中间也有SAref kernel support [N/A]的话,在xl2tpd里面就必须关掉saref,否则tail /var/log/secure会出现ERROR: netlink_get_spi for comp.0@server ip failed with errno 22: Invalid argument。
      | 2 | listen-addr = your.server.ip.address | 
      | 4 | ; requires openswan-2.5.18 or higher - Also does not yet workincombination | 
     | 5 | ; with kernel mode l2tp as presentinlinux 2.6.23+ | 
        | 9 | ip range = 192.168.100.101-192.168.100.151 | 
     | 10 | localip = 192.168.100.1 | 
       | 13 | require authentication =yes | 
       | 16 | pppoptfile = /etc/ppp/options.xl2tpd | 
        修改ppp配置:
                   | 15 | plugin /usr/local/lib/pppd/2.4.5/radius.so | 
     | 16 | plugin /usr/local/lib/pppd/2.4.5/radattr.so | 
     | 17 | radius-config-file/usr/local/etc/radiusclient/radiusclient.conf | 
       建立xl2tpd的init script:
       | 3 | # xl2tpd        This shell script takes care of starting and stopping l2tpd. | 
       | 6 | # description:  Layer 2 Tunnelling Protocol Daemon (RFC 2661) | 
      | 8 | # processname:  /usr/sbin/xl2tpd | 
     | 9 | # config:       /etc/xl2tpd/xl2tpd.conf | 
     | 10 | # pidfile:      /var/run/xl2tpd.pid | 
        | 14 | # Required-Start: $local_fs $network $syslog | 
     | 15 | # Required-Stop: $local_fs $network $syslog | 
      | 17 | # Short-Description: start|stop|status|restart|try-restart|reload|force-reload xl2tpd server | 
     | 18 | # Description: control xl2tpd server | 
          | 24 | # Source function library. | 
     | 25 | . /etc/rc.d/init.d/functions | 
      | 27 | # Source networking configuration. | 
     | 28 | . /etc/sysconfig/network | 
      | 30 | if[ ${NETWORKING} ="no"] | 
         | 35 | [ -x /usr/local/sbin/$SERVICE ] ||exit0 | 
         | 40 | echo-n"Starting $SERVICE: " | 
     | 41 | if[ ! -d /var/run/xl2tpd ] | 
        | 45 | daemon /usr/local/sbin/$SERVICE | 
       | 48 | if[ $RETVAL -eq0 ];then | 
     | 49 | touch/var/lock/subsys/$SERVICE | 
            | 57 | echo-n"Stopping $SERVICE: " | 
       | 60 | if[ $RETVAL -eq0 ];then | 
     | 61 | rm-f /var/run/xl2tpd/$SERVICE | 
     | 62 | rm-f /var/lock/subsys/$SERVICE | 
               | 73 | # See how we were called. | 
                    | 89 | [ -f /var/lock/subsys/$SERVICE ] && restart || : | 
       | 92 | echo"Usage: $SERVICE {start|stop|status|restart|reload|condrestart}" | 
         ———————————————————————————————————-
 最后对应的iptables的配置:
     | 1 | -A INPUT -p udp -m state --state NEW -m udp --dport 500 -j ACCEPT | 
     | 2 | -A INPUT -p udp -m state --state NEW -m udp --dport 1701 -j ACCEPT | 
     | 3 | -A INPUT -p udp -m state --state NEW -m udp --dport 4500 -j ACCEPT | 
       大功告成!
 参考:
 http://b.gkp.cc/2010/06/19/setup-ipsec-l2tp-on-centos-55/
 https://suoluo.org/2010/04/4/
 原文:http://tomem.info/blog/2011/04/577
 ==========
 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可以看这里:
  
 1、安装组件
 所需要的组件基本上都在Ubuntu的package source里面,用apt-get就可以装。
  sudo apt-get install freeradius freeradius-postgresql postgresql openvpn build-essential libgcrypt11-dev 
  
 2、修改配置文件
 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。
 ————————————————————-
 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
  
 3、建立数据库
  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 ('user','Auth-Type',':=','Local'); insert into radgroupreply (groupname,attribute,op,value) values ('user','Service-Type',':=','Dialout-Framed-User'); insert into radgroupreply (groupname,attribute,op,value) values ('user','Framed-IP-Address',':=','255.255.255.255'); insert into radgroupreply (groupname,attribute,op,value) values ('user','Framed-IP-Netmask',':=','255.255.255.0'); insert into radgroupreply (groupname,attribute,op,value) values ('user','Acct-Interim-Interval',':=','600'); insert into radcheck (username,attribute,op,value) values ('test','Cleartext-Password',':=','test'); insert into radusergroup (username,groupname) values ('test','user');  最后\q退出。
  
 4、初步测试
  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已经成功地连接起来了,否则要退回去检查配置。
  
 5、配置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 tcp port xxxx  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  persist-key persist-tun  push "redirect-gateway def1" push "dhcp-option DNS 8.8.8.8" push "dhcp-option DNS 208.67.222.222"  auth RSA-SHA512 cipher AES-256-CBC  comp-lzo 
 客户端:
  
  client dev tun proto tcp  remote your-server-address xxxx  resolv-retry infinite nobind  persist-key persist-tun  script-security 2 auth RSA-SHA512 cipher AES-256-CBC  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
 http://wiki.freeradius.org/Postgres_DDL_script
 http://www.linuxsir.org/main/node/275
 原文:http://tomem.info/blog/2010/06/207
 ==========
 FreeRADIUS+Postgresql+OpenVPN续:流量控制
  实质上很简单,就是求和+if判断,枉自研究了半天的rlm_sql_counter
 示例的是每月限制流量,针对用户组
 1. 设定限制
 radgroupreply组里面插入一行,命令如下:
  insert into radgroupreply (groupname, attribute, op, value) values ('user','Max-Monthly-Traffic', ':=', '5368709120');  以上命令表示对用户组user限制流量为5G,单位是bytes
 同时还要加入Acct-Interim-Interval,该参数是定义让OpenVPN plugin更新流量记录的间隔,必须是为300-3600秒之间的一个值
 2. 判断命令
 修改/etc/freeradius/sites-enabled/default的authorize一节,插入:
  update request {                 Group-Name := "%{sql:SELECT groupname FROM radusergroup WHERE username='%{User-Name}' ORDER BY priority}" } if ("%{sql: SELECT SUM(acctinputoctets+acctoutputoctets) FROM radacct WHERE username='%{User-Name}' AND date_trunc('day', acctstarttime) >= date_trunc ('month', current_date) AND date_trunc('day', acctstoptime) < = last_day(current_date);}" >= "%{sql: SELECT value FROM radgroupreply WHERE groupname='%{Group-Name}' AND attribute='Max-Monthly-Traffic';}") {  reject  }  该行作用是用户连接时检查本月内上下行流量之和(1日-月末,acctinputoctet+acctoutputoctet),与限制相比较,如果相同或超过则拒绝认证。
 中间使用了自定义函数last_day,所以需要在pgsql中定义。
 3. 定义日期函数
 来自http://wiki.postgresql.org/wiki/Date_LastDay
  CREATE OR REPLACE FUNCTION last_day(date) RETURNS date AS $$  SELECT (date_trunc('MONTH', $1) + INTERVAL '1 MONTH - 1 day')::date; $$ LANGUAGE 'sql' IMMUTABLE STRICT;  4. 定义Max-Monthly-Traffic
 由于这不是Freeradius自带的属性,所以需要在dictionary中定义,否则freeradius不会去读这个属性
 修改/etc/freeradius/dictionary
  加入
  
  Attribute Max-Monthly-Traffic 3003 integer 
  
 重启大功告成。试验的话把流量限制改成1,应该会被拒绝连接。
  
 bug:如果用户一直不断开连接的话就无法拒绝认证了……FreeRADIUS不能踢人下线的。OpenVPN plugin的作者建议在openvpn.conf里加入reneg-sec xx让用户定时重新验证,同时在radiusplugin.cnf中使用useauthcontrolfile=true让用户在验证时不掉线。不过在实 验中useauthcontrolfile=true这条始终没成功过,不知道是什么原因。
 原文:http://tomem.info/blog/2010/07/272
 ===========
 Strongswan-IKEv2+FreeRADIUS VPN配置
  前一篇文章里面提到了用Strongswan替换Openswan的最大理由就是IKEv2和对于Radius的支持,这篇文章继续介绍如何使用Strongswan和Freeradius建立IKEv2 VPN。
 目前支持IKEv2的客户端貌似只有Openswan/Strongswan,Windows的话只有Windows 7和Windows Server 2008 R2完全支持(Vista只支持IKEv1),因而这篇文章主要介绍如何建立Win7客户端能够使用的IKEv2 VPN。
 之所以使用IKEv2而非IKEv1是因为IKEv1目前没有开源的能与Radius连接的插件/客户端,最接近的方案应该是XAuth- PAM+pam_radius。不过pam对于DoS攻击的抵抗很弱,因而不是特别好的一个solution。加上Openswan默认编译是不包含 xauthpam的,在使用二进制包管理的服务器上布置的复杂度会更高。
 IKEv2要求服务器必须以证书证明身份,即使客户端采用MSCHAPv2认证(用户名+密码)。所以第一步是产生服务器使用的证书:
 以下内容来自http://wiki.strongswan.org/projects/strongswan/wiki/IOS_%28Apple%29:
     | 1 | ipsec pki --gen --outform pem > caKey.pem | 
     | 2 | ipsec pki --self --incaKey.pem --dn"C=CH, O=strongSwan, CN=strongSwan CA"--ca --outform pem > caCert.pem | 
       这一步产生CA证书,也是稍后会安装到客户端里面的证书,其中CN(Common Name)的值很重要,必须是服务器的域名/IP地址并且跟给客户的值一样。比如说让客户连接1.2.3.4,那么CN=1.2.3.4。不能是一边是域名而另外一边是IP地址。
     | 1 | ipsec pki --gen --outform pem > serverKey.pem | 
     | 2 | ipsec pki --pub --inserverKey.pem | ipsec pki --issue --cacert caCert.pem --cakey caKey.pem \ | 
     | 3 |           --dn"C=CH, O=strongSwan, CN=vpn.strongswan.org"--flag serverAuth --outform pem > serverCert.pem | 
       这一步里面产生的服务器证书的CN值必须和上一步里面的一样,至于–flag serverAuth是Windows客户端必需的,作用是表示出这个证书的用途(认证)。
 把生成的证书拷到ipsec.d/里面:
     | 1 | cpcaCert.pem /etc/ipsec.d/cacerts/ | 
     | 2 | cpserverCert.pem /etc/ipsec.d/certs | 
     | 3 | cpserverKey.pem /etc/ipsec.d/private/ | 
       最后在/etc/ipsec.secrets里面添加:
  这样服务器端的证书准备工作就完成了。
 客户端需要添加这个证书,否则认证时会出现Error 13801。添加证书的方法见这里:http://wiki.strongswan.org/projects/strongswan/wiki/Win7EapCert,注意必须是Local Computer(本地计算机)而非Current User(当前用户),否则添加的证书不会起效。
 然后配置/etc/strongswan.conf:
 在charon段里面加上:
  然后在plugin段(charon段内部)里面加上:
        | 4 |                                                     secret = yourfreeradiussecret | 
     | 5 |                                                     address = radius.server.address | 
          这样让Strongswan了解Radius服务器地址和暗码。
 接下来修改/etc/ipsec.conf:
           | 7 |            leftcert=serverCert.pem | 
      | 9 |            rightsourceip=vpn.ip.address.range | 
          解释下上面几项的含义:leftsubnet是决定要通过tunnel的ip的范围,0.0.0.0/0是代表所有的IP通讯都通过VPN。 rightsourceip是VPN分配的虚拟地址的范围,也就是客户端登录后得到的IP范围,例如192.168.1.0/24意味着 192.168.0.1-192.168.1.255为VPN客户端可能的地址范围。rightauth=eap-radius是把客户端的EAP认证请 求转发至radius来处理,%any意味着接受任何类型的eap请求。
 配置完成了吗?这样启动后Windows的客户端会提示812错误,因为Windows默认使用的是EAP-MSCHAPv2,而 Freeradius的默认配置是EAP-md5,这可能是Windows的一个bug,目前我的解决方法是直接把Freeradius的 eap.conf里面的default_eap_type修改为mschapv2,如有更好的方法望不吝告知。
 这样就建立了一个IKEv2 IPSec隧道。默认情况下加密方法使用3DES,如有需要的话可以在IPSec的配置段里面加上ike=和esp=来修改加密算法。
 参考:
 http://wiki.strongswan.org/projects/strongswan/wiki/Win7EapCert
 http://wiki.strongswan.org/projects/strongswan/wiki/IOS_%28Apple%29
 http://wiki.strongswan.org/projects/strongswan/wiki/Win7EapMultipleConfig
 还有Strongswan的Mailing list。
 原文:http://tomem.info/blog/2011/10/724
 ===========
 Strongswan+L2TP配置
  由于需要给VPN添加IKEv2,而OpenSwan对于IKEv2的支持只有最基本的部分,更重要的是OpenSwan没有像 Strongswan一样的EAP-RADIUS插件可以实现Stongswan和Freeradius之间的直接通信(IKEv2必须),所以将服务器 上面的OpenSwan换成了Strongswan。
 平台是Debian Squeeze,Strongswan的软件包安装自Debian Squeeze Backports,其余的来自于Debian stable。Debian Backports的作用是给稳定版本的Debian提供一些只有在Tesing/sid里面才有的新版本的软件包,而这些软件又是在stable的环境 下编译的,所以不用担心包依赖方面的问题。
 从Backports安装软件的方法参照这里:http://backports-master.debian.org/Instructions/
 Strongswan需要使用新版本的原因是Stable(Squeeze)里面的版本编译时没有–enable-nat-transport参数,这样的话Strongswan由于默认的安全特性(http://wiki.strongswan.org/projects/strongswan/wiki/FAQ)不允许进行NAT转发,从而无公网IP的客户端是无法与服务器建立连接的。
 服务器结构依然是xl2tpd+swan,只是把OpenSwan换成了Strongswan。xl2tpd的配置跟上一篇 (http://tomem.info/blog/2011/04/577)是一样的,但是Strongswan的配置稍有不同,而错误信息又不是很 informative,花了几个小时才调试成功,所以写下来为后面的作参考。
 几个常见的错误:
 1.
 client.ip.address:4500 #8: NAT-Traversal: Transport mode disabled due to security concerns
 pluto[21315]: “l2tp”[3] client.ip.address:4500 #8: sending encrypted notification BAD_PROPOSAL_SYNTAX to client.ip.address:4500
 这个是由于Strongswan没有编译–enable-nat-transport,因而无法进行NAT传输。
 解决方法:重新编译,加上–enable-nat-transport。
 2.
 pluto[30735]: packet from client.ip.address:500: initial Main Mode message received on server.ip.address:500 but no connection has been authorized with policy=PSK
 这个一般来说是IPSec的secrets错误,但是我在确认Secrets无误的情况下也遇到了这个,http://b.gkp.cc/2010/06/19/setup-ipsec-l2tp-on-centos-55/评论里面的某位仁兄也遇到了这个问题。在几番折腾无果的情况下注意到log里面有这么一行:
 pluto[8384]: packet from client.ip.address:500: ignoring Vendor ID payload [IKE CGA version 1]
 突然意识到Windows的L2TP使用的是IKEv1,而Strongswan默认使用的是IKEv2,会不会是这个问题?试之果然。
 解决:在Strongswan的L2TP的配置段里面加上keyexchange=ikev1。
 3.
 pluto[1243]: “L2TP-PSK-noNAT”[2] client.ip.address:4500 #1: cannot respond to IPsec SA request because no connection is known for server.ip.address:4500[server.ip.address]:17/1701…client.ip.address:4500[client.ip.nat.address]:17/%any===client.ip.nat.address/32
 pluto[1243]: “L2TP-PSK-noNAT”[2] client.ip.address:4500 #1: sending encrypted notification INVALID_ID_INFORMATION to client.ip.address:4500
 这个乍看之下也像是PSK的设置错误,实际上不是。问题出在virtual_network的设置上面。
 解决:Strongswan的setup段里面加上virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12。
 配置文件范例:
  
     | 1 | # ipsec.conf - strongSwan IPsec configuration file | 
                | 13 |         virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12 | 
      | 15 | # Add connections here. | 
       | 18 |         rightsubnet=vhost:%priv | 
               | 29 |         left=server.ip.address | 
     | 30 |         leftnexthop=%defaultroute | 
       | 33 |         rightprotoport=17/%any | 
       原文:http://tomem.info/blog/2011/10/721
            来源: http://igfw.tk/archives/6273
 ————————————————————————————————————————— 
需要翻墙利器? 请安装Wuala,查找和添加gfwblog为好友,就可高速下载翻墙软件,或访问http://tinyurl.com/gfwblog 直接下载。
 更多翻墙方法请发电邮(最好用Gmail)到:fanqiang70ma@gmail.com
 请阅读和关注中国数字时代、翻墙技术博客GFW BLOG 请使用Google Reader订阅中国数字时代中文版(http://chinadigitaltimes.net/chinese/feed),阅读最有价值的中文信息;以及GFW BLOG(功夫网与翻墙) http://feeds2.feedburner.com/chinagfwblog,获取最新翻墙工具和翻墙技巧信息。
 
 
没有评论:
发表评论