MPD+IPFW

Настройка сетевых служб, маршрутизации, фаерволлов. Проблемы с сетевым оборудованием.
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
sidor-r
мл. сержант
Сообщения: 139
Зарегистрирован: 2006-09-05 9:50:17
Контактная информация:

MPD+IPFW

Непрочитанное сообщение sidor-r » 2006-09-05 10:11:14

Добрый день.
Возникла необходимость предоставить доступ к терминальному серверу, а так же к ресурсам локальной сети по средствам VPN. MPD настраивал по статье на этом сайте.
Имеем шлюз на FreeBSD 5.5 и MPD.
Проблема в седующем: Всё сделал, настроил MPD, при подключении связь устанавливается, пинг до терменального сервера внутри сети идет но набрав его IP в клиенте терминала соединение не происходит также нет доступа к внутренним локальным ресурсам хотя пинг до всех серверов идет нормально. Как это можно исправить?
Подскажите какие правила добавить в IPFW и под каким намером?
Эксперементировать нет вожможности т.к. все настраиваю на рабочем сервере!!!

rl1 - 195.XXX.XXX.XXX-внешний адрес
rl0 - 192.168.111.0/24-Локальная сеть
ng* - 192.168.100.0/24-Адреса которые выдаются vpn клиентам.


В ядро вкючены следуюшие функции:


Код:

options IPFIREWALL
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=100
options IPFIREWALL_DEFAULT_TO_ACCEPT
options IPFIREWALL_FORWARD
options IPDIVERT

options NETGRAPH
options NETGRAPH_BPF
options NETGRAPH_IFACE
options NETGRAPH_KSOCKET
options NETGRAPH_MPPC_ENCRYPTION
options NETGRAPH_PPP
options NETGRAPH_PPTPGRE
options NETGRAPH_SOCKET
options NETGRAPH_VJC
options NETGRAPH_ETHER
options NETGRAPH_SOCKET
options NETGRAPH_TEE



mpd.conf

Код:

default:
load pptp0
load pptp1
load pptp2


pptp0:
new -i ng0 pptp0 pptp0
set ipcp ranges 192.168.100.1/24 192.168.100.100/24
load pptp_standart

pptp1:
new -i ng1 pptp1 pptp1
set ipcp ranges 192.168.100.1/24 192.168.100.101/24
load pptp_standart

pptp2:
new -i ng2 pptp2 pptp2
set ipcp ranges 192.168.100.1/24 192.168.100.102/24
load pptp_standart

pptp_standart:
set iface disable on-demand
set bundle disable multilink
set link yes acfcomp protocomp

set link no pap chap
set link enable chap
set link keep-alive 60 180
set ipcp yes vjcomp

set iface enable proxy-arp

set bundle enable compression

set ccp yes mppc

set ccp yes mpp-e40
set ccp yes mpp-e128
set ccp yes mpp-stateless
set bundle yes crypt-reqd

set pptp self 195.XXX.XXX.XXX

set pptp enable incoming
set pptp disable originate



mpd.links

Код:

pptp0:
set link type pptp
pptp1:
set link type pptp
pptp2:
set link type pptp



mpd.secret

Код:

user "testpassword" 192.168.100.100



#ipfw list
00100 check-state
00200 allow ip from any to any via lo0
00300 deny ip from any to 10.0.0.0/8 in via rl1
00400 deny ip from any to 172.16.0.0/12 in via rl1
00600 deny ip from any to 0.0.0.0/8 in via rl1
00700 deny ip from any to 169.254.0.0/16 in via rl1
00800 deny ip from any to 240.0.0.0/4 in via rl1
00900 deny icmp from any to any frag
01000 deny log logamount 1000 icmp from any to 255.255.255.255 in via rl1
01100 deny log logamount 1000 icmp from any to 255.255.255.255 out via rl1
01140 allow tcp from any 1723 to any via rl0
01150 allow tcp from any to me dst-port 1723
01160 allow gre from any to any
01300 fwd 127.0.0.1,3128 tcp from 192.168.111.0/24 to any dst-port 80,443 via rl1
01310 divert 8668 ip from 192.168.100.0/24 to any out via rl1
01400 divert 8668 ip from 192.168.111.0/24 to any out via rl1
01500 divert 8668 ip from any to 195.XXX.XXX.XXX in via rl1
01600 deny ip from 10.0.0.0/8 to any out via rl1
01700 deny ip from 172.16.0.0/12 to any out via rl1
01900 deny ip from 0.0.0.0/8 to any out via rl1
02000 deny ip from 169.254.0.0/16 to any out via rl1
02100 deny ip from 224.0.0.0/4 to any out via rl1
02200 deny ip from 240.0.0.0/4 to any out via rl1
02300 allow tcp from any to any established
02400 allow ip from 195.XXX.XXX.XXX to any out xmit rl1
02500 allow udp from any 53 to any via rl1
02600 allow tcp from any 3389 to any via rl1
02700 allow tcp from any to any dst-port 3389 via rl1
02800 allow tcp from any 4899 to any via rl1
02900 allow tcp from any to any dst-port 4899 via rl1
03000 allow icmp from any to any icmptypes 0,8,11
03100 allow tcp from any to 195.XXX.XXX.XXX dst-port 22 via rl1
03200 allow tcp from any to any via rl0
03300 allow udp from any to any via rl0
03400 allow icmp from any to any via rl0
03500 deny ip from any to any
65535 allow ip from any to any

ОЧЕНЬ НАДЕЮСЬ НА ВАШУ ПОМОШЬ!!!

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2460 рублей (8 CPU, 8Gb RAM, 2x500Gb HDD, RAID 3ware 9750):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Happy_demon
сержант
Сообщения: 194
Зарегистрирован: 2006-08-16 16:33:55
Откуда: Санкт-Петербург

Непрочитанное сообщение Happy_demon » 2006-09-05 17:33:12

в общем нашел сие в нете, поэтому на вопросы ответить не смогу, на аффтарство не претендую. в файл mpd.conf добавляются след строки
set iface up-script /usr/local/etc/billing/up-script
set iface down-script /usr/local/etc/billing/down-script
эти файлы представляют из себя следующее

cat /usr/local/etc/billing/up-script

#!/usr/bin/perl

use strict;
$|=1;
my $username = $ARGV[4];
my @rule_numbers;
my $user_ip;
my $logmsg = '/usr/local/billing/vpn/logmsg.pl';
my $user_if;
my $er_if;
my @a;

if($username eq 'mpd_vpn!'){
@rule_numbers = ('350', '351', '1', '2');
$user_ip = '192.168.25.10';
}elsif($username eq 'mpd_UzeR_ZaDniY'){
@rule_numbers = ('9', '10', '3', '4');
$user_ip = '192.168.25.11';
}elsif($username eq 'mpd_UzeR_T5KoFF'){
@rule_numbers = ('354', '355', '5', '6');
$user_ip = '192.168.25.12';
}elsif($username eq 'mpd_UzeR_!oHA'){
@rule_numbers = ('356', '357', '7', '8');
$user_ip = '192.168.25.13';
}elsif($username eq 'mpd_UzeR_Bss'){
@rule_numbers = ('358', '359', '9', '10');
$user_ip = '192.168.25.14';
}elsif($username eq 'mpd_UzeR_DA'){
@rule_numbers = ('360', '361', '11', '12');
$user_ip = '192.168.25.15';
}else{
`$logmsg "$username connected!"`;
}

@a=`ifconfig | grep -E '^ng.*1500' | awk -F: '{print $1}'`;
$er_if = substr ($a[0],2,1);
$er_if = $er_if-1;
$user_if = "ng" . $er_if;
print "$user_if";
#allow this user and set traffic counters for him
sub ipfw_init {
`ipfw add $rule_numbers[0] allow udp from $user_ip to any via $user_if`;
`ipfw add $rule_numbers[1] allow tcp from $user_ip to any via $user_if`;
`ipfw add $rule_numbers[2] count ip from any to $user_ip`;
`ipfw add $rule_numbers[3] count ip from $user_ip to any`;
}
#sub ipfw_init {
# `ipfw add $rule_numbers[0] allow ip from any to $user_ip via $user_if`;
# `ipfw add $rule_numbers[1] allow ip from $user_ip to any via $user_if`;
# `ipfw add $rule_numbers[0] allow gre from $user_ip to me`;
# `ipfw add $rule_numbers[1] allow gre from me to $user_ip`;
# `ipfw add $rule_numbers[2] count tcp from any to $user_ip`;
# `ipfw add $rule_numbers[3] count tcp from $user_ip to any`;
#}

&ipfw_init();

`$logmsg "user=$username action=connect"`;



cat /usr/local/etc/billing/down-script


#!/usr/bin/perl -w
use strict;
$|=1;
my $username = $ARGV[2];
my @rule_numbers;
my $cost;
my $correction;
my $path_to_logs = '/usr/local/billing/vpn/logs/';
my $logmsg = '/usr/local/billing/vpn/logmsg.pl';

if($username eq 'mpd_vpn!'){
@rule_numbers = ('350', '351', '1', '2');
$cost = 25;
$correction = 1;
}elsif($username eq 'mpd_UzeR_ZaDniY'){
@rule_numbers = ('9', '10', '3', '4');
$cost = 25;
$correction = 1;
}elsif($username eq 'mpd_UzeR_TFF'){
@rule_numbers = ('354', '355', '5', '6');
$cost = 25;
$correction = 1;
}elsif($username eq 'mpd_UzeR_!GA'){
@rule_numbers = ('356', '357', '7', '8');
$cost = 25;
$correction = 1;
}elsif($username eq 'mpd_UzeR_B0'){
@rule_numbers = ('358', '359', '9', '10');
$cost = 25;
$correction = 1;
}elsif($username eq 'mpd_UzeR_DnA'){
@rule_numbers = ('360', '361', '11', '12');
$cost = 25;
$correction = 1;

}else{
`$logmsg "$username disconnected!"`;
}

sub save_stats {
my $download = `ipfw -a list $rule_numbers[2]`;
my $upload = `ipfw -a list $rule_numbers[3]`;
my @splitted_download = split(/\s+/, $download);
my @splitted_upload = split(/\s+/, $upload);
my $session_cost = ($splitted_download[2] + $splitted_upload[2]) / 1024 / 1024 * $cost * $correction;

open(STATS, ">>" . $path_to_logs . $username . ".stats") or `$logmsg "Couldn't open STATS, while

saving_stats. Reason: $!`;
print STATS scalar localtime() . " download=$splitted_download[2] upload=$splitted_upload[2]\n";
print STATS "Session cost: $session_cost";
print STATS "\n\n";
close(STATS);

`$logmsg "user=$username action=disconnect session_cost=$session_cost"`;
}


sub clean_ipfw {
`ipfw delete $rule_numbers[0]`;
`ipfw delete $rule_numbers[1]`;
`ipfw delete $rule_numbers[2]`;
`ipfw delete $rule_numbers[3]`;
}

&save_stats();
&clean_ipfw();



упоменаемый здесь logmsg.pl выглядит так

#!/usr/bin/perl -w

$|=1;

my $path_to_logs = '/usr/local/billing/vpn/logs/';
sub logmsg{

$logmessage = "#$0#$$#@_#" . scalar localtime() . "\n";
open (LOG, ">>" . $path_to_logs . "logfile");
print LOG $logmessage;
close(LOG);
}

logmsg shift;

в общем все просто. в mpd.secret есть пользователи с прописанными им айпи. mpd.conf читает файлы скриптов на перл, которые поднимают или убивают правила ipfw, logmsg пишит логи. если подключается пользователь, имя которого есть во-первых в mpd.secret а во-вторых в up-script - запускаются соответствующие несколько правил, когда он отключается- эти правила вырубаются. все просто и красиво.
ну в общем надо подправить пути- и все путем. как уже говорил-скрипты не мои-если не работают-ничем не могу. у меня заработали сразу

Аватара пользователя
sidor-r
мл. сержант
Сообщения: 139
Зарегистрирован: 2006-09-05 9:50:17
Контактная информация:

Непрочитанное сообщение sidor-r » 2006-09-05 22:23:35

2 Happy_demon

Что ЭТО???
Я просто просил помочь мне добавить правило в ipfw
так чтобы работал vpn!!!

Happy_demon
сержант
Сообщения: 194
Зарегистрирован: 2006-08-16 16:33:55
Откуда: Санкт-Петербург

Непрочитанное сообщение Happy_demon » 2006-09-06 7:30:56

дак это лучше- это скрипты, которые сами добавляют динамически правила при подключении пользователей и сами же их удаляют при их отключении. если хорошо подумать то из этих скриптов можно понять, какие правила надо прописывать. если не можешь этого сделать- тогда лучше не заморачивайся с mpd, а поставь ppptd- на этом сайте есть оч. хор статья, предельно простая
З.Ы. хотел как лучше.....

Аватара пользователя
sidor-r
мл. сержант
Сообщения: 139
Зарегистрирован: 2006-09-05 9:50:17
Контактная информация:

Непрочитанное сообщение sidor-r » 2006-09-06 9:47:18

Happy_demon писал(а): З.Ы. хотел как лучше.....
Спасибо
Happy_demon писал(а): тогда лучше не заморачивайся с mpd
Хочу освоить mpd, а если не заморачиваться то ни когда и не освоишь!

Аватара пользователя
sidor-r
мл. сержант
Сообщения: 139
Зарегистрирован: 2006-09-05 9:50:17
Контактная информация:

Непрочитанное сообщение sidor-r » 2006-09-07 10:51:23

добавил правило и всё заработало как мне надо

01170 allow tcp from any to any via ng0
01180 allow udp from any to any via ng0

Но возник второй вопрос: Какое создать правило чтоб не добовлять для каждого vpn интерфейса (ng1...ng100) отдельное правило?

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

Непрочитанное сообщение dikens3 » 2006-09-07 11:13:36

sidor-r писал(а):добавил правило и всё заработало как мне надо

01170 allow tcp from any to any via ng0
01180 allow udp from any to any via ng0

Но возник второй вопрос: Какое создать правило чтоб не добовлять для каждого vpn интерфейса (ng1...ng100) отдельное правило?

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

01170 allow tcp from any to any via ng*
01180 allow udp from any to any via ng*
Так и пишешь ng*

Аватара пользователя
sidor-r
мл. сержант
Сообщения: 139
Зарегистрирован: 2006-09-05 9:50:17
Контактная информация:

Непрочитанное сообщение sidor-r » 2006-09-07 13:48:36

dikens3 писал(а):

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

01170 allow tcp from any to any via ng*
01180 allow udp from any to any via ng*
Так и пишешь ng*
на это мне ответил
ipfw: Нет соответствий
Что это значит?

Happy_demon
сержант
Сообщения: 194
Зарегистрирован: 2006-08-16 16:33:55
Откуда: Санкт-Петербург

Непрочитанное сообщение Happy_demon » 2006-09-07 14:31:15

8) попробуй все же скрипты, которые я прислал- они ведь специально для решения этой проблемы и были написаны. в ipfw.conf будут ДИНАМИЧЕСКИ добавляться правила и не надо будет прописывать туда все свои интерфейсы. а это насколько я понимаю еще плохо с точки зрения длины проверки входящих и исходящих пакетов (чем меньше правил- тем быстрее). удачи

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

Непрочитанное сообщение dikens3 » 2006-09-07 14:45:02

на это мне ответил
ipfw: Нет соответствий
Что это значит?

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

# cat 222.sh
#!/usr/local/bin/bash
ipfw -q add deny all from any to any via ng*
У меня нормально через BASH-cкрипт запускается.

Попробуй так:

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

ipfw -q add deny all from any to any via ng\*

Аватара пользователя
sidor-r
мл. сержант
Сообщения: 139
Зарегистрирован: 2006-09-05 9:50:17
Контактная информация:

Непрочитанное сообщение sidor-r » 2006-09-07 17:12:30

dikens3 писал(а): Попробуй так:

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

ipfw -q add deny all from any to any via ng\*
вот так получилось
спасибо бальшое!!!