Страница 1 из 2

Openvpn & Баг с acct_session_id

Добавлено: Вт май 20, 2008 6:01 am
Ck-NoSFeRaTU
Прикрутил openvpn. У него acct_session_id формируется в виде md5 хеша. И в повсюду в базу вместо всего идентификатора пишется только его первый символ. Например:

Tue May 20 09:16:22 2008
User-Name = "testuser"
NAS-IP-Address = 127.0.0.1
NAS-Port = 1
Service-Type = Framed-User
Framed-Protocol = PPP
Framed-IP-Address = 10.1.100.6
Calling-Station-Id = "10.1.1.128"
NAS-Identifier = "openvpn"
Acct-Status-Type = Stop
Acct-Input-Octets = 5774
Acct-Output-Octets = 5942
Acct-Session-Id = "6479140A4D3447996D0091066913EBA0"
Acct-Session-Time = 495
Acct-Input-Gigawords = 0
Acct-Output-Gigawords = 0
NAS-Port-Type = Virtual
Client-IP-Address = 127.0.0.1
Acct-Unique-Session-Id = "74f344d8570a2d78"
Timestamp = 1211260582

--
-- Dumping data for table `dv_log`
--

INSERT INTO `dv_log` (`start`, `tp_id`, `duration`, `sent`, `recv`, `minp`, `kb`, `sum`, `port_id`, `nas_id`, `ip`, `sent2`, `recv2`, `acct_session_id`, `CID`, `bill_id`, `uid`, `terminate_cause`, `acct_input_gigawords`, `acct_output_gigawords`, `ex_input_octets_gigawords`, `ex_output_octets_gigawords`) VALUES
('2008-05-20 09:08:08', 7, 495, 5721, 5889, 0.00, 0.00, 0.000000, 1, 2, 167863302, 0, 0, '6', '10.1.1.128', 1, 1, 0, 0, 0, 0, 0);

Расширение varchar с 25 до 32 толку не дало...

Добавлено: Вт май 20, 2008 8:14 am
ran
Расширение varchar с 25 до 32 толку не дало...
а ты во всех таблицах его поменял:

Код: Выделить всё

cat /usr/abills/abills.sql |grep acct_session_id
  `acct_session_id` varchar(25) NOT NULL default '',
  KEY `acct_session_id` (`acct_session_id`)
  `acct_session_id` varchar(25) NOT NULL default '',
  KEY `acct_session_id` (`acct_session_id`),
  KEY `session_interval` (`acct_session_id`,`interval_id`)
  `acct_session_id` varchar(25) NOT NULL default '',
  `acct_session_id` varchar(25) NOT NULL default '',
  KEY `sid` (`acct_session_id`)
  `acct_session_id` varchar(25) NOT NULL default '',
  `acct_session_id` varchar(25) NOT NULL default '',

Добавлено: Вт май 20, 2008 11:04 am
~AsmodeuS~
очень интересное решение никак у самого руки не доходят

если автора не затруднит ман по настройке и я думаю вместе решим эту проблему

Добавлено: Вт май 20, 2008 12:45 pm
ran
~AsmodeuS~ писал(а):очень интересное решение никак у самого руки не доходят

если автора не затруднит ман по настройке и я думаю вместе решим эту проблему
а чё там описывать-та? наскока я помню радиусовый плагин у опенвпна есь, а остальное - согласно евойного мануала :wink:

Добавлено: Вт май 20, 2008 3:43 pm
Ck-NoSFeRaTU
ran писал(а):
Расширение varchar с 25 до 32 толку не дало...
а ты во всех таблицах его поменял:
Везде, да и не в нём дело, обрезается ведь не на 25 символах, а на первом.
~AsmodeuS~ писал(а):очень интересное решение никак у самого руки не доходят

если автора не затруднит ман по настройке и я думаю вместе решим эту проблему
Есть несколько вариантов. Можно сделать через openvpn-auth-pam или auth-pam.pl. Но в таком случае будет работать только авторизация. Неуниверсально.
Посему делаем через radiusplugin.

FreeBSD

1. Ставим openvpn из портов:
cd /usr/ports/security/openvpn
make clean install

