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

freebsd 10 + mpd5 + l2tp beeline

Добавлено: 25 авг 2015, 17:56
flashdeath
Я решил проапгрейдить свою Freebsd 9.1 (которая обновлялась с версии 6,2) до Freebsd 10.2
Взял новый (старый - валяющийся без дела) жесткий диск, вставил его в стенд и залил туда Ось.
Какое - же было мое удивление, когда после установки всех нужных мне портов, пересборки мира и ядра mpd5 не заработал.
Причем не заработал он красиво, а именно соединение устанавливается, но трафик через ng0 не идет, потом идет дисконнект и на этом все останавливается
Бился с этим около трех дней пока не обратил внимание на странный роут в таблице маршрутизации

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

85.21.0.171      link#7             UH          0        0    ng0
где 85.21.0.171 - пир провайдера
ng0 - виртуальный интерфейс

Тогда начал капать в эту сторону, после еще одного дня капания нашел мануал на лисяре
http://forum.lissyara.su/viewtopic.php?t=40166
в статье было написано следующее
Проблема заключается в этом изменении http://lists.freebsd.org/pipermail/svn- ... 45550.html
Из-за чего теперь невозможно удалить интерфейсный маршрут.
Проблема присутствует в 9.2, 10 и дальше будет.
Так как это "не баг, а фича", маловероятно что исправят, но надеемся на лучшее.
где был выложен следующий патч для роутинга на FreeBSD
ftp://ftp.toadmins.ru/images/os/freebsd ... .patch.tgz

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

--- sys/net/if.c
+++ sys/net/if.c
@@ -1358,7 +1358,7 @@
 
 		err = rtrequest_fib(RTM_DELETE, rt_key(rt), rt->rt_gateway,
 				rt_mask(rt),
-				rt->rt_flags|RTF_RNH_LOCKED|RTF_PINNED,
+				rt->rt_flags|RTF_RNH_LOCKED,
 				(struct rtentry **) NULL, rt->rt_fibnum);
 		if (err) {
 			log(LOG_WARNING, "if_rtdel: error %d\n", err);
--- sys/net/route.c
+++ sys/net/route.c
@@ -1104,13 +1104,6 @@
 			error = 0;
 		}
 #endif
-		if ((flags & RTF_PINNED) == 0) {
-			/* Check if target route can be deleted */
-			rt = (struct rtentry *)rnh->rnh_lookup(dst,
-			    netmask, rnh);
-			if ((rt != NULL) && (rt->rt_flags & RTF_PINNED))
-				senderr(EADDRINUSE);
-		}
 
 		/*
 		 * Remove the item from the tree and return it.
@@ -1539,7 +1532,7 @@
 		bzero((caddr_t)&info, sizeof(info));
 		info.rti_ifa = ifa;
 		info.rti_flags = flags |
-		    (ifa->ifa_flags & ~IFA_RTSELF) | RTF_PINNED;
+		    (ifa->ifa_flags & ~IFA_RTSELF);
 		info.rti_info[RTAX_DST] = dst;
 		/* 
 		 * doing this for compatibility reasons
@@ -1570,7 +1563,7 @@
 			if (error == 0) {
 				info.rti_ifa = ifa;
 				info.rti_flags = flags | RTF_RNH_LOCKED |
-				    (ifa->ifa_flags & ~IFA_RTSELF) | RTF_PINNED;
+				    (ifa->ifa_flags & ~IFA_RTSELF);
 				error = rtrequest1_fib(cmd, &info, &rt, fibnum);
 			}

дальше было просто

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

# tar xvzf route-fix.patch.tgz
# cd /usr/src
# patch < /PATH/TO/route-fix.patch
# make -j4 buildworld
# make -j4 buildkernel KERNCONF=YOU_KERN
# make installkernel KERNCONF=YOU_KERN
# make installworld
# reboot
Вот собственно фикс данной проблемы
на всякий случай привожу конфиги ядра mpd и скрипты

Ядро
+ к штатным настройкам

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

#PF
device          pf
device          pflog
device          pfsync

#ALTQ
options         ALTQ
options         ALTQ_CBQ        # Class Bases Queueing
options         ALTQ_RED        # Random Early Detection
options         ALTQ_RIO        # RED In/Out
options         ALTQ_HFSC       # Hierarchical Packet Scheduler
options         ALTQ_CDNR       # Traffic conditioner
options         ALTQ_PRIQ       # Priority Queueing
options         ALTQ_NOPCC      # Required for SMP build
options         ALTQ_DEBUG

options         HZ=1000

#IPSEC
options IPSEC
options IPSEC_FILTERTUNNEL
options IPSEC_NAT_T
device  enc
device  crypto

#NetGraph
options         NETGRAPH                #netgraph(4) system
options         NETGRAPH_ASYNC
options         NETGRAPH_BPF
options         NETGRAPH_BRIDGE
options         NETGRAPH_CISCO
options         NETGRAPH_DEFLATE
options         NETGRAPH_ECHO
options         NETGRAPH_ETHER
options         NETGRAPH_FRAME_RELAY
options         NETGRAPH_GIF
options         NETGRAPH_GIF_DEMUX
options         NETGRAPH_HOLE
options         NETGRAPH_IFACE
options         NETGRAPH_IP_INPUT
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_PPPOE
options         NETGRAPH_PPTPGRE
options         NETGRAPH_RFC1490
options         NETGRAPH_SOCKET
options         NETGRAPH_TCPMSS
options         NETGRAPH_TEE
options         NETGRAPH_TTY
options         NETGRAPH_UI
options         NETGRAPH_VJC

options         MROUTING
mpd.conf

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

startup:
    set user webusername webuserpass admin
    set web self int.ip.add.res 5006
    set web open


default:
    load vpn-l2tp

vpn-l2tp:
    create bundle static B1
    set bundle enable ipcp
    set iface enable tcpmssfix
    set iface idle 0
    set iface up-script /usr/local/etc/mpd5/up.sh
    set iface down-script /usr/local/etc/mpd5/down.sh
    set ipcp no vjcomp
    create link static L1 l2tp
    set link action bundle B1
    set auth authname <YOURLOGIN>
    set auth password <YOURPASSWORD>
    set link max-redial 0
    set link redial-delay 60
    set link mtu 1460
    set link mru 1460
    set link keep-alive 10 240
    set link accept chap-md5
    set link accept chap
    set link no pap
    set l2tp peer tp.internet.beeline.ru
#    set l2tp peer 85.21.0.171 - это ip впн в моем регионе, у вас может быть другой
    open
up.sh

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

#!/bin/sh
gw=`netstat -rn | grep default | awk '{print $2}'`
/sbin/route delete $8
/sbin/route add $8 $gw
echo "/sbin/route add $8 $gw" > /root/mpd.up
/sbin/route delete default
/sbin/route add default -iface $1
echo $4 > /tmp/mpd_dr
echo $gw > /tmp/mpd_gw
down.sh

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

#!/bin/sh
dr=`cat /tmp/mpd_dr`
gw=`cat /tmp/mpd_gw`
route delete $dr
route delete default
route add default $gw
rm -f /tmp/mpd_dr
rm -f /tmp/mpd_gw
и наконец фаервол
pf.conf

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

# $FreeBSD: stable/10/tools/tools/tinybsd/conf/firewall/etc/pf.conf 162485 2006-09-20 22:24:20Z julian $
ext_if="em0"    # replace with actual external interface name i.e., dc0
int_if="em1"    # replace with actual internal interface name i.e., dc1
vpn_if="ng0"
int_net="10.10.10.0/24"
ext_addr="192.168.1.10/32"
table <mynets> const {192.168.1.0/24, 85.21.0.0/24, 78.107.1.0/24,  213.234.192.0/24, 85.21.78.0/24,  85.21.72.0/24}
set loginterface pflog0
set optimization normal
set block-policy drop
set skip on lo0
scrub in all
nat on $ext_if from $int_net to <mynets> -> ($ext_if:0)
nat on $vpn_if from $int_net to !<mynets> -> ($vpn_if:0)
block in log all
pass out log all
pass in on $ext_if proto tcp from any to $ext_if port 22 keep state
pass in on $int_if from $int_net to any
Это как сами понимаете минимальная настройка, дальше дело вашей фантазии

Огромный респект Лиссяре и в частности автору комента MrStalker который написал патч

Re: freebsd 10 + mpd5 + l2tp beeline

Добавлено: 23 дек 2016, 17:48
flashdeath
Ура во freebsd 11 STABLE это пофиксили.