一、PPTP安装

安装
#yum -y groupinstall "Development tools"
#yum -y install pcre pcre-devel gzip gzip-devel zlib zlib-devel cmake ncurses ncurses-devel openssl openssl-devel bzip2-devel curl-devel openldap-devel libevent-devel nss-devel
#yum -y install epel-release


配置/etc/pptpd.conf
内容如下:
    option /etc/ppp/options.pptpd 
    localip 192.168.1.1 
    remoteip 192.168.1.2-200

    说明:localip 为vpn接口IP,remoteip 为vpn客户端配置IP


配置/etc/ppp/options.pptpd 
内容如下:  
    name pptpd    
    refuse-pap    
    refuse-chap    
    refuse-mschap    
    require-mschap-v2    
    require-mppe-128    
    ms-dns 8.8.8.8 
    proxyarp
    lock
说明:
    name pptpd : pptpd server 的名称。
    refuse-pap : 拒绝 pap 身份验证模式。
    refuse-chap : 拒绝 chap 身份验证模式。
    refuse-mschap : 拒绝 mschap 身份验证模式。
    require-mschap-v2 : 在端点进行连接握手时需要使用微软的 mschap-v2 进行自身验证。
    require-mppe-128 : MPPE 模块使用 128 位加密。
    ms-dns 8.8.8.8 DNS服务器IP
    proxyarp : 建立 ARP 代理键值。
    debug : 开启调试模式,相关信息同样记录在 /var/logs/message 中。

    lock : 锁定客户端 PTY 设备文件。


配置vpn账号和密码
/etc/ppp/chap-secrets
内容如下:
    client    server    secret    IP addresses 
    "test"   pptpd    "pass"   *

说明:pptpd 名必须与/etc/ppp/pptpd-pptpd 文件中的相同


开机启动pptpd
chkconfig pptpd on
echo 1 > /proc/sys/net/ipv4/ip_forward 
/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

注:eth0 为服务器外网网卡


关于MTU
有些网站通过pptpd 访问,发现MTU值大于pptpd默认的MTU值1492,导致有些网站无法访问。或者只出现部分内容

需要修改pptpd的MTU值来解决。


配置/etc/ppp/ip-up
[ -x /etc/ppp/ip-up.local ] && /etc/ppp/ip-up.local "$@"
ifconfig $1 mtu 1496     #修改MTU值。当用户pptpd连接时自动将MTU 值设置为1946

exit 0


二、IPSEC+L2TPD安装配置
软件包
openswan    #IPSEC

xl2tpd         #L2TP


安装

   # yum install openswan


配置/etc/ipsec.conf
内容如下:
    version 2.0
    config setup
        nat_traversal=yes
        virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12
        oe=off
        protostack=netkey
    conn L2TP-PSK-NAT
        rightsubnet=vhost:%priv
        also=L2TP-PSK-noNAT
    conn L2TP-PSK-noNAT
        authby=secret
        pfs=no
        auto=add
        keyingtries=3
        rekey=no
        ikelifetime=8h
        keylife=1h
        type=transport
        left=22.22.22.22
        leftprotoport=17/1701
        right=%any
        rightprotoport=17/%any

说明:22.22.22.22为VPN服务器外网IP


配置 PSK /etc/ipsec.secrets
内容如下:
    22.22.22.22 %any: PSK "pass"

说明:PSK "pass" 为IPSEC 共享密钥


配置包转发
    for i in /proc/sys/net/ipv4/conf/*
    do
        echo 0 > $i /accept_redirects
        echo 0 > $i /send_redirects
   done

   echo 1 > /proc/sys/net/ipv4/ip_forward 


测试IPSEC是否成功
   # /etc/init.d/ipsec start
   # ipsec verify
        Checking your system to see if IPsec got installed and started correctly:
        Version check and ipsec on-path                                 [OK]
        Linux Openswan U2.6.32/K2.6.18-194.8.1.el5 (netkey)
        Checking for IPsec support in kernel                            [OK]
        SAref kernel support                                           [N/A]
        NETKEY:  Testing for disabled ICMP send_redirects              [OK]
        NETKEY detected, testing for disabled ICMP accept_redirects     [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                                  [OK]
        Checking for 'ip' command                                       [OK]
        Checking /bin/sh is not /bin/dash                               [OK]
        Checking for 'iptables' command                                 [OK]
        Opportunistic Encryption Support                                [DISABLED]

无FAIL,则配置成功

PS:如果出现以下错误,缺少nss-devel安装包

Failed to initialize nss database sql:/etc/ipsec.d

#yum -y install nss-devel


安装xl2tpd

  安装xl2tpd 依赖于libpcap-devel

#yum install libpcap-devel

# yum install xl2tpd.x86_64


修改配置文件 /etc/xl2tpd/xl2tpd.conf
内容如下:
  [global]
  ipsec saref = yes
  [lns default]
  ip range = 192.168.1.2-200
  local ip = 192.168.1.1
  refuse chap = yes
  refuse pap = yes
  require authentication = yes
  ppp debug = yes
  pppoptfile = /etc/ppp/options.xl2tpd
  length bit = yes
  说明:192.168.1.2-200 为分配给客户端的IP地址范围

         192.168.1.1 为VPN服务器l2tp接口地址


修改配置文件 /etc/ppp/options.xl2tpd
内容如下:
  name l2tpd
  ipcp-accept-local
  ipcp-accept-remote 
  ms-dns 8.8.8.8
  noccp
  auth
  crtscts 
  idle 1800 
  mtu 1410 
  mru 1410  
  nodefaultroute
  debug   
  lock
  proxyarp     

  connect-delay 5000


配置密码/etc/ppp/chap-secrets
内容如下:
  test pptpd testpass *
  test l2tpd testpass *
说明:pptpd为pptp类型用户,这里的名称应该与options.pptpd配置文件定义名称里相同

       l2tpd为l2tpd类型用户,这里的名称应该与options.xl2tpd配置文件定义名称里相同


三、REDIUS 配置
软件包
    freeradius-client

    freeradius-server


freeradius-client安装
    # wget ftp://ftp.freeradius.org/pub/freeradius/freeradius-client-1.1.6.tar.gz
    # tar zxf freeradius-client-1.1.6.tar.gz
    # cd freeradius-client-1.1.6

    # make && make install


freeradius-server安装
    # wget ftp://ftp.freeradius.org/pub/freeradius/freeradius-server-2.1.12.tar.gz
    # tar zxf freeradius-server-2.1.12.tar.gz
    # cd freeradius-server-2.1.12

    # make && make install


配置radius-client
将radiusclient目录复制到/etc目录下

    # cp -rf /usr/local/etc/radiusclient/ /etc/


添加radius认证
修改配置文件/etc/ppp/options.pptpd
添加如下内容:
    plugin /usr/lib/pppd/2.4.4/radius.so

说明:如果是l2tp,则修改/etc/ppp/options.xl2tpd文件


修改配置文件/etc/radiusclient/servers
添加如下内容:
    localhost          testing123

说明:localhost 为radiusd地址,testing123为密码


配置/etc/radiusclient/radiusclient.conf
    将   radius_deadtime      0    注释
    将   bindaddr                 *   注释
将radiusclient.conf文件中的/usr/local/etc/radiusclient路径替换为/etc/radiusclient

    # grep /usr/local radiusclient.conf | grep -v sbin | sed -i 's/\/usr\/local//g' radiusclient.conf


配置radius-server
添加radius用户
修改配置文件/usr/local/etc/raddb/users
添加如下内容:
    test   Cleartext-Password := "test",Simultaneous-Use:=1
         Service-Type = Framed-User,
         Framed-Protocol = PPP,
         Framed-IP-Address = 255.255.255.254,
         Framed-IP-Netmask = 255.255.255.0
说明:test为用户名,密码为test
      Simultaneous-Use 限制同一用户登录数,这项设置要写在与用户名同一行,否则不生效。

      Framed-IP-Address = 255.255.255.254,表示IP地址分配交给radius客户端,pptpd或者l2tpd


添加windows客户端支持
    # wget -c http://small-script.googlecode.com/files/dictionary.microsoft

    # mv dictionary.microsoft /etc/radiusclient


修改配置文件/etc/radiusclient/dictionary

在文件后面添加如下内容:
    INCLUDE /etc/radiusclient/dictionary.microsoft
    INCLUDE /etc/radiusclient/dictionary.ascend
    INCLUDE /etc/radiusclient/dictionary.merit
    INCLUDE /etc/radiusclient/dictionary.compat

    INCLUDE /etc/radiusclient/dictionary.sip


测试radius用户
启动radiusd
    # cp /usr/local/sbin/rc.radiusd /etc/init.d/radiusd 

    # /etc/init.d/radiusd start


如要调试
    # /etc/init.d/radiusd -X
/etc/init.d/radiusd -X 可显示radius用户登录详细过程
    # radtest test test 127.0.0.1 1812  testing123
    Sending Access-Request of id 103 to 127.0.0.1 port 1812
        User-Name = "test"
        User-Password = "test"
        NAS-IP-Address = 127.0.0.1
        NAS-Port = 1812
        Message-Authenticator = 0x00000000000000000000000000000000
    rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, id=103, length=44
        Service-Type = Framed-User
        Framed-Protocol = PPP
        Framed-IP-Address = 255.255.255.254
        Framed-IP-Netmask = 255.255.255.0

如出现rad-recv:Access-Accept 下面几行,说明认证成功。


添加自启动脚本/etc/rc.local
    # vpn server start
    /usr/sbin/pptpd
    /sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    # xl2tpd start
    for i in /proc/sys/net/ipv4/conf/*
    do
        echo 0 > $i/accept_redirects
        echo 0 > $i/send_redirects
    done
    /etc/init.d/ipsec start
    /usr/local/sbin/xl2tpd
    /usr/local/sbin/radiusd
  
四、RADIUS+MYSQL配置
创建radius数据库

    mysql> create database radius;


创建radius用户名和密码
    mysql> grant all on radius.* to 'radius'@'localhost'  identified by 'pass';

    mysql>flush privileges;


导入SQL
    # cd /usr/local/etc/raddb/sql/mysql/
    # mysql -uradius -ppass radius < ippool.sql
    # mysql -uradius -ppass radius < schema.sql
    # mysql -uradius -ppass radius < cui.sql
    # mysql -uradius -ppass radius < nas.sql

    # mysql -uradius -ppass radius < wimax.sql


导入web管理所需SQL
将freeradius-server解压目录下的dialup_admin文件及目录复制到/usr/local目录下。
    # cp -rf /soft/freeradius-server-2.1.12/dialup_admin/ /usr/local
说明:最好将dialup_admin复制到/usr/local目录下,否则web访问将报路径错误。
    # cd /usr/local/dialup_admin/sql/mysql
    # mysql -uradius -ppass radius < badusers.sql
    # mysql -uradius -ppass radius < mtotacct.sql
    # mysql -uradius -ppass radius < totacct.sql

    # mysql -uradius -ppass radius < userinfo.sql


启用MYSQL 认证
安装mysql-devel包
    # yum install mysql-devel

说明:如不安装mysql-devel软件包,后面的radius+mysql认证会报错,缺少rlm_sql_mysql.so文件。


修改配置文件/usr/local/etc/raddb/radiusd.conf

    将$INCLUDE sql.conf 前面的#去掉


修改配置文件/usr/local/etc/raddb/sql.conf

    修改login用户名,password密码,这里的用户名密码应与上面创建radius用户名和密码相同。


修改配置文件/usr/local/etc/raddb/sites-enabled/default
    找到authorize {}模块     注释掉 files (170行)           去掉 sql前面#号 (177行)
    找到accounting {}模块   注释掉 radutmp (396行)    去掉 sql前面#号 (406行)
    找到session {}模块        注释掉 radutmp (450行)    去掉 sql前面#号 (454行)

    找到post-auth {}模块    注释掉 sql (563行)


修改配置文件/usr/local/etc/raddb/sites-enabled/inner-tunnel

    找到authorize {}模块,注释掉files(124行),去掉sql前的#号(131行)


修改配置文件/usr/local/etc/raddb/sql.conf
    去掉 readclients = yes 前的#号去掉 (100行)

说明:开启数据库nas支持,否则无法限制同一用户登录数。


修改配置文件/usr/local/etc/raddb/sql/mysql/dialup.conf
    找到以下内容,将前面的#号去掉(279-282行)
        simul_count_query = "SELECT COUNT(*) \
                             FROM ${acct_table1} \
                             WHERE username = '%{SQL-User-Name}' \
                             AND acctstoptime IS NULL"

说明:开启在线人数查询支持


RADIUS 用户管理
添加用户test,密码为test

INSERT INTO radcheck (username,attribute,op,VALUE) VALUES ('test','Cleartext-Password',':=','test');


将用户test添加到group1组

INSERT INTO radusergroup (username,groupname) VALUES ('test','group1');


限制同一用户登录数,限制group1组用户同时登录数为10INSERT INTO radgroupcheck (groupname,attribute,op,VALUE) VALUES ('group1','Simultaneous-Use',':=','10');


RADIUS用户也可使用web界面管理
配置Apache
新增vhost虚拟主机配置radius.conf,内容如下:
    <VirtualHost *:80>
        DocumentRoot "/usr/local/dialup_admin"
        ServerName www.test.com
        DirectoryIndex index.html index.php
    </VirtualHost>
    <Directory "/usr/local/dialup_admin">
        Options Indexes
        AllowOverride None
        Order allow,deny
        Allow from all 
   </Directory>

可通过 http://www.test.com/htdocs 地址管理RADIUS用户。


五、TC 限速
TC 无需安装,Linux 内核自带
例:将vpn IP地址段192.168.1.0/24 上传下载限速为 5M
将以下内容添加到/etc/ppp/ip-up文件exit 0上面。
down=5Mbit
upload=5Mbit
#down
/sbin/tc qdisc add dev $1 root handle 2:0 htb
/sbin/tc class add dev $1 parent 2:1 classid 2:10 htb rate $down
/sbin/tc class add dev $1 parent 2:2 classid 2:11 htb rate 1024kbps
/sbin/tc qdisc add dev $1 parent 2:10 handle 1: sfq perturb 1
/sbin/tc filter add  dev $1 protocol ip parent 2:0  u32 match ip dst 192.168.1.0/24  flowid 2:10
#upload
/sbin/tc qdisc add dev $1 handle ffff: ingress
/sbin/tc filter add dev $1 parent ffff: protocol ip  u32 match ip dst \
   192.168.1.0/24 police  rate $upload burst 100k drop flowid 2:11
说明:$1为网络设备接口名称,如ppp0,ppp1......
       第4行建立qdisc队列
       第5行建立类,限速5M
       第7行为了不使一个会话永占带宽,添加随机公平队列sfq
       第8行建立过滤器规则,对192.168.1.0/24下载限速为5M

       第10-12行限制192.168.1.0/24上传限速为5M


删除所有 TC 限速规则

    # tc qdisc del dev ppp0 root


显示qdisc队列状态

    # tc -s -d qdisc show dev ppp0


显示class类状态

    # tc -s -d class show dev ppp0


显示filter规则状态

    # tc -s -d filter show dev ppp0


参考文档
TC 
http://www.php-oa.com/2009/06/23/linux_tc.html

https://wangyan.org/blog/freeradius-pptp-l2tp-html.html