Коннект в vpn

Автор letnab, 04 сентября 2014, 13:21:55

« назад - далее »

0 Пользователи и 2 гостей просматривают эту тему.

letnab

Доброго времени суток. Меня интересует такой вопрос.
Имеется десяток vpn. подключение происходит через network manager, а есть ли возможность подключиться через терминал? или через скрипт какой нибудь?

gardarea51

Вы выступаете в роли клиента vpn? Тип подключения pptp?
Вообще конечно можно.

letnab

Цитата: gardarea51 от 04 сентября 2014, 16:39:09
Вы выступаете в роли клиента vpn? Тип подключения pptp?
Вообще конечно можно.
да. всё верно. я в роли клиента. тип pptp. не подскажите как? пробовал через pon $TUNNEL но что то не работает. хотя показывает что всё удачно!

gardarea51

Подскажу, только чуть позже или завтра с утречка, главное не забыть.
ps: уже на лыжах с работы ))

letnab

 ;) Хорошо. не забудьте только

gardarea51

#5
Вам необходимо установить (если уже не установлены) пакеты: ppp и pptp-linux. Файл глобальных опций для pptp-соединений: /etc/ppp/options.pptp, у меня его содержимое следующее:
root@gw:~# cat /etc/ppp/options.pptp
# Lock the port
lock

# Authentication
# We don't need the tunnel server to authenticate itself
noauth

# We won't do PAP, EAP, CHAP, or MSCHAP, but we will accept MSCHAP-V2
# (you may need to remove these refusals if the server is not using MPPE)
refuse-pap
refuse-eap
#refuse-chap
#refuse-mschap

# Compression
# Turn off compression protocols we know won't be used
nobsdcomp
nodeflate

# Encryption
# (There have been multiple versions of PPP with encryption support,
# choose with of the following sections you will use.  Note that MPPE
# requires the use of MSCHAP-V2 during authentication)

# http://ppp.samba.org/ the PPP project version of PPP by Paul Mackarras
# ppp-2.4.2 or later with MPPE only, kernel module ppp_mppe.o
# {{{
# Require MPPE 128-bit encryption
#require-mppe-128
# }}}

# http://polbox.com/h/hs001/ fork from PPP project by Jan Dubiec
# ppp-2.4.2 or later with MPPE and MPPC, kernel module ppp_mppe_mppc.o
# {{{
# Require MPPE 128-bit encryption
#mppe required,stateless
# }}}

refuse означает "пропустить" или "не использовать", тут зависит от провайдера.

Глобальный файл опций задан, теперь нужно настроить пиры (самих клиентов). Файлы пиров находятся в /etc/ppp/peers, у меня файл пира выглядит так:
root@gw:~# cat /etc/ppp/peers/vpn_client
pty "pptp vpn.client.net --nolaunchpppd"
name "my_vpn_login"
remotename PPTP
file /etc/ppp/options.pptp
ipparam vpn_client

require-mppe-128
#require-mschap-v2
#require-mppe
#defaultroute
#replacedefaultroute
#usepeerdns

persist
maxfail 0
holdoff 15

unit 5

Тут задается адрес коннекта, логин, который будет использоваться для соединения, подключается файл опций, задается имя соединения (ipparam) для использования в скриптах... ну и параметры автодозвона. Заметьте, что у меня отключены следующие параметры (вообще по дефолту они включены, можете почитать о них отдельно):
#defaultroute
#replacedefaultroute
#usepeerdns


С файлом пира все, теперь нужно указать какой пароль будет использоваться при данном соединении. Пароли задаются в файле /etc/ppp/chap.secrets (это как правило, а бывает и файл pap.secrets):
root@gw:~# cat /etc/ppp/chap-secrets
# Secrets for authentication using CHAP
# client server secret IP addresses
"my_vpn_login" PPTP   "my_vpn_passwd"   
Из этого файла будет браться нужный пароль пиром "vpn_client", когда он будет пытаться установить соединение и заданным в нем vpn-сервером.

Теперь о скриптах. В каталогах /etc/ppp/ip-up.d/ и /etc/ppp/ip-down.d/ можно сохранять выполняемые скрипты, которые будут что-то делать при поднятии или опускании ppp-интерфейсов. К примеру вот мой файл для vpn-соединения:
root@gw:~# cat /etc/ppp/ip-up.d/vpn_client
#!/bin/bash

if [ "$PPP_IPPARAM" = "vpn_client" ]; then
        for i in "10.0.0.0/8" "97.xxx.xxx.2" "97.xxx.xxx.3" #\
                #"$(dig +short e.net.com)"
                do ip route add $i via $PPP_LOCAL dev $PPP_IFACE
        done
        exit 0
fi

Все исполняемые файлы, которые лежат в вышеуказанных директориях выполняются _для_каждого_ ppp-соединения, поэтому нужно делать проверку. Здесь проверка делается по имени ipparam (которое мы указывали в файле пира). Переменные $PPP_IPPARAM, $PPP_LOCAL, $PPP_IFACE - это переменные соединения чтоли, не знаю как верно написать )) Их список можно посмотреть в файлах /etc/ppp/ip-up и /etc/ppp-ip-down.

Отступление: налогичные переменные есть и для филических интерфейсов: https://www.debian.org/doc/manuals/debian-reference/ch05.en.html#_scripting_with_the_ifupdown_system

Нужные скрипты написаны (или не написаны, если не нужны), теперь можно использовать соединение командами pon и poff. Для того, чтобы соединение поднималось автоматически и можно было использовать ifup и ifdown - следует поправить /etc/network/interfaces, в частности у меня описание vpn-соединения там сделано так:
root@gw:~# cat /etc/network/interfaces
# The loopback network interface
...
auto vpn_client
iface vpn_client inet ppp
        provider vpn_client
...
provider vpn_client - это указание на имя файла для пира.

Вот в общем как то так.
ps: практически дописал уже ответ и нашел свою старую тему на подобную тему (сори за тавтологию), также можете посмотреть: https://debianforum.ru/index.php?topic=4708.msg41428#msg41428

letnab

Спасибо за развёрнутый ответ. Пока с маршрутами не получается. но буду ковырять. pon и poff работает.

gardarea51

Маршруты при поднятии соединения прописать можно в скрипте в /etc/ppp/ip-up.d/, а при дисконнекте они сами удалятся, так как интерфейс пропадет.
Рад, что помог ))

letnab

#8
Цитата: gardarea51 от 07 сентября 2014, 00:07:22root@gw:~# cat /etc/ppp/ip-up.d/vpn_client
#!/bin/bash

if [ "$PPP_IPPARAM" = "vpn_client" ]; then
        for i in "10.0.0.0/8" "97.xxx.xxx.2" "97.xxx.xxx.3" #\
                #"$(dig +short e.net.com)"
                do ip route add $i via $PPP_LOCAL dev $PPP_IFACE
        done
        exit 0
fi
в данном случае мы добавляем маршрут. но тут есть вопрос. Я не пойму, какой ip за что отвечает.
первый ip -- это выданный клиенту от сервера
второй ip -- шлюз
третий ip -- адрес сервера.
Или я что то не понял.
P.S с linux недавно, некоторые вещи ещё не знаю) ::)

вот параметры которые я получаю с свервера

root@debian:/home/net# ifconfig ppp0
ppp0      Link encap:Point-to-Point Protocol 
          inet addr:172.16.37.46  P-t-P:172.16.36.1  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1400  Metric:1
          RX packets:40 errors:0 dropped:0 overruns:0 frame:0
          TX packets:56 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:8238 (8.0 KiB)  TX bytes:6387 (6.2 KiB)


root@debian:/home/net# ip route
default dev ppp0  proto static
169.254.0.0/16 dev ppp0  scope link  metric 1000
172.16.36.1 dev ppp0  proto kernel  scope link  src 172.16.37.46
192.168.1.0/24 dev wlan0  proto kernel  scope link  src 192.168.1.35
191.72.162.104 via 192.168.1.1 dev wlan0  proto static
191.72.162.104 via 192.168.1.1 dev wlan0  src 192.168.1.35


192.168.1.35 ip полученный от wifi.

gardarea51

#9
Вот переменные из /etc/ppp/ip-up (я убрал лишнее):
# This script is called with the following arguments:
#    Arg  Name                          Example
#    $1   Interface name                ppp0
#    $2   The tty                       ttyS1
#    $3   The link speed                38400
#    $4   Local IP number               12.34.56.78
#    $5   Peer  IP number               12.34.56.99
#    $6   Optional ``ipparam'' value    foo


...
# These variables are for the use of the scripts run by run-parts
PPP_IFACE="$1"
PPP_TTY="$2"
PPP_SPEED="$3"
PPP_LOCAL="$4"
PPP_REMOTE="$5"
PPP_IPPARAM="$6"
export PPP_IFACE PPP_TTY PPP_SPEED PPP_LOCAL PPP_REMOTE PPP_IPPARAM


То есть:
$PPP_IFACE - скажем ppp5 (кстати в файле описания пира есть опция "unit 5" - это говорит, что интерфейс будет не ppp0, ppp1.. а ppp5).
$PPP_LOCAL - адрес интерфейса ppp5 (то есть ваш полученный от vpn-сервера адрес, его можно увидеть по команде ip a l или ifconfig). 
$IPPARAM - заданное нами имя ipparam в файле пира.

Добавление роутов у меня просто перечислено в цикле, а можно сделать просто так:
#!/bin/bash

if [ "$PPP_IPPARAM" = "vpn_client" ]; then
   ip route add 10.0.0.0/8 via $PPP_LOCAL dev $PPP_IFACE
   ip route add 97.xxx.xxx.2 via $PPP_LOCAL dev $PPP_IFACE
   ...
fi

Так как для пира указана опция unit 5 , то интерфейс vpn-соединения будет всегда ppp5, можно было бы заместо $PPP_IFACE написать просто ppp5, но лучше так не делать )) а то unit сменим, а тут поменять забудем..

ps: может быть вам вообще не нужно добавлять никакие маршруты, я это все в качестве примера привожу. Хотя чаще всего конечно добавлять их приходится.

letnab

#10
Спасибо за пример.
Просто мне нужно при коннекте к серверу, завернуть весь траффик на vpn.
если соединение происходит через network manager, маршруты добавляются автоматом.
Вот это самое мне нужно реализовать при использовании pon poff

__Собственно получилось завернуть трафик добавив в /etc/ppp/peers/$TUNNEL следующие строки

defaultroute #создавать маршрут по умолчанию
replacedefaultroute #принудительно изменять маршрут по умолчанию
usepeerdns # получение dns от vpn сервера

Но следующая проблема. DNS не работает. по ip адресу сайт отрывается, по доменному имени нет.
usepeerdns и убирал я этот параметр, и днс гугловские ставил, не работает(

gardarea51

А опция usepeerdns вообще работает, то есть DNS вы получаете?

letnab

#12
да. DNS получаю. через трейс видно что трафик идёт через pptp тунель. так же, убирал usepeerdns толку 0

Ковырял ковырял, и вдруг всё заработало как нужно. Хотя ничего и не делал. чудеса да и только!
Огромное спасибо gardarea51 за помощь. Премного благодарен!

gardarea51