Freebsd 9 + mpd5 (pptpclient) + pf = route problem

Настройка сетевых служб, маршрутизации, фаерволлов. Проблемы с сетевым оборудованием.
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Kaspian
рядовой
Сообщения: 22
Зарегистрирован: 2008-12-08 20:00:10

Freebsd 9 + mpd5 (pptpclient) + pf = route problem

Непрочитанное сообщение Kaspian » 2011-10-30 14:41:38

Привет всем.

Хочу поведать о странном поведении системы.
Иногда отваливается vpn соединение. Что-то подменяет маршрут до vpn сервера из-за чего обрывается соединение, дальше отрабатывают скрипты и восстанавливают маршруты - но вещь очень не приятная. Удивительно то, что всё может часами нормально работать даже с включённым торрент клиентом, но 100% ломаться при запуске сетевой игры Battlefield 3 (момент подключения к серверу).
На windows7 как и при использовании роутера tl-wr1043nd - проблем не замечено. Быть может кто сталкивался с подобным или предложит метод дальнейшего анализа проблемы.

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

# uname -a
FreeBSD bender.xz.local 9.0-RC1 FreeBSD 9.0-RC1 #2: Fri Oct 21 15:44:25 FET 2011     kaspian@bender:/usr/obj/usr/src/sys/XZ9  i386

mpd5 --version
Version 5.5 (root@bender 23:58 20-Oct-2011)


# ifconfig
brizif: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=8<VLAN_MTU>
        ether 00:48:54:3d:6b:e9
        inet 172.18.169.182 netmask 0xffffff00 broadcast 172.18.169.255
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
localif: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=3808<VLAN_MTU,WOL_UCAST,WOL_MCAST,WOL_MAGIC>
        ether 00:30:4f:27:67:e6
        inet 10.20.30.1 netmask 0xffffff00 broadcast 10.20.30.255
        inet6 fe80::230:4fff:fe27:67e6%localif prefixlen 64 scopeid 0x4
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
plip0: flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> metric 0 mtu 1500
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
        options=3<RXCSUM,TXCSUM>
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x7
        inet 127.0.0.1 netmask 0xff000000
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
pflog0: flags=141<UP,RUNNING,PROMISC> metric 0 mtu 33200
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
ng0: flags=88d1<UP,POINTOPOINT,RUNNING,NOARP,SIMPLEX,MULTICAST> metric 0 mtu 1400
        inet 109.200.233.10 --> 213.231.0.22 netmask 0xffffffff
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
brizif - интерфейс подключённый к провайдеру (IP получен по DHCP)
localif - интерфей к которому подключена локальная сеть (IP адреса раздаются через DHCPD)
ng0 - интерфейс создаваемый mpd5 (pptp подключение)

/etc/rc.conf

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

ifconfig_rl0_name="brizif"
ifconfig_brizif="DHCP"

ifconfig_rl1_name="localif"
ifconfig_localif="inet 10.20.30.1 netmask 255.255.255.0"
/usr/local/etc/mpd5/mpd.conf

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

startup:

default:
    load pptp_client

pptp_client:
    create bundle static B1
#    set iface route default
    set ipcp ranges 0.0.0.0/0 0.0.0/0

    set iface disable on-demand
    set iface idle 0
    set iface enable tcpmssfix

    set ipcp yes vjcomp
    set mppc yes stateless

    set iface up-script /root/scripts/briz-vpn-up.sh
    set iface down-script /root/scripts/briz-vpn-down.sh

    create link static L1 pptp
    set link action bundle B1
    set link disable multilink
    set pptp peer vpn.briz.ua
    set pptp enable outcall

    set auth authname "kaspian**"
    set auth password "***********"
    set link disable pap chap
    set link accept pap
    set link enable no-orig-auth
    set link yes acfcomp protocomp
    set link keep-alive 10 60
#    set link mtu 1460
    set link max-redial 0
#    set pptp disable windowing
    open
Провайдер имеет несколько vpn серверов. И с помощью dns балансирует нагрузку на них:

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

# host vpn.briz.ua
vpn.briz.ua has address 192.168.1.134
vpn.briz.ua has address 192.168.1.126
vpn.briz.ua has address 192.168.1.125
vpn.briz.ua has address 192.168.1.128
vpn.briz.ua has address 192.168.1.127
vpn.briz.ua has address 192.168.1.130
vpn.briz.ua has address 192.168.1.131
vpn.briz.ua has address 192.168.1.135
vpn.briz.ua has address 192.168.1.132
vpn.briz.ua has address 192.168.1.133
vpn.briz.ua has address 192.168.1.129
vpn.briz.ua has address 192.168.1.124

Скрипт выполняемый при подключение к провайдеру
/root/scripts/briz-vpn-up.sh

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

BRIZ_IF="ng0"
BRIZ_GW=${4}
BRIZ_LOCAL_GW="172.18.169.1"

LOG_FILE="/var/log/briz.log"

/root/scripts/dump-routes.sh up_before_route_chanes

/sbin/route del default
/sbin/route add default $BRIZ_GW
/sbin/route del 192.168.1.0/24
/sbin/route add 192.168.1.0/24 $BRIZ_LOCAL_GW

/root/scripts/dump-routes.sh up_after_route_changes

echo "CONNECT" `/bin/date` >> $LOG_FILE
Скрипт выполняемый при разрыве соединения
/root/scripts/briz-vpn-down.sh

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

BRIZ_LOCAL_GW="172.18.169.1"

LOG_FILE="/var/log/briz.log"

/root/scripts/dump-routes.sh down_before_route_chanes

/sbin/route del default
/sbin/route del 192.168.1.0/24
/sbin/route add 192.168.1.0/24 $BRIZ_LOCAL_GW

/root/scripts/dump-routes.sh up_after_route_chanes

echo "DISCONNECT" `/bin/date` >> $LOG_FILE
При каждом подключении\отключении я сохраняю текущее состояние таблицы маршрутизации при помощи следующего скрипта:
/root/scripts/dump-routes.sh

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

ACTION=${1}
LOG_FILE="/root/routes.dump"

echo "--------------" $ACTION "------------" >> $LOG_FILE
/bin/date >> $LOG_FILE
/usr/bin/netstat -rn -f inet >> $LOG_FILE
echo "=====================================" >> $LOG_FILE
Ну а теперь самое интересное, это состояние маршрутов

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

# Это состояние нормально при котором всё работает, можно сказать эталонное
-------------- up_after_route_changes ------------
Sun Oct 30 13:51:20 FET 2011
Routing tables

Internet:
Destination        Gateway            Flags    Refs      Use  Netif Expire
default            213.231.0.22       UGS         0        0    ng0
10.20.30.0/24      link#4             U           0   173707 locali
10.20.30.1         link#4             UHS         0        0    lo0
109.200.233.10     link#9             UHS         0        0    lo0
127.0.0.1          link#7             UH          0      386    lo0
172.17.0.0/16      172.18.169.1       UGS         0        0 brizif
172.18.0.0/16      172.18.169.1       UGS         0       66 brizif
172.18.169.0/24    link#3             U           0        0 brizif
172.18.169.182     link#3             UHS         0       68    lo0
192.168.1.0/24     172.18.169.1       UGS         0        9 brizif
213.231.0.22       link#9             UH          0        0    ng0
=====================================

# А это состояние при котором происходит разрыв соединения
-------------- down_before_route_chanes ------------
Sun Oct 30 13:52:20 FET 2011
Routing tables

Internet:
Destination        Gateway            Flags    Refs      Use  Netif Expire
default            213.231.0.22       UGS         0      908    ng0
10.20.30.0/24      link#4             U           0   174174 locali
10.20.30.1         link#4             UHS         0        0    lo0
109.200.233.10     link#9             UHS         0        0    lo0
127.0.0.1          link#7             UH          0      386    lo0
172.17.0.0/16      172.18.169.1       UGS         0        0 brizif
172.18.0.0/16      172.18.169.1       UGS         0       66 brizif
172.18.169.0/24    link#3             U           0        0 brizif
172.18.169.182     link#3             UHS         0       68    lo0
192.168.1.0/24     79.135.208.179     UGS         0     1097 brizif
213.231.0.22       link#9             UH          0        0    ng0
=====================================
Как видите маршрут до 192.168.1.0/24 заменён какой-то фигнёй (79.135.208.179 этот аддресс не постоянен и в разных случаях заменяется на другой).

Хостинговая компания 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/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Kaspian
рядовой
Сообщения: 22
Зарегистрирован: 2008-12-08 20:00:10

Re: Freebsd 9 + mpd5 (pptpclient) + pf = route problem

Непрочитанное сообщение Kaspian » 2011-10-30 14:47:04

Если кому будет интересен лог (log +all) mpd5 - хотя в нём я ничего странного не заметил.
Вложения
mpd.3.log.txt
mpd5 log file
(28.05 КБ) 50 скачиваний

Kaspian
рядовой
Сообщения: 22
Зарегистрирован: 2008-12-08 20:00:10

Re: Freebsd 9 + mpd5 (pptpclient) + pf = route problem

Непрочитанное сообщение Kaspian » 2011-10-30 14:56:10

Интереса ради добавил в таблицу маршрутизации каждый возможной vpn сервер отдельно. Маршрут портиться именно для активного:

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

192.168.1.0/24     172.18.169.1       UGS         0    90606 brizif
192.168.1.124      172.18.169.1       UGHS        0        0 brizif
192.168.1.125      172.18.169.1       UGHS        0        0 brizif
192.168.1.126      172.18.169.1       UGHS        0        0 brizif
192.168.1.127      172.18.169.1       UGHS        0        0 brizif
192.168.1.128      172.18.169.1       UGHS        0        0 brizif
192.168.1.129      94.236.97.45       UGHS        0     4713 brizif !!!!!!!!!!!!!!
192.168.1.130      172.18.169.1       UGHS        0        0 brizif
192.168.1.131      172.18.169.1       UGHS        0        0 brizif
192.168.1.132      172.18.169.1       UGHS        0        0 brizif
192.168.1.133      172.18.169.1       UGHS        0        0 brizif
192.168.1.134      172.18.169.1       UGHS        0       53 brizif
192.168.1.135      172.18.169.1       UGHS        0        0 brizif

Kaspian
рядовой
Сообщения: 22
Зарегистрирован: 2008-12-08 20:00:10

Re: Freebsd 9 + mpd5 (pptpclient) + pf = route problem

Непрочитанное сообщение Kaspian » 2011-10-30 22:21:44

Тесты показали что виновником является связка pf + mpd5.
Пробовал ipfw + mpd5 и pf + pptpclient - всё нормально.

Я максимально упростил конфиг pf, но проблема не ушла. Чую прийдётся переходить на ipfw...

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

briz_local_if = "brizif"

briz_if = "ng0"

lan_net = "10.20.30.0/24"
int_if  = "localif"

icmp_types = "{ echoreq, unreach }"

# 21125 - Vuze
# 3389 - Terminal client
rdr_ports = "{ 3389, 21125 }"

allowed_services = "{ 20:21, 22, http, https}"

# Options
#set block-policy drop
set skip on lo0
#set limit { states 100000, src-nodes 30000, frags 50000 }
#set timeout { tcp.first 120, tcp.opening 30, tcp.established 3600}

#  nat outgoing connections on each internet interface
nat on $briz_if from $lan_net to any -> ($briz_if)

#  default deny
block in

pass in log proto { tcp, udp } from any to self port $allowed_services

# Allow ping :)
pass inet proto icmp all icmp-type $icmp_types

# Pass in on int_if to me
pass in quick on $int_if from $lan_net to ($int_if)

#  pass all outgoing packets on interface's
pass out on $int_if from any to $lan_net allow-opts
pass out on $briz_local_if proto { gre, tcp, udp } from any to any

# allow traffic in local network
pass out quick on $int_if allow-opts
pass in quick on $int_if allow-opts

seregasoft
проходил мимо
Сообщения: 4
Зарегистрирован: 2012-01-28 14:57:51

Re: Freebsd 9 + mpd5 (pptpclient) + pf = route problem

Непрочитанное сообщение seregasoft » 2012-01-28 15:06:12

Привет, Kaspian
У меня та же самая проблема. Появилась после апгрейда freebsd c 8.2 до 9
Подключаюсь mpd5:

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

Destination        Gateway            Flags    Refs      Use  Netif Expire
default            83.102.254.213     UGS         0      675    ng0
10.74.96.0/21      link#5             U           0       96   bfe0
10.74.96.6         link#5             UHS         0        7    lo0
83.102.254.213     10.74.96.1         UGHS        0      681   bfe0
95.26.94.204       link#8             UHS         0        0    lo0
127.0.0.1          link#6             UH          0  2177703    lo0
192.168.6.0/24     link#7             U           0   803768    ue0
192.168.6.1        link#7             UHS         0      604    lo0
233.32.240.0/24    10.74.96.6         US          0        0   bfe0
Пытаюсь позвонить по Скайпу, и сразу:

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

Internet:
Destination        Gateway            Flags    Refs      Use  Netif Expire
default            83.102.254.213     UGS         0     2642    ng0
10.74.96.0/21      link#5             U           0       96   bfe0
10.74.96.6         link#5             UHS         0        7    lo0
83.102.254.213     50.131.165.212     UGHS        0     2653   bfe0
95.26.94.204       link#8             UHS         0        0    lo0
127.0.0.1          link#6             UH          0  2179529    lo0
192.168.6.0/24     link#7             U           0   806031    ue0
192.168.6.1        link#7             UHS         0      611    lo0
233.32.240.0/24    10.74.96.6         US          0        0   bfe0
Внезапно роутинг

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

 83.102.254.213     50.131.165.212
Левый гейт в каждом случае бывает разный.
Тебе еще не удалось восстановить нормальную работу с mpd5 + pf? Не хочу ipfw :(

Если починю, отпишусь.

Kaspian
рядовой
Сообщения: 22
Зарегистрирован: 2008-12-08 20:00:10

Re: Freebsd 9 + mpd5 (pptpclient) + pf = route problem

Непрочитанное сообщение Kaspian » 2012-01-28 16:46:26

Подружить pf + mpd 5.5 мне так и не удалось - я перешёл на ipfw.
Недавно вышел mpd 5.6 - возможно с ним проблем не будет.

seregasoft
проходил мимо
Сообщения: 4
Зарегистрирован: 2012-01-28 14:57:51

Re: Freebsd 9 + mpd5 (pptpclient) + pf = route problem

Непрочитанное сообщение seregasoft » 2012-01-28 16:55:19

Kaspian писал(а):Подружить pf + mpd 5.5 мне так и не удалось - я перешёл на ipfw.
Недавно вышел mpd 5.6 - возможно с ним проблем не будет.
Стоит mpd-5.6, та же хрень. Буду разбираться. Хоть я не один такой :) Спасибо за решение с ipfw.

Аватара пользователя
Jah
ефрейтор
Сообщения: 60
Зарегистрирован: 2007-09-19 12:42:38
Откуда: Воронеж
Контактная информация:

Re: Freebsd 9 + mpd5 (pptpclient) + pf = route problem

Непрочитанное сообщение Jah » 2012-03-23 10:15:57

Та же самая проблема. Никто не решил? Не очень понятно каким образом pf может гадить в таблицу маршрутизации, или кто этим занимается? Сам mpd?

drg
рядовой
Сообщения: 10
Зарегистрирован: 2007-08-07 14:40:06

Re: Freebsd 9 + mpd5 (pptpclient) + pf = route problem

Непрочитанное сообщение drg » 2012-05-27 15:03:12

Доброго времени суток, господа.
А при переходе на ipfw с pf не возникали у вас проблемы с натом? Может, конечно, отсутствие опыта общения с ipfw сослужило свою дурную службу, но ни ядерный нат ни natd не получилось заставить работать с ng-интерфейсом, пока что инет бегает благодаря включенному set iface enable nat в mpd.conf, но это костыль а не решение. Может кто-нибудь, пожалуйста, подсказать решение/поделиться конфигом?

Kaspian
рядовой
Сообщения: 22
Зарегистрирован: 2008-12-08 20:00:10

Re: Freebsd 9 + mpd5 (pptpclient) + pf = route problem

Непрочитанное сообщение Kaspian » 2012-05-27 15:36:51

Как я заметил секцию nat нужно обновлять каждый раз когда устанавливается соединение - добавлять только когда соединение установлено и удалять + создавать по новой при переподключении. update-nat-rules.sh - выполняется из mpd как "iface up-script" и "iface down-script"
У ниже приведённого конфига есть недостаток - не работает traceroute с фряшной машины, если кто-то поможет исправить буду благодарен - но в целом всё работает нормально.

$ cat update-nat-rules.sh

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

#!/bin/sh

ipfw='/sbin/ipfw'

lan_ip="aa.bb.cc.1"
lan_net="aa.bb.cc.dd"

briz_local_resources="192.168.1.0/24,172.17.0.0/16,172.18.0.0/16,172.18.169.0/24"

briz_local_if="brizif"
briz_local_ip=`ifconfig $briz_local_if | grep "inet " | awk '{print $2}'`

briz_if="briz_vpn"
briz_ip=`ifconfig $briz_if | grep "inet " | awk '{print $2}'`

nat_rules="5100 5200 5300 5400"

# Just for debug
echo "briz local ip = ${briz_local_ip}"
echo "briz ip = ${briz_ip}"

# Remove old nat rules
${ipfw} delete ${nat_rules}

# NAT for local resources
if [ "$briz_local_ip" != "" ]; then
    ${ipfw} nat 122 config if ${briz_local_if} deny_in reset same_ports
    ${ipfw} add 5100 nat 122 all from ${lan_net} to ${briz_local_resources}
    ${ipfw} add 5200 nat 122 all from any to ${briz_local_ip}
fi


# Global NAT
if [ "$briz_ip" != "" ]; then
    ${ipfw} nat 123 config if ${briz_if} deny_in reset same_ports

    ${ipfw} add 5300 nat 123 all from ${lan_net} to any
    ${ipfw} add 5400 nat 123 all from any to ${briz_ip}
fi


$ cat /root/firewall2.sh

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

#!/bin/sh

# Ruleset based on article:
# http://noted.org.ua/100
# and handbook:
# http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/firewalls-ipfw.html

ipfw='/sbin/ipfw'
nat_rules_update_script='/root/scripts/update-nat-rules.sh'

lan_if="localif"
lan_net="aa.bb.cc.0/24"
lan_ip="aa.bb.cc.1"

briz_if="briz_vpn"
briz_ip=`ifconfig $briz_if | grep inet | awk '{print $2}'`
echo "briz_ip: "
echo ${briz_ip}

briz_local_if="brizif"
briz_local_ip=`ifconfig $briz_local_if | grep inet | awk '{print $2}'`
echo "briz_local_ip: "
echo ${briz_local_ip}

briz_local_resources="192.168.1.0/24,172.17.0.0/16,172.18.0.0/16,172.18.169.0/24"

${ipfw} -q flush
${ipfw} -q pipe flush
${ipfw} -q queue flush

${ipfw} add check-state

# Allow access full access from this machine
${ipfw} add allow tcp from me to any setup keep-state
${ipfw} add allow udp from me to any keep-state

# Allow trafic on loopback interface
${ipfw} add allow ip from any to any via lo0

# Disable access to loopback inteface from outside
${ipfw} add deny ip from any to 127.0.0.0/8
${ipfw} add deny ip from 127.0.0.0/8 to any

# Disable local networks on WAN interface
${ipfw} add deny ip from any to 10.0.0.0/8 in via ${briz_if}
${ipfw} add deny ip from any to 172.16.0.0/12 in via ${briz_if}
${ipfw} add deny ip from any to 192.168.0.0/16 in via ${briz_if}
${ipfw} add deny ip from any to 0.0.0.0/8 in via ${briz_if}

# Disable autoconfigured network
${ipfw} add deny ip from any to 169.254.0.0/16 in via ${briz_if}

# Disable public multicast
${ipfw} add deny all from 224.0.0.0/3 to any in via ${briz_if}

# Disable public ICMP
#${ipfw} add deny icmp from any to any in via ${briz_if}

# Allow GRE
${ipfw} add allow gre from any to any via ${briz_local_if}

# IPTV
${ipfw} add allow igmp from any to any via ${briz_local_if}
${ipfw} add allow udp from any to any 1234,9875 via ${briz_local_if}

# Allow full access from local network
${ipfw} add allow all from any to any via ${lan_if}

##
## BEGIN: Allow access to local services
##

# FTP
${ipfw} add allow log tcp from any to me 20, 21, 65000-65535 setup keep-state

# HTTP
${ipfw} add allow log tcp from any to me 80 setup keep-state

# HTTPS
${ipfw} add allow log tcp from any to me 443 setup keep-state

# SSH
${ipfw} add allow log tcp from any to me 22 setup keep-state

##
## END: Local services
##

# NAT
${nat_rules_update_script}

# Allow ICMP
${ipfw} add 10100 allow icmp from me to any keep-state
${ipfw} add 10200 allow icmp from any to any icmptypes 0,8,11 keep-state

# Block all
${ipfw} add 10300 deny ip from any to any

drg
рядовой
Сообщения: 10
Зарегистрирован: 2007-08-07 14:40:06

Re: Freebsd 9 + mpd5 (pptpclient) + pf = route problem

Непрочитанное сообщение drg » 2012-05-27 20:03:53

спасибо, помогло.