2. Забираем последнюю версию радиус плагина для openvpn с cvs и собираем его(последний выложенный релиз на сайте глючит)
cd /tmp
cvs -z3 -d:pserver:anonymous@cvs.savannah.nongnu.org:/sources/radiusplugin co radiusplugin
cd radiusplugin
g++ -Wall -I/usr/local/include -L/usr/local/lib -shared -o radiusplugin.so AccountingProcess.cpp Exception.cpp PluginContext.cpp UserAuth.cpp AcctScheduler.cpp IpcSocket.cpp radiusplugin.cpp User.cpp AuthenticationProcess.cpp main.cpp UserAcct.cpp UserPlugin.cpp Config.cpp RadiusClass/RadiusAttribute.cpp RadiusClass/RadiusPacket.cpp RadiusClass/RadiusConfig.cpp RadiusClass/RadiusServer.cpp RadiusClass/RadiusVendorSpecificAttribute.cpp -lgcrypt -lgpg-error -lstdc++ -lm

3. Создаем папку с конфигами, копируем туда радиус-плагин, его конфиг
mkdir /usr/local/etc/openvpn
cp radiusplugin.so /usr/local/etc/openvpn/
cp radiusplugin.cnf /usr/local/etc/openvpn/

Создаем сертификаты (Читаем команды для openssl тут)

4. cat /usr/local/etc/openvpn/server.conf

dev tap8
port 1194
mode server
tls-server
server 10.1.100.0 255.255.255.0 10.1.100.1
management 127.0.0.1 7505
ca /usr/local/etc/openvpn/keys/server/ca.crt
cert /usr/local/etc/openvpn/keys/server/server.crt
key /usr/local/etc/openvpn/keys/server/server.key
dh /usr/local/etc/openvpn/keys/server/dh1024.pem
tls-auth /usr/local/etc/openvpn/keys/server/ta.key
keepalive 10 60
client-connect /usr/local/abills/libexec/openvpn-up
client-disconnect /usr/local/abills/libexec/openvpn-down
ifconfig-pool-persist /usr/local/etc/openvpn/keys/server/ip.txt 1300000
plugin /usr/local/etc/openvpn/radiusplugin.so /usr/local/etc/openvpn/radiusplugin.cnf
username-as-common-name
comp-lzo
push "redirect-gateway def1"
push "route 0.0.0.0 0.0.0.0"
push "dhcp-option DNS 10.1.100.1"
log-append /var/log/openvpn-server.log

5. cat /usr/local/etc/openvpn/radiusplugin.cnf

NAS-Identifier=openvpn
Service-Type=2
Framed-Protocol=1
NAS-Port-Type=5
NAS-IP-Address=127.0.0.1
OpenVPNConfig=/usr/local/etc/openvpn/server.conf
#subnet=255.255.255.0
server
{
acctport=1813
authport=1812
name=127.0.0.1
retry=1
wait=1
sharedsecret=наш_секретный_пароль_от_радиуса
}

6. cat /usr/local/abills/libexec/openvpn-up

#!/bin/bash

/usr/local/abills/libexec/linkupdown openvpn up $dev inet $ifconfig_local $ifconfig_pool_remote_ip $common_name >& /dev/null

cat /usr/local/abills/libexec/openvpn-down
#!/bin/bash

/usr/local/abills/libexec/linkupdown openvpn down $dev inet $ifconfig_local $ifconfig_pool_remote_ip $common_name >& /dev/null

7. Добавляем в /usr/local/abills/libexec/linkupdown блок типа:

