Freeradius Server & Freeradius Client with Poptop Server and L2TP Over IPSec(可统计流量)

本文于2014年3月22日发布,2014年9月8日更新。

此Shell Script可选择安装Freeradius Server,Freeradius Client,Poptop Server(PPTP),L2TP Over IPSec。

其中Freeradius Server是提供验证服务,Freeradius Client与Freeradius Server通讯,至于Poptop Server和L2TP嘛,你懂的。

目前支持的Linux发行版本有:CentOS 6,Debian 6/7/8,Ubuntu 12/13/14。

要安装Freeradius Server,要求有一个可用的MySQL Server。


 

安装前服务器的配置:

先确定服务器的hostname为正确的FQDN格式。不带“.”的hostname是错误的。

执行:

输出的内容应该是你服务器的IP(使用NAT网络,输出的是内网IP),否则请执行:

 

1. 安装各种相关程序:

CentOS 6:

安装并启动MySQL Server:

设置MySQL root用户密码:

安装wget:

Ubuntu/Debian:

安装并启动MySQL Server:

安装wget:

2. 开始安装

填写的相关信息:

安装信息

选项2会额外要求输入Freeradius Server的IP以及通讯密钥。

看到“Enjoy it now.”,即表示已成功安装。


添加用户:

在radcheck中添加响应的记录即可,例如添加一个用户名为username,密码为password的用户,密码以明文保存,可执行:

 

流量统计&限制:

使用本Shell Script安装的Freeradius Server,可使用三种不同周期的流量统计&限制方式,分别为一小时(Hourly-Traffic),一天(Daily-Traffic)和一个月(Monthly-Traffic)。

例如要限制用户名为username的用户一个月流量为1GB,即1024 MB,则在表radcheck中插入响应的记录,执行:

其中流量的单位为Mbytes。

至于更多的功能,我就不在此作文章了,各位可自行查看Freeradius的WIKI。


 

关于OpenVZ的问题:

可能有人会问支不支持OpenVZ。

如果准确来说的话,各位不应该问我的Shell Script支不支持OpenVZ,而应该问你的OpenVZ VPS支不支持我的Shell Script。

OpenVZ须具备下述条件方可使用PPTP,L2TP以及IPSec:

1. OpenVZ VPS拥有以下设备文件以及对其操作的权限:

2. 物理服务器已开启以下模块:

3. OpenVZ VPS拥有IPTABLES NAT模块的权限。

可通过执行此命令进行检查:

不出现

则表示拥有IPTABLES NAT模块的权限。


 

PPTP,L2TP的使用方法:http://www.ipfog.com/knowledgebase.php?action=displaycat&catid=5

《Freeradius Server & Freeradius Client with Poptop Server and L2TP Over IPSec(可统计流量)》上有84条评论

  1. d 36
    已经安装完毕, 新建了个账号,为什么我拨号的时候显示691错误呢?

  2. 不得不说,将来有干程序猿的潜力,搞得不好还能兼职运维。
    高中生可畏。加油,努力实现自己的抱负!

  3. 我用副VPS的freeradius去连接主VPS的freeradius服务器,但拨号一直上不去呀,有没有什么要特别设置的。。。或者有没有具体的设置教程呀?本人做不到呀!!!

    1. 看你的说法,就可以得知你不清楚Radiusclient与Freeradius Server的关系。
      如果只会照搬教程,不理解其中用意,你永远也学不会。

      1. 我确实是刚接触,这倒已经解决了,但还有个问题:装freeradius客户端,L2tp连接不上呀。错误789 d9

        1. 我自己也用这个安装,并且目前正在使用,并未遇到你所提及的问题。
          请根据本文的相关内容,自行检查是否具备使用L2TP与IPSec的条件。

          1. 条件都满足的,我应该如何看错误日志?我得具体分析什么原因了,新上的两个vps都是这样

            1. 我在KVM上的VPS上测试成功了啊。就是用的LZ的一键的代码。。。PPTP、L2TP都行。

          1. 确实呀。。。。我一直用centos 这个一键操作里没有好的解决方法吗?

      1. 但是从开始就要监听不同的ip
        要设置多个pptpd.conf文件,然后防火墙插入新的nat转到多个ip
        是这样?

  4. 我试了下,好像VPN链接有问题。(单选VPN安装也是如此)
    ipsec verify下有2个error。

      1. 我的L2TP/IPSEC已经事先安装好了,可以工作了。
        可以给个Freeradius Server,Freeradius Client,Poptop Server(PPTP)的script吗?

      2. 我用的linode vps, 是可以用IPSEC的。
        一键安装后,用xl2tpd -D无法监听到远端的连线。
        但是auth.log中能看到有机台连线,但是显示unknow user。(已建立用户)。

          1. 已经在option/xl2tpd下添加如下插件了,并添加用户于radius数据库,但还是unknow用户。
            plugin /usr/lib/pppd/2.4.5/radius.so
            plugin /usr/lib/pppd/2.4.5/radattr.so
            (只要注解掉这两行,PPP验证就是没有问题的)

            1. 你没理解我说的话吧?
              我的意思是用户由Freeradius管理,就应该到Freeradius的数据库查看登录记录。
              刚刚测试了一下,不管有没有启用radius模块,-D参数均能正常使用,可以看到具体链接。
              此外,未在auth.log找到任何一行有unknown user。

  5. 问下 为什么在数据库添加以下语句后,限制的是连接时间而不是流量?
    INSERT INTO radcheck (id,username,attribute,op,value) VALUES (”,’username’,’Monthly-Traffic’,’:=’,’1024′)
    1024秒后断开 100就100秒断开 200就200秒断开
    还有group的功能是不是全失效了?

    1. 主要是32位系统的问题,最大的整数是2的31次方,也就是2 Gbytes左右,超过这个数会出问题,所以我在MySQL SELECT的时候就换成了Mbytes作为单位,自然radcheck也要Mbytes作为单位,但是reply的数值的单位无法更改,默认就是Bytes的,因此我删掉了reply-name,结果sqlcounter自动加了一个session-timeout的reply,所以就变成超时自动断开了。
      我得想个办法,同时解决32位操作系统的问题,又解决reply的问题……

        1. 流量限制可以了
          INSERT INTO radgroupreply (groupname,attribute,op,VALUE) VALUES (‘VIP1′,’Acct-Interim-Interval’,’:=’,’60’);
          上面这句更新流量到数据库没法用了。。不过也问题不大
          不过 用group来限制流量真的是没用。。。 一加流量限制就出问题

          1. 不知道你哪里找来Acct-Interim-Interval。
            如果你用我的,加的attribute是Monthly-Traffic ,不出问题才怪,Request For Comments的Radius协议中中根本没Monthly-Traffic这个attribute,肯定无法连接。
            请你把radgroupreply替换为radgroupcheck。
            Group功能一切正常,只是操作上的问题,照搬别人的肯定有问题。

          2. 我只说这些,你不会相信。

            实践是检验真理的唯一标准。

            特意刚刚重新安装VPS的操作系统,并安装了相关的服务。

            NOTE: Access-Accept packet表示通过验证,Access-Reject packet表示不通过验证。

            添加用户,并使用radtest测试:
            root@level-3:~# echo “INSERT INTO radcheck (id,username,attribute,op,value) VALUES (”,’username’,’Cleartext-Password’,’:=’,’password’)” | mysql radius root@level-3:~# radtest username password localhost 0 testing123 | grep -i pack
            rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, id=95, length=20

            给该用户设置流量限制值,并使用radtest测试:
            root@level-3:~# echo “INSERT INTO radcheck (id,username,attribute,op,value) VALUES (”,’username’,’Monthly-Traffic’,’:=’,’1024′)” | mysql radius
            root@level-3:~# !radt
            radtest username password localhost 0 testing123 | grep -i pack
            rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, id=4, length=20

            使用PPTP CLIENT,并用此用户的信息链接,断开后更改此用户的此次链接的出网流量使用值为2048 Mbytes,并使用radtest测试:
            root@level-3:~# echo “UPDATE radacct set acctoutputoctets=’$((2048 * 1024 * 1024))’ WHERE username=’username'” | mysql radius
            root@level-3:~# !radt
            radtest username password localhost 0 testing123 | grep -i pack
            rad_recv: Access-Reject packet from host 127.0.0.1 port 1812, id=34, length=70
            可见无法通过验证,因为流量超过限制值了。

            删除针对该用户所设置的流量限制值,并使用radtest做测试:
            root@level-3:~# echo “DELETE FROM radcheck WHERE attribute=’Monthly-Traffic’ AND username=’username'” | mysql radius
            root@level-3:~# !radtest
            radtest username password localhost 0 testing123 | grep -i pack
            rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, id=62, length=20

            把该用户加入groupone用户组,并为该用户组设置流量限制值,接着使用radtest测试:
            root@level-3:~# echo “INSERT INTO radusergroup (username,groupname,priority) VALUES (‘username’,’guoupone’,’1′)” | mysql radius
            root@level-3:~# echo “INSERT INTO radgroupcheck (id,groupname,attribute,op,value) VALUES (”,’guoupone’,’Monthly-Traffic’,’:=’,’1024′)” | mysql radius
            root@level-3:~# !radtest
            radtest username password localhost 0 testing123 | grep -i pack
            rad_recv: Access-Reject packet from host 127.0.0.1 port 1812, id=243, length=70

            更改此用户已使用的出网流量的值为512 Mbytes,使用radtest做测试:
            root@level-3:~# echo “UPDATE radacct set acctoutputoctets=’$((256 * 1024 * 1024))’ WHERE username=’username'” | mysql radius
            root@level-3:~# !radtest
            radtest username password localhost 0 testing123 | grep -i pack
            rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, id=22, length=20

            从上面的测试中,可以发现用户组功能无任何问题,流量限制功能工作正常。

              1. 我的这个Shell Script从来没添加过使用”Max-Monthly-Traffic”这个attribute的模块,你之前能用是因为你之前自己按照别人的文章添加了一个模块。

                我的是我的,别人的是别人的,请你不要混用,如果你硬要混用,那么出现的问题都是你自己找的。

        2. 在测试中,我多次链接,无出现你所提及的问题,这是我其中一次使用PPTP Client链接PPTP时所输出的信息:
          [root@localhost ~]# pptpsetup –create america –server PPTP服务器IP –username username –password password –encrypt –start
          Using interface ppp0
          Connect: ppp0 <--> /dev/pts/1
          CHAP authentication succeeded
          MPPE 128-bit stateless compression enabled
          local IP address 1.2.3.2
          remote IP address 1.2.3.1

          使用ifconfig查看链接:
          [root@localhost ~]# ifconfig | egrep “^ppp”
          ppp0 Link encap:Point-to-Point Protocol

          [root@localhost ~]# ifconfig ppp0
          ppp0 Link encap:Point-to-Point Protocol
          inet addr:1.2.3.2 P-t-P:1.2.3.1 Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1496 Metric:1
          RX packets:6 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:78 (78.0 b) TX bytes:116 (116.0 b)

          可见PPTP工作正常。
          你出现的错误,很可能是你的服务器操作系统自身问题所导致的,如果你使用的是OpenVZ VPS,请检查是否已具备本文所提及的条件。

          1. 并且之前脚本未更新之前 Acct-Interim-Interval
            这个参数是可以用的 因为 更新前后 我在数据库加的参数都是一样的
            就是现在的不能用了

            1. 刚刚测试了,完全正常:

              root@level-3:~# !radtest
              radtest username password localhost 0 testing123
              Sending Access-Request of id 65 to 127.0.0.1 port 1812
              User-Name = “username”
              User-Password = “password”
              NAS-IP-Address = 服务器IP
              NAS-Port = 0
              Message-Authenticator = 0x00000000000000000000000000000000
              rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, id=65, length=20
              root@level-3:~# echo “INSERT INTO radreply (username,attribute,op,value) VALUES (‘username’,’Acct-Interim-Interval’,’:=’,’10’)” | mysql radius
              root@level-3:~# !rad
              radtest username password localhost 0 testing123
              Sending Access-Request of id 66 to 127.0.0.1 port 1812
              User-Name = “username”
              User-Password = “password”
              NAS-IP-Address = 服务器IP
              NAS-Port = 0
              Message-Authenticator = 0x00000000000000000000000000000000
              rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, id=66, length=26
              Acct-Interim-Interval = 10

              1. Acct-Interim-Interval这个是刷新间隔吧 向数据库根据设置的时间写入数据

  6. radutmp建议注销掉,启用数据库之后用这个会导致异常断线或者程序kill后开启了连接数控制的拨不上线的

评论已关闭。