Настройка PPPoE под FreeBSD :: Настройка PPTP под FreeBSD

  Статья: Настраиваем PPPoE сервер на FreeBSD используя порт MPD5 
  Статья: PPPoE сервер на встроенном в FreeBSD демоне pppoed 

Пример конфигурационых файлов для поднятия серверов PPTP и PPPoE ( + Radius ) на FreeBSD (MPD)
Пример конфигурационых файлов для клиентской части PPPoE

(Linux, FreeBSD, OpenBSD, Mac OS X Leopard (10.5), Mac OS X Tiger (10.4), OS/2)

Пример конфигурационых файлов для клиентской части PPTP на FreeBSD
Пример поднятия роутинга при коннекте

сервер PPPoE

Сервер: /usr/libexec/pppoed
Запуск: /usr/libexec/pppoed -a HOSTNAME -p PROVIDER_NAME -l pppoe IFACE_NAME

File /etc/ppp/ppp.conf
pppoe:
  set timeout 0
  set log Phase tun Chat Command Warning Error Alert Connect lcp ipcp
  set mtu 1450
  set mru 1450
  set speed sync
  set server /var/tmp/pppuser%d "" 0177
  allow mode direct
  disable acfcomp protocomp deflate pred1 pap
  deny acfcomp protocomp deflate pred1 pap
  enable chap chap81 mppe lqr
  set dns 1.1.1.1 2.2.2.2
  accept dns

File /etc/ppp/ppp.secret
login password 10.0.0.36 * *
guest guest 10.255.255.2-10.255.255.254 * *


сервер PPPoE + Radius

Сервер pppoe: /usr/libexec/pppoed
Radius: /usr/ports/net/freeradius

File /etc/ppp/ppp.conf

default:

pppoe:
  set timeout 0
  set log Phase tun Chat Command Warning Error Alert Connect lcp ipcp
  set mtu 1450
  set mru 1450
  set speed sync
  set server /var/tmp/pppuser%d "" 0177
  allow mode direct
  disable acfcomp protocomp
  deny acfcomp
  disable deflate pred1 
  deny deflate pred1 
  disable pap 
  enable chap
  enable chap81
  enable MSCHAPv2 
  set dns 1.1.1.1 2.2.2.2
  accept dns
  enable lqr
  set radius /etc/radius.conf

File /etc/radius.conf 
auth    RADIUS_SERVER_IP     password
acct    RADIUS_SERVER_IP     password

File /usr/local/etc/raddb/clients.conf
client localhost {
        secret          = testtest
        shortname       = localhost
}

File /usr/local/etc/raddb/radiusd.conf
prefix = /usr/local
exec_prefix = ${prefix}
sysconfdir = ${prefix}/etc
localstatedir = /var
sbindir = ${exec_prefix}/sbin
logdir = /var/log
raddbdir = ${sysconfdir}/raddb
radacctdir = ${logdir}/radacct

#  Location of config and logfiles.
confdir = ${raddbdir}
run_dir = ${localstatedir}/run/radiusd
log_file = ${logdir}/radius.log
libdir = ${exec_prefix}/lib
pidfile = ${run_dir}/radiusd.pid

user = nobody
group = nobody

max_request_time = 30
delete_blocked_requests = no
cleanup_delay = 5
max_requests = 1024

bind_address = *
#bind_address = 127.0.01
port = 0
#listen {
#       ipaddr = *
#       port = 0
#       type = auth
#}

hostname_lookups = no

allow_core_dumps = no

regular_expressions     = yes
extended_expressions    = yes

log_stripped_names = no
log_auth = yes
log_auth_badpass = yes
log_auth_goodpass = no

usercollide = no

lower_user = no
lower_pass = no
nospace_user = no
nospace_pass = no

#  The program to execute to do concurrency checks.
checkrad = ${sbindir}/checkrad

# SECURITY CONFIGURATION
security {
        max_attributes = 200
        reject_delay = 1
        status_server = no
}

# PROXY CONFIGURATION
proxy_requests  = no
#$INCLUDE  ${confdir}/proxy.conf


# CLIENTS CONFIGURATION
$INCLUDE  ${confdir}/clients.conf


# SNMP CONFIGURATION
snmp    = no
#$INCLUDE  ${confdir}/snmp.conf


# THREAD POOL CONFIGURATION
thread pool {
        start_servers = 5
        max_servers = 32
        min_spare_servers = 3
        max_spare_servers = 10
        max_requests_per_server = 0
}

# MODULE CONFIGURATION
modules {

        pap {
                encryption_scheme = crypt
        }

        chap {
                authtype = CHAP
        }

        mschap {
                authtype = MS-CHAP
                #use_mppe = no
                #require_encryption = yes
                #require_strong = yes
                #with_ntdomain_hack = no
        }

        acct_unique {
                key = "User-Name, Acct-Session-Id, NAS-IP-Address, Client-IP-Address, NAS-Port"
        }

$INCLUDE  ${confdir}/sql.conf

        radutmp {
                filename = ${logdir}/radutmp
                username = %{User-Name}
                case_sensitive = yes
                check_with_nas = yes            # ??
                callerid = "yes"
        }

        radutmp sradutmp {
                filename = ${logdir}/sradutmp
                perm = 0644
                callerid = "no"
        }

        attr_filter {
                attrsfile = ${confdir}/attrs
        }

        always fail {
                rcode = fail
        }

        always reject {
                rcode = reject
        }

        always ok {
                rcode = ok
                simulcount = 0
                mpp = no
        }

        expr {
        }

        digest {
        }

}

