The OpenNET Project / Index page

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



Индекс форумов
Составление сообщения

Исходное сообщение
"Автоподъем pptp linux-клиента на Fedora Core Linux"
Отправлено ntimmy, 11-Окт-07 14:45 
Цель данной статьи кратко описать процесс настройки простого рутера для подключения в сети через 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
Вот довольно сырая заготовка статьи писалась для локалки Уфанет.

 

Ваше сообщение
Имя*:
EMail:
Для отправки ответов на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
  Введите код, изображенный на картинке: КОД
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



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

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