The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Раздел полезных советов: Автоподъем pptp linux-клиента на Fedora Core Linux, auto_tips, 05-Апр-05, 11:11  [смотреть все]
  • Автоподъем pptp linux-клиента на Fedora Core Linux, flc, 11:11 , 05-Апр-05 (1)
  • Автоподъем pptp linux-клиента на Fedora Core Linux, agon, 16:17 , 21-Апр-05 (4)
  • Автоподъем pptp linux-клиента на Fedora Core Linux, chirik, 01:47 , 25-Апр-05 (5)
  • Автоподъем pptp linux-клиента на Fedora Core Linux, Аноним, 22:50 , 26-Апр-05 (6)
  • Автоподъем pptp linux-клиента на Fedora Core Linux, la, 00:24 , 14-Июн-05 (7)
  • Автоподъем pptp linux-клиента на Fedora Core Linux, Vaso Petrovich, 18:52 , 20-Авг-07 (11)
  • Автоподъем pptp linux-клиента на Fedora Core Linux, ntimmy, 14:45 , 11-Окт-07 (12)
    Цель данной статьи кратко описать процесс настройки простого рутера для подключения в сети через PPTP VPN на основе ОС Linux Slackware в первую очередь для работы в сетях ufanet.
    Локальная сеть 192.168.1.0/24, ip шлюза 192.168.1.254 он же DNS и прокся
    Внешний ip получаем по dhcp.
    В данном случае eth0 смотрит в мир, eth1 смотрит в локальную сеть.
    Будем настраивать два конфига один для работы по земле другой через спутник.
    Первое что понадобиться это пакеты не младше,
    pppd 2.4.4
    pptp version 1.7.0
    Для начала напишем правила для iptables
    /etc/rc.d/rc.firewall
    #!/bin/bash
    #
    EXT_IF="eth0"
    LAN_IF="eth1"
    LOCAL_NET="192.168.1.0/24"
    IPT=`which iptables`
    EXT_IP=`ifconfig $EXT_IF |grep "inet\ addr:"|awk '{print $2}'|sed -e s/addr://`
    LAN_IP=`ifconfig $LAN_IF |grep "inet\ addr:"|awk '{print $2}'|sed -e s/addr://`
    #
    $IPT -t nat -F
    $IPT -X
    $IPT -F
    $IPT -P INPUT DROP
    $IPT -P FORWARD DROP
    $IPT -P OUTPUT ACCEPT
    #localhost rules
    $IPT -A INPUT -p ALL -i lo -s 127.0.0.1 -j ACCEPT
    $IPT -A INPUT -p ALL -i lo -s $EXT_IP -j ACCEPT
    $IPT -A INPUT -p ALL -i lo -s $LAN_IP -j ACCEPT
    #external net rules
    # ICMP rules
    $IPT -A INPUT -p ICMP -i $EXT_IF --icmp-type echo-request -j ACCEPT
    $IPT -A INPUT -p ICMP -i $EXT_IF --icmp-type echo-reply -j ACCEPT
    #$IPT -A INPUT -p ICMP -i $EXT_IF -j ACCEPT
    #
    $IPT -A INPUT -p ALL -i $EXT_IF -s $LOCAL_NET -j DROP
    $IPT -A INPUT -p ALL -d $EXT_IP -m state --state ESTABLISHED,RELATED -j ACCEPT
    $IPT -A INPUT -p TCP -i $EXT_IF --dport 20:21 -j ACCEPT
    $IPT -A INPUT -p TCP -i $EXT_IF --dport 80 -j ACCEPT
    $IPT -A INPUT -p TCP -i $EXT_IF --dport 1024:65535 -j ACCEPT
    #end external if
    #
    #internal net rules
    #ICMP
    $IPT -A INPUT -p ICMP -i $LAN_IF -j ACCEPT
    #
    $IPT -A INPUT -p ALL -d $LAN_IP -m state --state ESTABLISHED,RELATED -j ACCEPT
    $IPT -A INPUT -p TCP -i $LAN_IF --dport 20:22 -j ACCEPT
    $IPT -A INPUT -p TCP -i $LAN_IF --dport 80 -j ACCEPT
    #DNS
    $IPT -A INPUT -p TCP -i $LAN_IF --dport 53 -j ACCEPT
    $IPT -A INPUT -p UDP -i $LAN_IF --dport 53 -j ACCEPT
    #SMB
    $IPT -A INPUT -p TCP -i $LAN_IF --dport 135:139 -j ACCEPT
    $IPT -A INPUT -p UDP -i $LAN_IF --dport 135:139 -j ACCEPT
    $IPT -A INPUT -p TCP -i $LAN_IF --dport 445 -j ACCEPT
    $IPT -A INPUT -p UDP -i $LAN_IF --dport 445 -j ACCEPT
    #nttp
    $IPT -A INPUT -p TCP -i $LAN_IF --dport 123 -j ACCEPT
    $IPT -A INPUT -p UDP -i $LAN_IF --dport 123 -j ACCEPT
    #SWAT
    $IPT -A INPUT -p TCP -i $LAN_IF --dport 901 -j ACCEPT
    #SMTP/POP3
    $IPT -A INPUT -p TCP -i $LAN_IF --dport 25 -j ACCEPT
    $IPT -A INPUT -p TCP -i $LAN_IF --dport 110 -j ACCEPT
    #
    $IPT -A INPUT -p TCP -i $LAN_IF --dport 3306 -j ACCEPT
    $IPT -A INPUT -p TCP -i $LAN_IF --dport 1024:65535 -j ACCEPT
    $IPT -A INPUT -p UDP -i $LAN_IF --dport 1024:65535 -j ACCEPT
    #
    # Forward Rules
    $IPT -A FORWARD -p TCP -s 0/0 --dport 1433:1434 -j DROP
    $IPT -A FORWARD -p TCP -s 0/0 --dport 135:139 -j DROP
    $IPT -A FORWARD -p UDP -s 0/0 --dport 135:139 -j DROP
    $IPT -A FORWARD -p TCP -s 0/0 --dport 445 -j DROP
    $IPT -A FORWARD -p UDP -s 0/0 --dport 445 -j DROP
    $IPT -A FORWARD -p ALL -s 0/0 -j ACCEPT
    #NAT
    $IPT -t nat -A POSTROUTING -o $EXT_IF -j SNAT --to-source $EXT_IP
    #end firewall rules
    #
    Делаем этот файл исполнимым.
    #chmod 755 /etc/rc.d/rc.firewall
    Далее установим пакеты pppd-2.4.4 и pptp-1.7.0.
    #installpkg pppd-2.4.4.tgz pptp-1.7.0.tgz
    Напишем два конфига причем нам нужно чтобы канал по земле был обязательно ppp1, а канал через спутник ppp2.
    И так
    #cd /etc/ppp
    Пишем файлик options.pptp
    lock
    nomultilink
    noauth
    debug
    bsdcomp 15
    noipdefault
    unit 1
    Прошу обратить внимание на последнюю строчку в ней мы определяем каким будет вновь создаваемый интерфейс.
    Аналогично пишем и второй options.pptp.sat
    lock
    usepeerdns
    nomultilink
    noauth
    debug
    bsdcomp 15
    noipdefault
    unit 2
    name login@sat
    Заполняем файл chap.secret так как используется авторизация CHAP

    # Secrets for authentication using CHAP
    # client server secret IP addresses
    "login" * "superpassword"
    "login@sat" * "superpassword"

    Теперь создадим если не создалась папку /etc/ppp/peers
    #mkdir peers
    #touch UFANET
    #touch UFANET_SAT
    Запишем в них следующие строчки:
    файл /etc/ppp/peers/UFANET
    #Start
    name login
    remotename PPTP
    file /etc/ppp/options.pptp
    #end
    файл /etc/ppp/peers/UFANET_SAT
    #Start
    name login@sat
    remotename PPTP
    file /etc/ppp/options.pptp.sat
    #end
    Теперь напишем скрипты которые должны все это заставить работать.
    #cd /root
    #touch start_pptp
    #vi start_pptp

    #!/bin/bash
    #
    #
    # Put any local setup commands in here:
    #start pptp tunnel
    defgw="10.64.114.1"
    pptp=""
    startpptp()
    {
    pptp=`/sbin/ifconfig |grep ppp1|awk '{print $1}'`
    if [ "" = "$pptp" ]
    then
    echo "Start pptp link"
    /usr/sbin/pptp 10.8.0.1 call UFANET
    #start squid
    sleep 5
    tun=`ifconfig |grep ppp1`
    if [ "" != "$tun" ]
    then
    echo "PPTP tunnel is up "
    else
    echo "PPTP tunnel test is failed tru again "
    exit
    fi
    #create new route path
    INET_IP=`cat /etc/ppp/last_inet_ip`
    INET_IF=`cat /etc/ppp/last_inet_if`
    route=/sbin/route
    $route del default
    $route add -host 10.8.3.1 gw $defgw
    $route add -host 10.8.0.1 gw $defgw
    sleep 3
    $route add default ppp1
    #
    cd /root
    sleep 5
    # Здесь у нас канал поднялся для него прописываем правила файрвола
    #настроим NAT и для примера мапинг портов
    ipt="/usr/sbin/iptables"
    echo "Load firewall rules"
    $ipt -I INPUT 1 -p ALL -i lo -s $INET_IP -j ACCEPT
    $ipt -I INPUT 2 -p TCP -i $INET_IF --dport 80 -j DROP
    $ipt -I INPUT 3 -p TCP -i $INET_IF --dport 20:21 -j DROP
    $ipt -I INPUT 4 -p TCP -i $INET_IF --dport 22 -j DROP
    $ipt -I INPUT 5 -p ALL -d $INET_IP -m state --state ESTABLISHED,RELATED -j ACCEPT
    #mapping ports
    $ipt -I FORWARD -i ppp1 -s 81.30.176.0/20 -o eth1 -p tcp --dport 27015 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
    $ipt -I FORWARD -i ppp1 -s 81.30.192.0/19 -o eth1 -p tcp --dport 27015 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
    $ipt -I FORWARD -i ppp1 -s 81.30.176.0/20 -o eth1 -p udp --dport 27015 -j ACCEPT
    $ipt -I FORWARD -i ppp1 -s 81.30.192.0/19 -o eth1 -p udp --dport 27015 -j ACCEPT
    $ipt -I FORWARD -i ppp1 -s 89.189.128.0/19 -o eth1 -p tcp --dport 27015 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
    $ipt -I FORWARD -i ppp1 -s 89.189.128.0/19 -o eth1 -p udp --dport 27015 -j ACCEPT
    $ipt -t nat -I PREROUTING 1 -p tcp -d $INET_IP --dport 27015 -j DNAT --to 192.168.1.10:27015
    #NAT
    $ipt -t nat -I POSTROUTING 2 -o $INET_IF -j SNAT --to-source $INET_IP
    killall squid
    killall squid
    /etc/rc.d/rc.squid start
    fi
    }

    stoppptp()
    {
    killall -HUP pppd
    sleep 5
    }

    case "$1" in
    'start')
    startpptp
    ;;
    'stop')
    stoppptp
    ;;
    *)
    startpptp
    esac
    exit 0
    И скрипт который корректно положит интерфейс

    #vi kill_pptp

    #!/bin/bash
    defgw="10.64.114.1"
    IF=`ifconfig |grep ppp2|awk '{print $1}'`
    if [ "" != "$IF" ]
    then
    INET_IP=`ifconfig ppp2|grep inet|awk '{print $2}'|sed -e s/addr://`
    fi
    PID=`ps -an|grep -e 'UFANET$'|awk '{print $1}'`
    #
    if [ "" != "$PID" ]
    then
    kill -HUP $PID
    sleep 5
    if [ "" != "$INET_IP" ]
    then
    route=/sbin/route
    $route del default
    $route add -host 10.8.0.1 gw $defgw
    sleep 3
    $route add default gw $INET_IP
    else
    route=/sbin/route
    $route del default
    $route add -host 10.8.0.1 gw $defgw
    sleep 3
    $route add default gw $defgw
    fi

    fi
    /etc/rc.d/rc.firewall
    #end

    Напишем такой же файлик для спутникового канала

    #vi start_pptp_sat

    #!/bin/bash
    #
    # /etc/rc.d/rc.local: Local system initialization script.
    #
    # Put any local setup commands in here:
    #Переменная $defgw указывает на шлюз для внешнего интерфейса.
    #Его можно выдернуть из вывода команды
    #ip route |grep default|awk '{print $3}'
    #start pptp tunnel
    defgw="10.64.114.1"
    pptp=`/sbin/ifconfig |grep ppp`
    startpptp()
    {
    echo "Start pptp link"
    /usr/sbin/pptp 10.8.0.1 call UFANET_SAT
    sleep 10
    #create new route path
    INET_IP=`cat /etc/ppp/last_inet_ip`
    INET_IF=`cat /etc/ppp/last_inet_if`
    route=/sbin/route
    $route del default
    $route add -host 10.8.0.1 gw $defgw
    sleep 3
    $route add default ppp2
    PPTP=`ifconfig ppp1|grep inet|awk '{print $2}'|sed -e s/addr://`
    if [ "" != $PPTP ]
    then
    #Здесь три строчки для маршрута на сетки уфанета. Зачем нужно ходить
    # через узкий канал на дешевые локальные ресурсы.
    $route add -net 81.30.176.0 netmask 255.255.240.0 dev ppp1
    $route add -net 81.30.192.0 netmask 255.255.224.0 dev ppp1
    $route add -net 89.189.128.0 netmask 255.255.240.0 dev ppp1
    fi
    #
    cd /root
    echo "PPTP tunnel is up "
    sleep 5
    /bin/killall squid
    sleep 1
    /usr/sbin/squid -sD -f /etc/squid/squid.conf &
    ipt="/usr/sbin/iptables"
    echo "Load firewall rules"
    $ipt -I INPUT 6 -p ALL -i lo -s $INET_IP -j ACCEPT
    $ipt -I INPUT 7 -p TCP -i $INET_IF --dport 80 -j DROP
    $ipt -I INPUT 8 -p TCP -i $INET_IF --dport 20:21 -j DROP
    $ipt -I INPUT 9 -p TCP -i $INET_IF --dport 22 -j DROP
    $ipt -I INPUT 10 -p ALL -d $INET_IP -m state --state ESTABLISHED,RELATED -j ACCEPT
    $ipt -t nat -I POSTROUTING 3 -o $INET_IF -j SNAT --to-source $INET_IP
    }

    stoppptp()
    {
    killall -HUP pppd
    sleep 5
    }

    case "$1" in
    'start')
    startpptp
    ;;
    'stop')
    stoppptp
    ;;
    *)
    startpptp
    esac
    exit 0
    Также напишем убивалку для этого интерфейса.

    #vi kill_pptp_sat

    #!/bin/bash
    defgw="10.64.114.1"
    INET_IP=""
    IF=`ifconfig|grep ppp1|awk '{print $1}'`
    if [ "" != "$IF" ]
    then
    INET_IP=`ifconfig ppp1|grep inet|awk '{print $2}'|sed -e s/addr://`
    fi
    PID=`ps -an|grep -e 'UFANET_SAT$'|awk '{print $1}'`
    if [ "" != "$PID" ]
    then
    kill -HUP $PID
    sleep 5
    if [ "" != "$INET_IP" ]
    then
    route=/sbin/route
    $route del default
    $route del default
    $route add -host 10.8.0.1 gw $defgw
    sleep 3
    $route add default gw $INET_IP
    $route del -net 81.30.176.0 netmask 255.255.240.0
    $route del -net 81.30.192.0 netmask 255.255.224.0
    $route del -net 89.189.128.0 netmask 255.255.240.0
    else
    route=/sbin/route
    $route del default
    $route del default
    $route add -host 10.8.0.1 gw $defgw
    sleep 3
    $route add default gw $defgw
    fi
    fi

    Вот практически и все осталось написать скрипт который автоматом бы поднял канал после включения рутера примерно через 3 минуты и автоматически поднимал бы его в случае падения.
    Для этого добавим строчку в crontab.
    */3 * * * * /root/ufanet_test.pl
    Этот скрипт стартует каждые 3 минуты и проверяет жив ли канал контроллируется только наземный канал. А вот собственно скрипт ufanet_test.pl его я написал на перле. Вообщем без особых проблем он пишется и на shell, но мне так захотелось.

    #!/usr/bin/perl
    $ppp1=`ifconfig|grep ppp1`;
    if ($ppp1 ne "")
    {
    $ping=`ping -c 3 81.30.199.5|grep loss`;
    @result=split /,\s+/, $ping;
    $i=0;
    foreach $err (@result)
    {
    if ($err =~ /.+(loss)$/)
    {
    $i=$i-2;
    ($proc,$undef,$undef)=split /\s+/,$result[$i];
    if ($proc eq '100%')
    {
    $res=`kill_pptp`;
    $res=`start_pptp`;
    exit;
    }
    }
    $i=$i++;
    }
    }
    else
    {
    $res=`kill_pptp`;
    $res=`start_pptp`;
    }
    Ну вот и все. Осталось настроить named и squid. А это тема совсем другой статьи.
    С вопросами ко мне в мыльницу ntimmy@mail.ru или в icq 18167449 если будет время отвечу на все ващи вопросы.
    Источник
    man pppd; man pptp; man iptables
    Источник
    man pppd; man pptp; man iptables
    Вот довольно сырая заготовка статьи писалась для локалки Уфанет.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру