Unix Like, 操作系统, 服务器, 未分类

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是错误的。

执行:

hostname -i

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

echo "服务器IP $(hostname -A)" >> /etc/hosts

 

1. 安装各种相关程序:

CentOS 6:

安装并启动MySQL Server:

yum install -y mysql-server mysql-devel mysql-client

service mysqld restart

设置MySQL root用户密码:

/usr/bin/mysqladmin -u root password 'root用户密码'

安装wget:

yum install -y wget

Ubuntu/Debian:

安装并启动MySQL Server:

apt-get update && apt-get install -y mysql-server

安装wget:

apt-get install -y wget

2. 开始安装

wget http://soft.yzs.me/freeradius.sh -O /tmp/freeradius.sh && bash /tmp/freeradius.sh

填写的相关信息:

1. CentOS 6
2. Ubuntu/Debian
Select your operating system(1 or 2):2        #此处选择系统的发行版本,1为CentOS 6,2为Ubuntu或Debian
Install selection
==========
1. FreeRadius Server with FreeRadius Client,Poptop Server and L2TP Over IPSec(Require MySQL Server).
2. FreeRadius Client,Poptop Server and L2TP Over IPSec(Require FreeRadius Server communication secret).
3. FreeRadius Server Only(Require MySQL Server).
4. Poptop Server Only
5. L2TP Over IPSec Only
==========
Please choose a selection(1,2,3,4 or 5):1        #此处选择要安装的程序
Input the MySQL root password:9p_VbAAduxMXriWfke37_6NXYNGsw2W0EF85E3bqRnNCx0wPI0        #此处输入MySQL的root密码
Set the MySQL password of user radius(Leave blank to create automatically):        #此处输入要在MySQL中新建的radius用户的密码,留空可自动生成
Set the MySQL password of user radius to 8b66e9f5dc29b07752093c9d5f5029c0
127.0.0.2
208.51.63.115
192.168.0.56
Select your IP:208.51.63.115        #此处输入你的服务器的IP
Please input the IPSec PSK:P9oqRR8eru8d1SnOUwZ7jAIPPqx4Wv        #此处输入IPSec的PSK

安装信息

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

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


添加用户:

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

echo "INSERT INTO radcheck (id,username,attribute,op,value) VALUES ('','username','Cleartext-Password',':=','password')" | mysql -u root -p radius

 

流量统计&限制:

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

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

echo "INSERT INTO radcheck (id,username,attribute,op,value) VALUES ('','username','Monthly-Traffic',':=','1024')" | mysql -u root -p radius

其中流量的单位为Mbytes。

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


 

关于OpenVZ的问题:

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

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

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

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

/dev/ppp
/dev/tun

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

af_key
esp4
ppp_async
ppp-compress-18
ppp_deflate
ppp_generic
ppp_mppe
pppoatm
pppol2tp
tun
xfrm4_mode_transport
xfrm4_mode_tunnel
xfrm_ipcomp

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

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

iptables -L -n -t nat

不出现

can’t initialize iptables table `nat': Table does not exist (do you need to insm Perhaps iptables or your kernel needs to be upgraded.

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


 

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

101 Posts

自信、努力、活出精彩;以前未所见的颜色,绘大千世界!
View all posts

84 thoughts on “Freeradius Server & Freeradius Client with Poptop Server and L2TP Over IPSec(可统计流量)”

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

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

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

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

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

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

  2. 我试了下,好像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。

  3. 问下 为什么在数据库添加以下语句后,限制的是连接时间而不是流量?
    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

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

Leave a reply

Your email address will not be published. Required fields are marked *