instantiate {
}

authorize {
        chap
        mschap
        sql
}


authenticate {

        Auth-Type PAP {
                pap
        }

        Auth-Type CHAP {
                chap
        }

        Auth-Type MS-CHAP {
                mschap
        }
}

preacct {
}

accounting {
        sql
}

session {
        sql
}

post-auth {
}

File /usr/local/etc/raddb/sql.conf
sql {
        driver = "rlm_sql_mysql"
        server = "localhost"
        login = "root"
        password = ""
        radius_db = "radius"

        acct_table1             = "acc"
        acct_table2             = "acc"

        deletestalesessions = yes

        # Print all SQL statements when in debug mode (-x)
        sqltrace = yes
        sqltracefile = ${logdir}/sqltrace.sql

        num_sql_socks = 5
        connect_failure_retry_delay = 60
        #safe-characters = "@abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-_: /"

# ------------------------------ requests -----------------------------------
        sql_user_name = "%{User-Name}"
        default_user_profile = "DEFAULT"
        query_on_not_found = no

        authorize_check_query = "SELECT id,name,'User-Password',password,'==' FROM users WHERE name = '%{SQL-User-Name}' ORDER BY id"
        authorize_reply_query = "SELECT id,name,'Framed-IP-Address',ip_addr,'=' FROM users WHERE name = '%{SQL-User-Name}' ORDER BY id"

        accounting_onoff_query = "UPDATE ${acct_table1} SET AcctStopTime='%S' WHERE AcctStopTime=0 AND FromNAS= '%{NAS-Identifier}' AND AcctStartTime <= '%S'"

        accounting_update_query = "UPDATE ${acct_table1} \
         SET FramedIPAddress = '%{Framed-IP-Address}', \
         WHERE AcctSessionId = '%{Acct-Session-Id}' \
         AND UserName = '%{SQL-User-Name}' \
         AND FromNAS= '%{NAS-Identifier}'"

        accounting_update_query_alt = "INSERT into ${acct_table1} \
        (AcctSessionId, UserName, FromNAS, AcctStartTime, FramedIPAddress) values \
        ('%{Acct-Session-Id}', '%{SQL-User-Name}', '%{NAS-Identifier}', \
        DATE_SUB('%S',INTERVAL (%{Acct-Session-Time:-0} + %{Acct-Delay-Time:-0}) SECOND),%{Framed-IP-Address}')"

        accounting_start_query = "INSERT into ${acct_table1} \
        (AcctSessionId, UserName, FromNAS, AcctStartTime, AcctStopTime, FramedIPAddress) values \
        ('%{Acct-Session-Id}', '%{SQL-User-Name}', '%{NAS-Identifier}','%S',0,'%{Framed-IP-Address}')"

        accounting_start_query_alt  = "UPDATE ${acct_table1} SET \
        AcctStartTime = '%S' WHERE AcctSessionId = '%{Acct-Session-Id}' AND UserName = '%{SQL-User-Name}' AND FromNAS = '%{NAS-Identifier}'"

        accounting_stop_query = "UPDATE ${acct_table2} SET \
        AcctStopTime = '%S' WHERE AcctSessionId = '%{Acct-Session-Id}' AND UserName = '%{SQL-User-Name}' AND FromNAS = '%{NAS-Identifier}'"

        accounting_stop_query_alt = "INSERT into ${acct_table2} \
        (AcctSessionId, UserName, FromNAS, AcctStartTime, AcctStopTime, FramedIPAddress) values\
        ('%{Acct-Session-Id}', '%{SQL-User-Name}', '%{NAS-Identifier}', DATE_SUB('%S', INTERVAL (%{Acct-Session-Time:-0} + %{Acct-Delay-Time:-0}) SECOND), '%S', '%{Framed-IP-Address}')"

        simul_count_query = "SELECT COUNT(*) FROM ${acct_table1} WHERE UserName='%{SQL-User-Name}' AND AcctStopTime = 0"
        simul_verify_query = "SELECT id, AcctSessionId, UserName, FromNAS, FramedIPAddress  FROM ${acct_table1} WHERE UserName='%{SQL-User-Name}' AND AcctStopTime = 0"

#       group_membership_query = "SELECT GroupName FROM ${usergroup_table} WHERE UserName='%{SQL-User-Name}'"
#       postauth_query = "INSERT into ${postauth_table} (id, user, pass, reply, date) values ('', '%{User-Name}', '%{User-Password:-Chap-Password}', '%{reply:Packet-Type}', NOW())"

        #
        # Set to 'yes' to read radius clients from the database ('nas' table)
        #readclients = yes
}

ADD to file /etc/rc.conf
radiusd_enable="YES"

File rad.sql
# Database : `radius`
# 
# Table structure for table `acc`
#

CREATE TABLE `acc` (
  `id` bigint(20) NOT NULL auto_increment,
  `UserName` varchar(64) NOT NULL default '',
  `AcctStartTime` datetime NOT NULL default '0000-00-00 00:00:00',
  `AcctStopTime` datetime NOT NULL default '0000-00-00 00:00:00',
  `FramedIPAddress` varchar(15) NOT NULL default '',
  `FromNAS` varchar(32) NOT NULL default '',
  `AcctSessionId` varchar(32) NOT NULL default '',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT=3 ;

# --------------------------------------------------------

#
# Table structure for table `users`
#

CREATE TABLE `users` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `name` varchar(32) NOT NULL default '',
  `password` varchar(32) NOT NULL default '',
  `ip_addr` varchar(32) NOT NULL default '',
  PRIMARY KEY  (`id`),
  KEY `name` (`name`)
) TYPE=MyISAM;

#
# Table structure for table `ppp_reply`
#

CREATE TABLE `ppp_reply` (
    `id` int(11) unsigned NOT NULL auto_increment,
    `UserName` varchar(64) NOT NULL default '',
    `Attribute` varchar(32) NOT NULL default '',
    `op` char(2) NOT NULL default '=',
    `Value` varchar(253) NOT NULL default '',
    PRIMARY KEY  (`id`),
    KEY `UserName` (`UserName`(32))
    ) TYPE=MyISAM;

#
# Dump for table `ppp_reply`
#	      
 
    INSERT INTO `ppp_reply` (`id`, `UserName`, `Attribute`, `op`, `Value`) VALUES 
    (1, '', 'Framed-IP-Netmask', '=', '255.255.255.255'),
    (2, '', 'Framed-Protocol', '=', 'PPP'),
    (3, '', 'Service-Type', '=', 'Framed-User'),
    (4, '', 'Framed-MTU', '=', '1492');



PPPoE + PPTP on MPD + Radius

Сервер: /usr/ports/net/mpd

Ядро:
options         NETGRAPH                #netgraph(4) system
options         NETGRAPH_ASYNC
options         NETGRAPH_BPF
options         NETGRAPH_ECHO
options         NETGRAPH_ETHER
options         NETGRAPH_HOLE
options         NETGRAPH_IFACE
options         NETGRAPH_KSOCKET
options         NETGRAPH_L2TP
options         NETGRAPH_LMI
# MPPC compression requires proprietary files (not included)
#options        NETGRAPH_MPPC_COMPRESSION
options         NETGRAPH_MPPC_ENCRYPTION
options         NETGRAPH_ONE2MANY
options         NETGRAPH_PPP
options         NETGRAPH_PPTPGRE
options         NETGRAPH_RFC1490
options         NETGRAPH_SOCKET
options         NETGRAPH_TEE
options         NETGRAPH_TTY
options         NETGRAPH_UI
options         NETGRAPH_VJC

File /usr/local/etc/mpd/mpd.conf

default:
        load ppoe00
        load ppoe01
        load ppoe02

        load pptp00
        load pptp01


ppoe00: 
        new -i ng0 ppoe0 ppoe0 
        set pppoe iface fxp0
        load ppoe_def 

ppoe01: 
        new -i ng1 ppoe1 ppoe1 
        set pppoe iface fxp1
        load ppoe_def 

ppoe02: 
        new -i ng2 ppoe2 ppoe2 
        set pppoe iface fxp2
        load ppoe_def 

pptp00:
        new -i ng300 pptp0 pptp0 
        load pptp_def 

pptp01: 
        new -i ng301 pptp1 pptp1 
        load pptp_def 

pptp_def:
        set bundle enable multilink
        set link type pptp
        set link no acfcomp protocomp
        set link no pap 
        set link yes chap-msv1
        set link yes chap-msv2
        set link yes chap-md5
        set ipcp no vjcomp
        set ccp no mppc
        set ccp no mpp-e40
        set ccp no mpp-e56
        set ccp no mpp-e128
        set ccp yes mpp-stateless
        set pptp self 10.11.50.1
        set pptp enable incoming
        set pptp disable originate
        load common

ppoe_def: 
        set pppoe enable incoming 
        set pppoe disable originate 
        set pppoe service "*" 
        set iface idle 1800 
        set iface mtu 1500 
        set iface enable tcpmssfix 
        set bundle disable multilink 
        set link yes acfcomp protocomp 
        set link disable pap chap 
        set link enable chap 
        set link mtu 1492 
        set link mru 1492 
        set link max-redial -1 
        set link enable magicnum 
        set link enable check-magic 
        set ipcp enable vjcomp 
        load common


common:
        set iface disable on-demand
        set ipcp ranges 192.168.1.1/32 10.11.50.0/24 
        set iface disable on-demand 
        set iface disable proxy-arp 
        set link keep-alive 60 180
        set bundle max-logins 1 
        set bundle disable compression 
        load radius 
        set ipcp dns 1.1.1.1

radius: 
        set radius config /etc/radius.conf 
        set radius retries 3 
#       set radius timeout 30 
        set radius me NAME_FROM_HOSTS
        set radius acct-update 30 
        set bundle enable radius-auth 
        set bundle enable radius-acct 
        set iface enable radius-session
        set ipcp enable radius-ip

File /usr/local/etc/mpd/mpd.links
#
# For our PPTP server
#

pptp00:
        set link type pptp
        set pptp enable incoming
        set pptp disable originate

pptp01:
        set link type pptp
        set pptp enable incoming
        set pptp disable originate

#
# For our PPoE server
#

ppoe0:
        set link type pppoe
        set pppoe enable incoming
        set pppoe disable originate


ppoe1:
        set link type pppoe
        set pppoe enable incoming
        set pppoe disable originate

ppoe2:
        set link type pppoe
        set pppoe enable incoming
        set pppoe disable originate


Для того, что бы к MPD могли конектиться Windows 2000 клиенты нужно: создаем файлик /usr/ports/net/mpd/files/patch-bb следующего содержания: --- src/lcp.c.orig Wed Jul 14 18:02:12 2004 +++ src/lcp.c Wed Jul 14 18:02:13 2004 @@ -564,8 +564,10 @@ if (!LCP_PEER_REJECTED(lcp, TY_ACCMAP)) cp = FsmConfValue(cp, TY_ACCMAP, -4, &lcp->want_accmap); } +/* if (!LCP_PEER_REJECTED(lcp, TY_MRU)) cp = FsmConfValue(cp, TY_MRU, -2, &lcp->want_mru); +*/ if (lcp->want_magic && !LCP_PEER_REJECTED(lcp, TY_MAGICNUM)) cp = FsmConfValue(cp, TY_MAGICNUM, -4, &lcp->want_magic); if (lcp->want_callback && !LCP_PEER_REJECTED(lcp, TY_CALLBACK)) { Далее пересобираем MPD, но патч может и не прокатить и выдать ошибку, для этого идем в диру work и папку src, ищем файлик lcp.c и коментируем в нем две строчки (выделены в патче) затем собираем и инсталим MPD
Запуск: /usr/local/sbin/mpd -b Radius настраивается как в предыдущем примере Проверка Radius: Проверка FreeRadius Для проверки - с локальной машины (надеюсь, ее в clients.conf вписали) выполняем radtest user password < IP-адрес radius-сервера > 1812 < пароль к radius-серверу > , например, radtest testuser testpassword 10.1.1.1 1812 test2 Конечно, testuser и testpassword должны быть прописаны в базе пользователей. В итоге получим: Sending Access-Request of id 148 to 10.1.1.1:1812 User-Name = "testuser" User-Password = "W\202$Y\374x\251p^\302M\376\202U\212\031" NAS-IP-Address = host.domain NAS-Port = 1812 rad_recv: Access-Accept packet from host 10.1.1.1:1812, id=41, length=32 Framed-IP-Address = 10.1.5.2 Framed-IP-Netmask = 255.255.255.255 То-есть, радиус-сервер проверил правильность пароля для этого пользователя и выдал IP-адрес. В случае, если пароль не прошел, то получим rad_recv: Access-Reject packet from host 10.1.1.1:1812, id=148, length=20


сервер PPTP на PopTop

Сервер: /usr/ports/net/poptop/

File /etc/ppp/ppp.conf:
loop:
 set timeout 0
 set log phase chat connect lcp ipcp command
 set device localhost:pptp
 set dial
 set login
 set server /tmp/loop "" 0177

loop-in:
 set timeout 0
 set log phase lcp ipcp command
 allow mode direct

pptp:
 debug
 load loop
# enable PAP
# enable MSCHAP
 enable MSCHAPv2
# enable CHAP
 disable deflate pred1
 deny deflate pred1
 disable pap
# proxyarp
# set mppe * *
 disable ipv6cp
 #enable mppc
 accept dns
 set dns 1.1.1.1 2.2.2.2
# set nbns 10.11.50.3
 set device !/etc/ppp/secure

File /etc/ppp/secure:
#!/bin/sh
exec /usr/sbin/ppp -direct loop-in

File /etc/ppp/pptpd.conf 
option /etc/ppp/ppp.conf
speed 115200
proxyarp
pidfile /var/run/pptpd.pid

File /etc/ppp/ppp.linkdown
pptp:
 ! sh -c "/usr/local/sbin/vpn_down.pl USER HISADDR INTERFACE UPTIME"

File /etc/ppp/ppp.linkup
pptp:
 ! sh -c "/usr/local/sbin/vpn_up.pl USER HISADDR INTERFACE"
 ! sh -c "/usr/local/sbin/vpn_up_log.pl USER HISADDR"

File /usr/local/sbin/vpn_down.pl
#!/usr/bin/perl

use Mysql;

$host="HOST";
$database="DATABASE";
$user="LOGIN";
$pass="PASSWORD";
$dbh = Mysql->Connect($host,$database,$user,$pass)  or print $Mysql::db_errstr;
$dbh->SelectDB($database) or print $Mysql::db_errstr;

$action="linkdown";

$x=scalar(@ARGV);

$user=@ARGV[0];
$ext_ip=@ARGV[1];
$uptime=@ARGV[3];

$date=`/bin/date`;
@out=split(' ',$date);
$form_date="@out[1] @out[2] @out[3]";
#print "$uptime\n";
$sth=$dbh->Query("select * from vpn where login='$user'");
@arr=$sth->FetchRow;

while(! ($sth=$dbh->Query("INSERT into vpn_all_log (ownid, login,ext_ip, int_ip, date, up_down, uptime) VALUES ('@arr[4]' ,'$user','@arr[2]','@arr[1]','$form_date','$action','$uptime')"))) {
        print "\nretrying ($Mysql:db_errstr)\n";
        sleep 3; 
} 

while(! ($sth=$dbh->Query("DELETE from vpn where login='$user'"))) {
        print "\nretrying ($Mysql:db_errstr)\n";
        sleep 3;
}

File /usr/local/sbin/vpn_up.pl
#!/usr/bin/perl

use Mysql;

$host="";
$database="";
$user="";
$pass="";
$dbh = Mysql->Connect($host,$database,$user,$pass)  or print $Mysql::db_errstr;
$dbh->SelectDB($database) or print $Mysql::db_errstr;
$x=scalar(@ARGV);

$user=@ARGV[0];
$ext_ip=@ARGV[1];

@out=`cat /var/log/ppp.log | grep $user`;
$x=scalar(@out);
@out=split('\[',@out[$x-1]);
@out1=split(' ',@out[0]);
@out=split('\]',@out[1]);
$pid=@out[0];
$out=`ps -ax | grep pptp`;
@out=split('\n',$out);                                
$x=scalar(@out);                                      
for ($i=0;$i<$x;$i++){                                
        @out2=split(' ',@out[$i]);                    
        if (@out2[0] eq $pid){$o=$i;$i=$x;$pr++;}           
}
#open (F,">>/root/vpn_guest.txt");
if ($pr){                                                     
        @out=split(' ',@out[$o-1]);                   
        @out=`sockstat | grep @out[0]`;               
        @out=split(' ',@out[0]);                      
        @out=split(':',@out[6]);
        $date=sprintf ("%s %s %s",@out1[0],@out1[1],@out1[2]);
        $int_ip=@out[0];
        @chk_local=split('\.',$int_ip);
        $ip=sprintf("10.10.%s.%s",@chk_local[2],@chk_local[3]);
        $sth=$dbh->Query("select ownid from ip where ip='$ip'");
        @arr1=$sth->FetchRow;
        $sth=$dbh->Query("select * from ip where ownid='@arr1[0]'");
        $pr=0;
        while (@arr2=$sth->fetchrow){
                if (@arr2[1] eq $ext_ip){$pr++;}
#               print F "@arr2[1] eq $ext_ip\n";
                @guest=split('\.',$ext_ip);
                $gue="@guest[0].@guest[1].@guest[2]";
                if ($gue eq "10.10.255"){$pr++;}
#               print F "$gue eq 10.10.255\n";
        }
        if (!$pr){
                print "Fucking Hacker!!!\n";
                while(! ($sth=$dbh->Query("INSERT into vpn_unleg (login,ext_ip, int_ip, date, pid) VALUES ('$user','$ext_ip','$int_ip','$date','$pid')"))) {
                        print "\nretrying ($Mysql:db_errstr)\n";
                        sleep 3;
                }
        }
        while(! ($sth=$dbh->Query("INSERT into vpn (login,ext_ip, int_ip, date, pid) VALUES ('$user','$ext_ip','$int_ip','$date','$pid')"))) {
                print "\nretrying ($Mysql:db_errstr)\n";
                sleep 3;
        }
        while(! ($sth=$dbh->Query("DELETE from vpn where int_ip=''"))) {
                print "\nretrying ($Mysql:db_errstr)\n";
                sleep 3;
        }
}
#close (F);

File /usr/local/sbin/vpn_up_log.pl 
#!/usr/bin/perl

use Mysql;

$host="";
$database="";
$user="";
$pass="";
$dbh = Mysql->Connect($host,$database,$user,$pass)  or print $Mysql::db_errstr;
$dbh->SelectDB($database) or print $Mysql::db_errstr;

$action="linkup";

$x=scalar(@ARGV);

$user=@ARGV[0];
$assip=@ARGV[1];

open (F,">>/usr/local/www/info/clvpn.html");
@out=`/bin/cat /var/log/ppp.log | grep $user`;
$x=scalar(@out);
@out=split('\[',@out[$x-1]);
@out1=split(' ',@out[0]);
@out=split('\]',@out[1]);
$pid=@out[0];
`/bin/sleep 1`;
$out=`/bin/ps -ax | /usr/bin/grep pptp`;
@out=split('\n',$out);
$x=scalar(@out);
for ($i=0;$i<$x;$i++){
        @out2=split(' ',@out[$i]);
        if (@out2[0] eq $pid){$o=$i;$i=$x;$pr++;}
}
if ($pr){
        print "PID: $pid @out[$o-1]\n";
        @out=split(' ',@out[$o-1]);
        @out=`sockstat | grep @out[0]`;
        @out=split(' ',@out[0]);
        @out=split(':',@out[6]);
        $int_ip="@out[0]";
        $date="@out1[0] @out1[1] @out1[2]";
        $sth=$dbh->Query("INSERT into vpn_all_log (login, ownid,ext_ip, int_ip, date, up_down) VALUES ('$user','$pid','$assip','$int_ip','$date', '$action')"); 
        print F "@out1[0] @out1[1] @out1[2]: ";
        print F "Login: $user, Local IP: $int_ip, VPN IP: $assip 
\n"; print "Login: $user, Local IP: $int_ip, VPN IP: $assip
\n"; }else{ print F "No such process found!\n"; } close (F); File /etc/ppp/ppp.secret login password 10.0.0.36 *



Настройка клиентской части на *nix PPPoE

Внимание! Дефолтного роутинга не должно быть

PPPoE клиент Linux

Установить pppd
Установить пакет PPPoE - Roaring Penguin

Убедиться, что в ядре включена поддержка ррр или поддержка доступна в виде модуля.
Если не включена, то пересоберите ядро с поддержкой ррр
ppp должен быть с патчем для MS-CHAP V2
Добавить в /etc/ppp/chap-secrets:
Login * Password * (где Login и Password - Ваши логин и пароль для входа в VPN)

Добавить в /etc/ppp/options:
require-mschap-v2 файл /etc/ppp/pppoe.conf должен выглядеть так: ETH='eth0' #(eth0 - имя Вашего интерфейса) USER='login' #(login - Ваш логин) DEMAND=no DNSTYPE=NOCHANGE PEERDNS=no DNS1= DNS2= DEFAULTROUTE=yes CONNECT_TIMEOUT=30 CONNECT_POLL=2 ACNAME= SERVICENAME=SERVICE_NAME #(SERVICE_NAME - имя сервис нейма выданного провайдером) PING="." CF_BASE=`basename $CONFIG` PIDFILE="/var/run/$CF_BASE-pppoe.pid" SYNCHRONOUS=no CLAMPMSS=1412 LCP_INTERVAL=20 LCP_FAILURE=3 PPPOE_TIMEOUT=80 FIREWALL=NONE LINUX_PLUGIN= PPPOE_EXTRA="" PPPD_EXTRA="" Запуск VPN вручную: pppoe-start Остановка VPN вручную: pppoe-stop Для удаления дефолтного роутинга при загрузке следует закомментировать строки в Mandrake: /etc/sysconfig/network #GATEWAY=XXX.XXX.XXX.XXX

PPPoE клиент FreeBSD:


Включить следующее в /etc/ppp/ppp.conf:
pppoe:
  set log Phase Chat LCP IPCP CCP tun command

  set device PPPoE:iface:srvname   #Заменить iface на Ваш интерфейс (например, rl0), а srvname заменить на service-name вашего провайдера
  set authname login    #Заменить login на Ваш логин
  set authkey password   #Заменить password на Ваш пароль
  enable lqr

  set dial
  set login
  set ifaddr 0.0.0.0/0 0.0.0.0/0
  add default HISADDR

Примечание: Строки после метки (рррое:) должны начинаться с пробела!

Запуск VPN вручную:

ppp -ddial pppoe

Остановка VPN вручную:
killall -9 ppp
ifconfig delete tun0

Запуск VPN при загрузке:
Включить следующее в /etc/rc.conf:
ppp_enable="YES"

ppp_mode="ddial"
ppp_profile="pppoe"
ppp_nat="NO"
ppp_user="root"

PPPoE клиент OpenBSD:

Включить следующее в /etc/ppp/ppp.conf:

default:
 set log Phase Chat LCP IPCP CCP tun command
 set redial 15 0
 set reconnect 15 10000
pppoe:
 set device "!/usr/sbin/pppoe -n starnet -i sk0" # Вместо sk0 подставить имя вашего интерфейса
 set mtu max 1492
 set speed sync
 disable acfcomp protocomp
 deny acfcomp
 enable lqr
 set dial
 set login
 set timeout 0
 set authname MyName # Логин, без кавычек
 set authkey MyPass # Пароль без кавычек
 add! default HISADDR
 enable dns
 enable mssfixup

Запуск VPN вручную:

ppp -ddial pppoe

Остановка VPN вручную:
kill -9 ppp-pid #ppp-pid - номер процесса ppp демона
ifconfig delete tun0

Запуск VPN при загрузке:
Включить следующее в /etc/rc.local:
ppp -ddial pppoe

PPPoE клиент Mac OS X Leopard (10.5)

1. Перейдите в "System Preferences"
Сделайте клик по "Network" (Скриншот №1)

Скриншот №1
Скриншот №1

2. Выберите слева в колонке интерфейс "Ethernet:"
Выберите в строке "Configure:" пункт "Manually"
В поле "IP Address:" введите ваш IP-адрес
В поле "Subnet Mask:" нужно указать маску подсети, например "255.255.255.0" (Скриншот №2)
Слева в колонке нажмите кнопку "+" (плюс)

Нажмите "Apply"

Скриншот №2
Скриншот №2

3. Выберите в строке "Interface:" пункт "PPPoE"
Выберите в строке "Ethernet:" пункт "Ethernet"
В поле "Service Name:" вписываем "PPPoE" (Скриншот №3)

Нажмите "Create"

Скриншот №3
Скриншот №3

4. В поле "Service Name:" вписываем сервис-нейм выданный провайдером, например starnet

Далее Вам нужно заполнить поля "Account Name" и "Password" (Скриншот №4)

"Account Name" = "Пользователь"
"Password" = "Пароль"
Нажмите "Advanced"

Скриншот №4
Скриншот №4

5. Выберите вкладку "TCP/IP"
Выберите в строке "Configure IPv4:" пункт "Using PPP"
Выберите в строке "Configure IPv6:" пункт "Off" (Скриншот №5)

Скриншот №5
Скриншот №5

6. Выберите вкладку "PPP"
Отметьте пункт "Send PPP echo packets"
Отметьте пункт "Use verbose logging" (Скриншот №6)

Нажмите "OK"
Когда окно закроется, нажмите кнопку "Connect"

Скриншот №6
Скриншот №6


PPPoE клиент Mac OS X Tiger (10.4)

1. Перейдите в "System Preferences"
Сделайте клик по "Network" (Скриншот №1)

Скриншот №1
Скриншот №1

2. Выберите в строке "Show:" пункт "Built-in Ethernet"
Выберите вкладку "TCP/IP"
Выберите в строке "Configure IPv4:" пункт "Manually"
В поле "IP Address:" введите ваш IP-адрес
В поле "Subnet Mask:" ввести маску подсети, например"255.255.255.0" (Скриншот №2)
Выберите в строке "Show:" выберите "Network Port Configurations" и нажмите "New"

Нажмите "Apply"

Скриншот №2
Скриншот №2

3. В поле "Name:" введите "PPPoE"
Выберите в строке "Port:" пункт "Built-in Ethernet" (Скриншот №3)

Нажмите "OK"

Скриншот №3
Скриншот №3

4. Выберите вкладку "PPPoE"
Отметьте пункт "Connect using PPPoE"
Отметьте пункт "Show PPPoE status in menu bar"

Далее Вам нужно заполнить поля "Account Name" и "Password" (Скриншот №4)

"Account Name" = "Пользователь"
"Password" = "Пароль" –
В поле "PPPoE Service Name:" вписываем сервис-нейм выданный провайдером, например starnet

Нажмите "PPPoE Options"

Скриншот №4
Скриншот №4

5. Отметьте пункт "Send PPP echo packets"
Отметьте пункт "Use verbose logging" (Скриншот №5)

Скриншот №5
Скриншот №5

6. Выберите в "menu bar" иконку "PPPoE"
Выберите пункт "Connect" (Скриншот №6)

Скриншот №6
Скриншот №6


PPPoE клиент OS/2

Клиент:
SafeFire PPP/Links (SFL)
сайт разработчика: http://www.lgs.kiev.ua
файл для скачивания: http://www.lgs.kiev.ua/beta/sf11-12.zip

Установка:
Разархивировать sf11-12.zip во временный каталог
Запустить install.cmd и инсталлировать SFL.
Инсталлятор попросит указать каталог для установки и разрешение на изменение файла CONFIG.SYS
Указать полный путь и разрешить модификацию.

Настройка:
Определим что:
%LGSDIR% - полный путь к каталогу, в который производилась установка SFL;
%BOOTDRV% - буква диска, с которого загружалась OS/2.

Подключить SFL к сетевому интерфейсу, следуя указаниям из документации %LGSDIR%\doc\eng\pppoe.htm
Процесс описан детально, включая скриншоты окон.

Перед выполнением данной настройки настоятельно рекомендуется сделать копию файлов %BOOTDRV%:\CONFIG.SYS и %BOOTDRV%:\IBMCOM\PROTOCOL.INI

В каталоге %LGSDIR%\config находим файл OE_MEDIUM.CFG
Это текстовой файл, который можно редактировать в любом текстовом редакторе.
В этом файле находим секцию [ppp]
По умолчанию она выглядит следующим образом:
-----------
[ppp]
@include "oe_ppp"
auth.client.clientname=ENTER YOUR USER NAME HERE
auth.client.clientpass=ENTER YOUR PASSWORD HERE
-----------
Заменяем:
ENTER YOUR USER NAME HERE на "Пользователь"
ENTER YOUR PASSWORD HERE на "Пароль" –

Так-же в данную секцию дописываем следующими строками:
-----------------------------
;установка параметров авторизации
auth.server.chap.enabled=1
auth.server.chap.servername=starnet
;динамически назначать адреса
ip.address=0
ip.peeraddress=0
-----------------------------

В итоге секция выглядит следующим образом (пример):
-----------------------------
[ppp]
@include "oe_ppp"

auth.client.clientname=12345-1 auth.client.clientpass=123456 auth.server.chap.enabled=1 auth.server.chap.servername=starnet ip.address=0 ip.peeraddress=0
-----------------------------
Сохраняем файл.

В том-же каталоге, где расположен файл oe_medium.cfg,
находим файл DEFAULT.CFG и открываем его для редактирования.
Находим секцию [oe_ppp]:
-----------------------------
[oe_ppp]
load=pl_ppp:pppoe
bind=ethernet:ether.io
lcp.recv.mru=1492
lcp.send.mtu=1492
-----------------------------
В эту секцию необходимо добавить одну строку:
-----------------------------
pppoe.servicename=starnet
-----------------------------

Строчки:
-----------------------------
"lcp.recv.mru=1492"
"lcp.send.mtu=1492"
-----------------------------
можно закомментировать.

В итоге секция выглядит следующим образом (пример):
-----------------------------
[oe_ppp]
load=pl_ppp:pppoe
bind=ethernet:ether.io
;lcp.recv.mru=1492
;lcp.send.mtu=1492
pppoe.servicename=starnet
-----------------------------
Сохраняем файл.

Теперь необходимо добавить автоматическую загрузку SFL при старте системы.

Для этого в каталоге %LGSDIR%\bin создаём коммандный файл RUNPPPOE.CMD следующего содержания:
-----------------------------
SETLOCAL
CD %LGSDIR%\bin
DETACH sfppp -Coe_medium.cfg
ENDLOCAL
-----------------------------
Наиболее оптимальным, на мой взгляд, является вызов данного коммандного файла сразу после инициализации сетевых интерфейсов.

Для этого в файл %BOOTDRV%:\MPTN\BIN\setup.cmd добавляем строку:
-----------------------------
call %LGSDIR%\bin\RUNPPPOE.CMD
-----------------------------

Примерный вид файла %BOOTDRV%:\MPTN\BIN\setup.cmd
-----------------------------
route -fh
arp -f
ifconfig lo 127.0.0.1 ifconfig lan0 192.168.XX.YY netmask 255.255.255.0 metric 0 mtu 1492 REM ifconfig lan1 nil metric 1 mtu 1500 REM ifconfig lan2 nil metric 1 mtu 1500 REM ifconfig lan3 nil metric 1 mtu 1500 REM ifconfig lan4 metric 1 mtu 1500 REM ifconfig lan5 metric 1 mtu 1500 REM ifconfig lan6 metric 1 mtu 1500 REM ifconfig lan7 metric 1 mtu 1500 REM ifconfig sl0 route add default 192.168.XX.ZZ -hopcount 1 ipgate on call %LGSDIR%\bin\RUNPPPOE.CMD detach fssd cfgfilt -u -i -d
-----------------------------

Перезагружаем систему.

Проверено на OS/2 Warp 4.0 with fix16 + postfix (kernel: 14.091a)
inetver:
Version numbers of TCP/IP protocol drivers:
SOCKETS.SYS: 6.3100
AFOS2.SYS: 6.3100
AFINET.SYS: 6.3100



Настройка клиентской части PPTP на FreeBSD

Установить: /usr/ports/net/pptpclient

Добавляем запуск при загрузке компа File: /usr/local/etc/rc.d/vpn.sh
#!/bin/sh
/etc/ppp/vpn_up.sh & 

Делаем файл с бесконечным циклом:
File /etc/ppp/vpn_up.sh
#!/bin/sh

while [ 1 ]
do
/usr/local/sbin/pptp PPTP_SERVER_IP mypptp
sleep 5
done
Замените PPTP_SERVER_IP на IP-адрес сервера вашего провайдера

File /etc/ppp/ppp.conf
#Название соединения
mypptp:
 set authname USERNAME
 set authkey PASSWORD
 set timeout 0
 set ifaddr 0 0 
 add default HISADDR
Внимание ! Все строки после mypptp начинаются с пробела, это обязательно !

Делаем файлы исполняемыми:
	chmod a+x /usr/local/etc/rc.d/vpn.sh
	chmod a+x /etc/ppp/vpn_up.sh

Запускаем /usr/local/etc/rc.d/vpn.sh

Итог: Если соединение разорвется, то оно само восстановится из-за бесконечного цикла.

Поднятие роутинга

Сервер: MPD

Описание:
к 1-му серверу по PPTP цепляются несколько клиентов
Клиенты нумеруются по номеру (последний октет IP-адреса): 2,3,4,5 и т.д.
После входа в PPTP каждому клиенту выдается IP 192.168.10.ХХ, где ХХ номер клиента.

Задача:
нужно при коннекте определенного клиента добавлять роутинг до какой либо сети через этого клиента
например:
/sbin/route add 192.168.12.0/24 192.168.100.2
/sbin/route add 192.168.11.0/24 192.168.100.3
/sbin/route add 192.168.14.0/24 192.168.100.4
/sbin/route add 192.168.16.0/24 192.168.100.5

Решение:
File mpd.conf:
pptp00:
        new -i ng0 pptp0 pptp0
	set iface up-script /usr/local/etc/mpd/lup.pl
	set iface down-script /usr/local/etc/mpd/link-down
	load pptp_def

File lup.pl:

#!/usr/bin/perl
@net=("","",12,11,14,16);
open (F,">>/usr/local/etc/mpd/liup.log");
        $date=`date`;
	if ($ARGV[3]=~/^\d{1,3}\.\d{1,3}\.\d{1,3}\.(\d{1,3})$/){
	        $cmd=sprintf ("/sbin/route add 192.168.%s.0/24 -iface %s",$net[$1],$ARGV[0]);
		printf F ("Date: %s > addr: %s [%s]\n\n",$date,$ARGV[3],$cmd);
		`$cmd`;
	}else{
		printf F ("Date: %s > Fuckup in address: %s\n\n",$date,$ARGV[3]);
	}
close (F);

где $1 возникает из регекспа, $1 это (\d{1,3}), т.е. то что заключено в скобки
массив @ARGV это то что передает MPD при коннекте клиента
посмотреть что отдает MPD можно так:
создать файл ну например link-up и в нем:
echo $1 >>/usr/local/etc/mpd/param
echo $2 >>/usr/local/etc/mpd/param
echo $3 >>/usr/local/etc/mpd/param
echo $4 >>/usr/local/etc/mpd/param
echo $5 >>/usr/local/etc/mpd/param
echo $6 >>/usr/local/etc/mpd/param
далее прописать его в mpd.conf как скрипт линкапа set iface up-script /usr/local/etc/mpd/link-up