if ($ARGV[0] eq 'mpd') {
$ACTION = $ARGV[1];
$INTERFACE= $ARGV[2];
$USER = $ARGV[6];
$HISADDR = $ARGV[5];
$inum = $INTERFACE;
$inum =~ s/ng//;
}
+elsif ($ARGV[0] eq 'openvpn') {
+ $ACTION = $ARGV[1];
+ $INTERFACE= $ARGV[2];
+ $USER = $ARGV[6];
+ $HISADDR = $ARGV[5];
+ $inum = $INTERFACE;
+ if(! ($inum =~ s/tap//)) {
+ $inum= 100+8
+ } else {
+ $inum = $inum+100;
+ }
+}

8. Заводим ещё один nas с NAS-Identifier=тому что мы указывали в radiusplugin.cnf, тип Other nas server. В radius-параметры не забываем Acct-Interim-Interval=300.

9. /usr/local/sbin/openvpn --daemon --config /usr/local/etc/openvpn/server.conf

Теперь про клиентов (Мастдай):

10. Openvpn/config/example.ovpn

nobind
remote ип_нашего_сервера
port 1194
client
dev tap
proto udp
auth-user-pass authinfo
tls-auth ta.key
pull
tls-client
reneg-sec 1209600
ca tmp-ca.crt
cert client.crt
key client.key
comp-lzo

В Openvpn/config/authinfo две строчки:

логин
пароль

Примечание по клиентскому openvpn:
С какой-то версии openvpn`а заблокирована возможность хранения в текстовом файле логина и пароля пользователя, я не хотел напрягать пользователей каждый раз вводить его вручную, поэтому собрал собственный инсталятор openvpn для клиентов. В него входят уже разблокированные бинарники openvpn, драйвера, openvpn-gui, набор нужных сертификатов и конфигов, а также форма, где просит указать логин и пароль, т.е. клиенту нужно только вписать свой логин/пароль прямо в формочку в инсталяторе, а остальное всё настроит он уже сам. Если кому нужно, то поделюсь скриптами для nsis`а.

Примечание по radiusplugin:
Обработку Framed-IP-Address завести не удалось. Автор пишет следующее:
* OpenBSD(BSD):
- RADIUS attributes FramedIP and FramedRoutes mandatory
- RADIUS attribute FramedIP is ignored
Надо бы связаться с автором и спросить будет ли чинить FramedIP в бсд или нет...

Поэтому пока как костыль, если нужно использование статики, юзаем ifconfig-pool-persist в конфиге openvpn, к примеру ifconfig-pool-persist /usr/local/etc/openvpn/keys/server/ip.txt 1300000.
И в этот ip.txt прописываем вручную/скриптами статические ипшники, в таком формате:
логин,ип
логин2,ип2

Добавлено: Пт май 23, 2008 12:04 pm
Ck-NoSFeRaTU
Up

Добавлено: Пт май 23, 2008 2:25 pm
~AsmodeuS~
если вы не против я внесу в документацию


и на стенде проверю тогда допишу все сто надо уже на готовом примере


больше спасибо

Добавлено: Пт май 23, 2008 2:51 pm
~AsmodeuS~
ещё бы сброс с линии

Добавлено: Вс май 25, 2008 11:47 am
Ck-NoSFeRaTU
~AsmodeuS~ писал(а):ещё бы сброс с линии
Пожалуйста :-)

/cgi-bin/admin/index.cgi:

'dlink_pb' => 'Dlink IP-MAC-Port Binding',
+ 'openvpn' => 'OpenVPN with RadiusPlugin',
'other' => 'Other nas server',

Abills/nas.pl:

elsif ($nas_type eq 'mpd') {
hangup_mpd($NAS, $PORT);
}
+ elsif ($nas_type eq 'openvpn') {
+ hangup_openvpn($NAS, $PORT, $USER);
+ }
elsif ($nas_type eq 'mpd4') {

-----------------------------------------

sub hangup_mpd {
my ($NAS_IP, $PORT) = @_;

my $ctl_port = "pptp$PORT";
my @commands=("\]\tlink $ctl_port",
"\]\tlink $ctl_port",
"\]\tclose",
"\]\texit");

my $result = telnet_cmd("$NAS->{NAS_MNG_IP_PORT}", \@commands);
print $result;
return 0;
}
+sub hangup_openvpn {
+ my ($NAS_IP, $PORT, $USER) = @_;

+ my @commands=(">INFO:OpenVPN Management Interface Version 1 -- type 'help' for more info\tkill $USER",
+ "SUCCESS: common name '$USER' found, 1 client(s) killed\texit");

+ my $result = telnet_cmd("$NAS->{NAS_MNG_IP_PORT}", \@commands);
+ print $result;
+ return 0;
+}

#*******************************************************************
# Get stats from MPD
# stats_mpd($SERVER, $PORT)
#*******************************************************************

В конфиг openvpn пишем строчку management 127.0.0.1 7505
Тип nas`а меняем на 'openvpn:OpenVPN with RadiusPlugin' и в блоке Управление в IP:PORT пишем 127.0.0.1:7505

Добавлено: Вт май 27, 2008 4:46 am
Ck-NoSFeRaTU
Глянул, кстати, вчера исходники radiusplugin`а. Оказалось требовалось всего-то mkdir /usr/local/etc/openvpn/ccd и строчка в конфиг openvpn client-config-dir /usr/local/etc/openvpn/ccd. После этого Framed-Ip-Address нормально заработал. Автор плагина только строчками про игнорирование слегка в заблуждение ввел ^__^
А обрезался acct_session_id в Abills/mysql/Acct.pm в sub accounting есть строчка if (lenght($RAD->{ACCT_SESSION_ID}) > 25 {, в ней 25 за надо заменить на 32, ну и поля в базе расширить, конечно, перед этим.

Добавлено: Вт май 27, 2008 5:42 am
~AsmodeuS~
да ошибочка

поменял чтобы выбирало 25 символов для базы

думаю этот ключ только для индентификации используется

Добавлено: Вт май 27, 2008 5:42 am
ran
пасиба - бум знать... тож на оупенвпн подумываю перелезть :wink: Кста... судя по:
dev tap8
ты его как изернет ифейс юзаешь? я просто не помню, давно когда-то с ним игрался. Там насколько помню можно как изернет и как туннель а если как изернет - то можно и бриджи с реальными ифейсами делать

Добавлено: Вт май 27, 2008 7:48 am
Ck-NoSFeRaTU
ran писал(а):пасиба - бум знать... тож на оупенвпн подумываю перелезть :wink:
А мне он нужен, чтобы пару клиентов пускать с локалки местного домолинка. Этот гадский глюканат, а не провайдер, рвет TCP-сессии каждые 5-10 минут, из-за чего PPTP постоянно дохнет, а ругаться с ними бесполезно.
ran писал(а):Кста... судя по:
dev tap8
ты его как изернет ифейс юзаешь? я просто не помню, давно когда-то с ним игрался. Там насколько помню можно как изернет и как туннель а если как изернет - то можно и бриджи с реальными ифейсами делать
Угу, только без client-to-client. Собственно разницы особой нет. Клиенты на мастдаях, а они не поддерживают установку адресов концов туннеля, отличных от /30, смысл от таких туннелей...
Кстати, так как все клиенты прут как бы через один туннель, то надо чуть сильнее изменить linkupdown, чем говорилось ранее, иначе правила шейперов при выходе/заходе юзеров будут наслаиваться/убиваться:

Код: Выделить всё

# Arguments
my ($ACTION, $INTERFACE, $USER, $HISADDR, $inum);

+require Admins;
+Admins->import();
+require Dv;
+Dv->import();
+
+my $admin = Admins->new($db, \%conf);
+$admin->info($conf{SYSTEM_ADMIN_ID}, { IP => '127.0.0.1' });
+my $Dv = Dv->new($db, $admin, \%conf);
+
#MPD
if ($ARGV[0] eq 'mpd') {
  $ACTION   = $ARGV[1];
  $INTERFACE= $ARGV[2];
  $USER     = $ARGV[6];
  $HISADDR  = $ARGV[5];
  $inum     = $INTERFACE;
  $inum     =~ s/ng//;
}
+#OpenVPN
+elsif ($ARGV[0] eq 'openvpn') {
+  $ACTION   = $ARGV[1];
+  $INTERFACE= $ARGV[2];
+  $USER     = $ARGV[6];
+  $HISADDR  = $ARGV[5];

+  my $user = undef;

+  $user = $Dv->info(0, { LOGIN => $USER });
+  $inum = $user->{UID}+$conf{OPENVPN_FW_FIRST_RULE};
+}

#pppd
elsif ($ARGV[0] eq 'ipn') {
  $ACTION    = $ARGV[1];
  $INTERFACE = $ARGV[2];

Код: Выделить всё

$INTERFACE=~s/\n//;
my $via_if_in  = ($INTERFACE ne '-') ? "via $INTERFACE in" : '';
my $via_if_out = ($INTERFACE ne '-') ? "via $INTERFACE out" : '';

-require Admins;
-Admins->import();
-require Dv;
-Dv->import();
-
-
-my $admin = Admins->new($db, \%conf);
-$admin->info($conf{SYSTEM_ADMIN_ID}, { IP => '127.0.0.1' });
-my $Dv = Dv->new($db, $admin, \%conf);
-

my @FW_ACTIONS = ();
# Flush rules
Ну, и в конфиг добавить $conf{OPENVPN_FW_FIRST_RULE}=100;

Вообщем вроде всё, что требуется от nas`а работает, если вдруг надо могу оформить все правки к биллингу в виде человеческого diff`а.

Добавлено: Вт май 27, 2008 8:31 am
~AsmodeuS~
а зачем юзер ид что по номеру интерфеса нельзя ?

Добавлено: Вт май 27, 2008 9:33 am
ran
Клиенты на мастдаях, а они не поддерживают установку адресов концов туннеля, отличных от /30, смысл от таких туннелей...
Кстати, так как все клиенты прут как бы через один туннель, то надо чуть сильнее изменить linkupdown, чем говорилось ранее, иначе правила шейперов при выходе/заходе юзеров будут наслаиваться/убиваться:
это да... в смысле о /30... а на счёт линкапдаун - это ваши бздёшные проблемы мне под линух один хрен переписывать... та и если честно, у меня уже давно свой линкапдаун на сях писаный :wink: ну не люблю я пёрдл - звыняйте :D

а насчёт изернета - я имел ввиду, можно ли сделать так, чтобы все клиенты сидели на одном виртуальном тапе и при этом авторизация через радиус? нечто подобное я просто лет 8 назад делал - щас не помню уже а доки читать некогда :wink: