Помогите сдружить pptpd и iptables

Обсуждение технических вопросов по продуктам Novell под Linux, а также *nix систем

Помогите сдружить pptpd и iptables

Сообщение Смирнов Дмитрий » 12 апр 2007, 18:15

Выручайте, не могу разрулить! :shock:
Есть сервак openSUSE 10.2, реальный IP - 10.0.0.1 и локальная сеть 192.168.0.0/24. У сервера соответственно eth0 10.0.0.1 и eth1 192.168.0.1
Задача из INet'а заходить в локалку.

Мои конфиги

/etc/pptpd.conf
...
localip 192.168.0.1
remoteip 192.168.1.10-20
listen 10.0.0.1
...

/etc/ppp/options.pptp

name pptpd
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
require-mppe-128
proxyarp
lock
nobsdcomp
novj
novjccomp
nologfd

Вообщем с шифрованием все в порядке, клиенты цепляются но ничего не пинают.
В iptables пишу:


iptables -F
iptables -X

echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -A INPUT --protocol 47 --jump ACCEPT
iptables -A INPUT --protocol tcp --match tcp --destination-port 1723 --jump ACCEPT

iptables -A FORWARD --source 192.168.1.0/24 --destination 192.168.0.0/24 -j ACCEPT
iptables -A FORWARD --source 192.168.0.0/24 --destination 192.168.1.0/24 -j ACCEPT

Вроде работат.
Как только клиенты отключаются, потом снова коннектятся то уже не работает, приходится перезапускать правила и снова начинает работать :?:

Где копать :?:
Аватара пользователя
Смирнов Дмитрий
 
Сообщения: 124
Зарегистрирован: 31 мар 2005, 16:05
Откуда: АРК, Симферополь

Сообщение Александр Читалкин » 13 апр 2007, 15:59

Не знаю, насколько правильно это решение, но можно попробовать...

"localip 192.168.0.1" изменить на "localip 192.168.1.1"

В options.pptp добавить:
Код: Выделить всё
ipparam myvpn


Создать файл /etc/ppp/vpnclient-up с содержимым:
Код: Выделить всё
#!/bin/bash
if [ "$PPP_IPPARAM" == "myvpn" ]; then
iptables -A FORWARD -i $PPP_IFACE --destination 192.168.0.0/24 -j ACCEPT
iptables -A FORWARD --source 192.168.0.0/24 -o $PPP_IFACE -j ACCEPT
fi


Создать файл /etc/ppp/vpnclient-down с содержимым:
Код: Выделить всё
#!/bin/bash
if [ "$PPP_IPPARAM" == "myvpn" ]; then
iptables -D FORWARD -i $PPP_IFACE --destination 192.168.0.0/24 -j ACCEPT
iptables -D FORWARD --source 192.168.0.0/24 -o $PPP_IFACE -j ACCEPT
fi


В /etc/ppp/ip-up в конец добавить:
Код: Выделить всё
exec /etc/ppp/vpnclient-up "$@"


В /etc/ppp/ip-down в конец добавить:
Код: Выделить всё
exec /etc/ppp/vpnclient-down "$@"


Вручную правила FORWARD не добавлять. Файлам vpnclient-down и vpnclient-up дать права на выполнение. Проверить, что после подключения клиента для него добавились правила, а при отключении - удалились.
Аватара пользователя
Александр Читалкин
 
Сообщения: 112
Зарегистрирован: 13 ноя 2002, 23:29
Откуда: Москва

Сообщение Смирнов Дмитрий » 14 апр 2007, 14:15

Александр, спасибо, направил в нужное русло!
Идея понятна, но чего-то при подключении клиентов скрипт не выполняется.

делаю ls -l в каталоге /etc/ppp

lrwxrwxrwx 1 root root 5 Mar 29 15:13 ip-down -> ip-up
-rwxr-xr-x 1 root root 6181 Sep 9 2005 ip-up

Вот что написано в моем ip-up
Код: Выделить всё
#!/bin/bash

# Do not edit this file, use ip-up.local instead.

# (C) 1997-2004 SuSE Linux AG, Nuernberg, Germany
# Klaus Franken 25.02.1998
# Remo Behn 18.07.1998
# Arvin Schnell 28.02.2002
# Ludwig Nussel 26.02.2004
# Send suggestions and comments to http://www.suse.de/feedback/

BASENAME=${0##*/}
INTERFACE=$1
DEVICE=$2
SPEED=$3
LOCALIP=$4
REMOTEIP=$5
IPPARAM=$6

# send all output to syslog
exec > >(logger -p security.notice -t "$BASENAME") 2>&1

if [ -z "$REMOTEIP" ]; then
    echo "Usage: $0 <INTERFACE> <DEVICE> <SPEED> <LOCALIP> <REMOTEIP>"
    exit 1
fi

TERM=raw
export TERM

# smpppd-1.14 passes two single quoted paramters in $IPPARAM. The first one is
# the ifcfg filename, the second the provider.
parse_ipparam()
{
   case "$IPPARAM" in
      \'ifcfg-*) ;;
      *) return ;;
   esac
   eval set -- $IPPARAM
   [ "$#" -ne 2 ] && return
   
   ifcfg=${1##ifcfg-}
   provider=$2

   export ifcfg provider
}

# Automatic configuration of your resolv.conf for peer supplied DNS addresses
# when using the 'usepeerdns' option ('ms-get-dns' for ipppd). Original
# resolv.conf is restored when ip-down is called by pppd when the link goes
# down.
add_nameservers()
{
   [ -z "$USEPEERDNS" ] && return

   if [ -z "$isdn" ]; then
      [ ! -f /etc/ppp/resolv.conf ] && return
      /sbin/modify_resolvconf modify -s pppd -p pppd -e "$INTERFACE" \
          -f /etc/ppp/ip-up -n "$DNS1 $DNS2" -t - <<-EOT
          If you do not want the pppd to change your nameserver settings
          set MODIFYDNS=no in the config file for this provider in
          /etc/sysconfig/network/providers/ and ensure that the option
          usepeerdns is not set in /etc/ppp/options.
      EOT
   else
      [ -z "$MS_DNS1" ] && return
      /sbin/modify_resolvconf modify -s ipppd -p ipppd -e "$INTERFACE" \
          -f /etc/ppp/ip-up -n "$MS_DNS1 $MS_DNS2" -t - <<-EOT
          If you do not like the ipppd to change your nameserver
          settings remove the option MODIFYDNS for this provider
      EOT
   fi

}

# restore the original resolv.conf saved when ip-up was called by the
# pppd which uses the `usepeerdns' option and resolv.conf was modified
# for the supplied dns server adresses.
restore_nameservers()
{
   [ -z "$USEPEERDNS" ] && return

   if [ -z "$isdn" ]; then
      [ ! -f /etc/ppp/resolv.conf ] && return
      /sbin/modify_resolvconf restore -s pppd -e "$INTERFACE"
   else
      [ -z "$MS_DNS1" ] && return
      /sbin/modify_resolvconf restore -s ipppd -e "$INTERFACE"
   fi
}

# using this function currently breaks Dial On Demand setups, because
# ifdown finally removes the device so the function calls are disabled
# now (bug #39048)
# run ifdown script to execute additional scripts
run_ifdown()
{
   [ -z "$ifcfg" -o -z "$INTERFACE" ] && return
    /sbin/ifdown $ifcfg $INTERFACE -o dhcp 2>&1 | logger -t ifdown
}

# run ifup script to execute additional scripts
run_ifup()
{
   [ -z "$ifcfg" -o -z "$INTERFACE" ] && return
    /sbin/ifup $ifcfg $INTERFACE -o dhcp 2>&1 | logger -t ifup
}

# start SuSEfirewall2 if configured
# TODO: let ifup/ifdown handle this
start_firewall()
{
   test "$FIREWALL" = "no" && return

   if /sbin/chkconfig --check SuSEfirewall2_setup; then
      /sbin/SuSEfirewall2 start
   fi
}

# /etc/ppp/poll.tcpip as shipped is able to set the system clock using
# ntpdate (see the NTPD_INITIAL_NTPDATE setting in
# /etc/sysconfig/ntp). It supports fetchmail with a system-wide
# /etc/fetchmailrc and can use UUCP to fetch mail over TCP/IP, provided
# that UUCP is configured properly. Last not least it also calls
# sendmail to send any queued mail
run_poll_tcpip()
{
   [ "$RUN_POLL_TCPIP" = "no" ] && return

   /etc/ppp/poll.tcpip | logger -p security.notice -t poll.tcpip > /dev/null &
}

isdn_restartinterface()
{
   [ -z "$isdn" ] && return;

   LINK_OPT=""
   test "$DYNAMICIP" = "yes" && LINK_OPT="$LINK_OPT dynamic on"
   /sbin/ip address flush dev $INTERFACE
   /sbin/ip link set $INTERFACE down
   /sbin/ip link set $INTERFACE up $LINK_OPT
   /sbin/ip address add dev $INTERFACE local $IPADDR peer $PTPADDR

   # set routes from /etc/sysconfig/network/routes (only for dod)
   if [ "$DIALMODE" = "auto" ] ; then
       /etc/sysconfig/network/scripts/ifup-route $INTERFACE
   fi
}


parse_ipparam


isdn="" # non-zero if called by ipppd
case "$INTERFACE" in
    ippp*)
   [ -z "$ifcfg" ] && ifcfg="$INTERFACE"
   isdn=yes
   ;;
    *)
   ;;
esac

#########
# TODO: let ifup/ifdown handle this

# config file common to all interfaces, needed for global firewall setting
. /etc/sysconfig/network/config

# interface specific config file if any
if [ -n "$ifcfg" -a -r /etc/sysconfig/network/ifcfg-"$ifcfg" ]; then
    . /etc/sysconfig/network/ifcfg-"$ifcfg"
fi

#########

case "$BASENAME" in
    ip-up)
   add_nameservers
   
   # ip_resend hook
   test "$IP_RESEND" = "yes" -a -x /usr/sbin/ip_resend_wakeup && \
       /usr/sbin/ip_resend_wakeup -m $LOCALIP -o $INTERFACE

   start_firewall

   run_poll_tcpip

   # call ip-up.local if it exists and is executable:
   if test -x /etc/ppp/ip-up.local ; then
       /etc/ppp/ip-up.local "$@" | logger -p security.notice -t ip-up.local > /dev/null &
   fi

   # run additional scripts if they exist
   if [ -d /etc/ppp/ip-up.d ]; then
      for SCRIPT in /etc/ppp/ip-up.d/*; do
         [ -d $SCRIPT -o ! -x $SCRIPT ] && continue;
         # ignore backup files and leftovers from rpm
         case $SCRIPT in
             *.rpmsave|*.rpmnew|*rpmorig|*~) continue ;;
         esac
         $SCRIPT "$@" | logger -p security.notice -t $SCRIPT > /dev/null &
      done
   fi

   #run_ifup

   ;;
    ip-down)

   restore_nameservers

   isdn_restartinterface
   
   start_firewall

   # call ip-down.local if it exists and is executable:
   if test -x /etc/ppp/ip-down.local ; then
       /etc/ppp/ip-down.local "$@" | logger -p security.notice -t ip-down.local > /dev/null &
   fi

   # ip_resend hook
   test "$IP_RESEND" = "yes" -a -x /usr/sbin/ip_resend && \
       /usr/sbin/ip_resend -o $INTERFACE $IP_RESEND_PARAMETER

   # run additional scripts if they exist
   if [ -d /etc/ppp/ip-down.d ]; then
      for SCRIPT in /etc/ppp/ip-down.d/*; do
         [ -d $SCRIPT -o ! -x $SCRIPT ] && continue;
         # ignore backup files and leftovers from rpm
         case $SCRIPT in
             *.rpmsave|*.rpmnew|*rpmorig|*~) continue ;;
         esac
         $SCRIPT "$@" | logger -p security.notice -t $SCRIPT > /dev/null &
      done
   fi

   #run_ifdown

   ;;
    *)
   ;;
esac

я создал файлы ip-up.loca и ip-down.local и сделал им соответственно
chmod +x ip-up.local и chmod +x ip-down.local

В options.pptp добавил ipparam myvpn

Вписал в файл ip-up.loca
Код: Выделить всё
#!/bin/bash
if [ "$PPP_IPPARAM" == "myvpn" ]; then
iptables -A FORWARD -i $PPP_IFACE --destination 192.168.0.0/24 -j ACCEPT
iptables -A FORWARD --source 192.168.0.0/24 -o $PPP_IFACE -j ACCEPT
fi

Гляжу в файл ip-up там какие-то другие переменные ($PPP_IPPARAM -> $IPPARAM) используются, они берутся от-туда?
Че они вообще значут?
Аватара пользователя
Смирнов Дмитрий
 
Сообщения: 124
Зарегистрирован: 31 мар 2005, 16:05
Откуда: АРК, Симферополь

Сообщение Смирнов Дмитрий » 18 апр 2007, 11:22

Спасибо Александру Читалкину :!:

Проблема решена.

Действительно, при подключении VPN клиентов выполняется скрипт /etc/ppp/ip-up, который проверяет есть ли пользовательский файл /etc/ppp/ip-up.local, и исполняем ли он. А если он есть и является исполняемым то этому скрипту передаются параметры подключенного клиента

В моем ip-up.local (openSUSE 10.2) так:

Код: Выделить всё
# call ip-up.local if it exists and is executable:
   if test -x /etc/ppp/ip-up.local ; then
       /etc/ppp/ip-up.local "$@" | logger -p security.notice -t ip-up.local > /dev/null &
   fi


Сия штука "$@" означает что скрипту передаются все параметры сразу (BASENAME, INTERFACE, DEVICE, SPEED, LOCALIP, REMOTEIP, IPPARAM)

т.е. чтобы подключенные клиенты могли попадать в локалку, в ip-up.local нужно прописать следующее:

Код: Выделить всё
#!/bin/bash
ipt="/usr/sbin/iptables"
$ipt -I FORWARD -i "$1" --destination 192.168.0.0/24 -j ACCEPT
$ipt -I FORWARD --source 192.168.0.0/24 -o "$1" -j ACCEPT


При каждом подключении переменная "$1" (INTERFACE) будет иметь свою величину: ppp0, ppp1, ppp2, ....

Нужен еще и ip-down.local, который будет убирать из файервола правила после отключения клиентов.

Код: Выделить всё
#!/bin/bash
ipt="/usr/sbin/iptables"
$ipt -D FORWARD -i "$1" --destination 192.168.0.0/24 -j ACCEPT
$ipt -D FORWARD --source 192.168.0.0/24 -o "$1" -j ACCEPT


Для того чтобы работало proxyarp, нужно клиентов помещать в ту же сеть, т.е. localip 192.168.0.1 а remoteip 192.168.0.10-20

Всем удачи, еще раз отдельное спасибо Александру Читалкину :D
Аватара пользователя
Смирнов Дмитрий
 
Сообщения: 124
Зарегистрирован: 31 мар 2005, 16:05
Откуда: АРК, Симферополь

Сообщение Александр Читалкин » 24 апр 2007, 16:53

Незачто, Дмитрий :) В своем посте я набросал команды с точки зрения Debian, в нем переменные $PPP... экспортируются, поэтому доступны и из дочерних скриптов. Скрипт ip-up SuSe их не экспортирует, поэтому приходится передавать их вызываемому скрипту напрямую, через $@. Можно также и в сусешный скрипт вставить экспорт, но то, о чем мы говорили в аське, и то что вы в последствии сделали, на мой взгляд более аккуратно.
Аватара пользователя
Александр Читалкин
 
Сообщения: 112
Зарегистрирован: 13 ноя 2002, 23:29
Откуда: Москва

Сообщение Смирнов Дмитрий » 18 июн 2007, 17:59

Интересный момент:

Когда подключается первый клиент, срабатывает скрипт ip-up.local проверяю /sbin/SuSEfirewall status, на экране что-то типа
Код: Выделить всё
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination
    0     0 TCPMSS       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0 
    0     0 forward_int  0    --  eth1   *       0.0.0.0/0            0.0.0.0/0
    0     0 forward_ext  0    --  eth0   *       0.0.0.0/0            0.0.0.0/0
    0     0 DROP         0    --  *      *       0.0.0.0/0            0.0.0.0/0
    0     0 ACCEPT       0    --  ppp0   *       0.0.0.0/0            192.168.0.0/24
    0     0 ACCEPT       0    --  *      ppp0    192.168.0.0/24       0.0.0.0/0


когда подключается второй клиент, первый теряет связь, смотрю снова, а там:

Код: Выделить всё
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination
    0     0 TCPMSS       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0 
    0     0 forward_int  0    --  eth1   *       0.0.0.0/0            0.0.0.0/0
    0     0 forward_ext  0    --  eth0   *       0.0.0.0/0            0.0.0.0/0
    0     0 DROP         0    --  *      *       0.0.0.0/0            0.0.0.0/0
    0     0 ACCEPT       0    --  ppp1   *       0.0.0.0/0            192.168.0.0/24
    0     0 ACCEPT       0    --  *      ppp1    192.168.0.0/24       0.0.0.0/0


т.е. кто последний подключился, то вытесняет всех :shock: , что с сием творить?

Причем в системном логе пишется, что на каждое соединение ррр отрабатывает ip-up.local

Подскажите где копать?
Аватара пользователя
Смирнов Дмитрий
 
Сообщения: 124
Зарегистрирован: 31 мар 2005, 16:05
Откуда: АРК, Симферополь

Сообщение Александр Читалкин » 21 июн 2007, 00:54

Странно, что при ip-up запускается start_firewall. У меня подозрение, что этот самый скриптик просто сбрасывает правила и заново их строит. Если так, то при каждом новом подключении мы получаем стандартную таблицу (все что там было до этого, сносится), плюс правило, добавленное в ip-up.local.
Аватара пользователя
Александр Читалкин
 
Сообщения: 112
Зарегистрирован: 13 ноя 2002, 23:29
Откуда: Москва

Сообщение Смирнов Дмитрий » 21 июн 2007, 10:33

Александр Читалкин писал(а):Странно, что при ip-up запускается start_firewall. У меня подозрение, что этот самый скриптик просто сбрасывает правила и заново их строит. Если так, то при каждом новом подключении мы получаем стандартную таблицу (все что там было до этого, сносится), плюс правило, добавленное в ip-up.local.


Александр, СПАСИБО!!!
Проблема действительно в этом, я просто закоментировал строки касающиеся start_firewall, и все зашуршало.
:D :D :D
Аватара пользователя
Смирнов Дмитрий
 
Сообщения: 124
Зарегистрирован: 31 мар 2005, 16:05
Откуда: АРК, Симферополь

Сообщение Смирнов Дмитрий » 13 июл 2007, 18:17

Странно, после того как закоментировал функцию start_firewall(), вновь подключающиеся клиенты не перезапускают файерволл, а вот отключающиеся почему-то перезапускают, и соответственно такаяже картина :(
затираются все предыдущие правила
Аватара пользователя
Смирнов Дмитрий
 
Сообщения: 124
Зарегистрирован: 31 мар 2005, 16:05
Откуда: АРК, Симферополь


Вернуться в *nix

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17