VPN. IP и маршрутизация

Я VPN-ом пользуюсь давно. Даже не скажу сколько. Может лет десять, а может семь. Однако каких-то понятий о данной технологии не было. Ну установил pptp, ну прописал логин и пароль, ну настроил как-то чтобы работало… Работает? Ну и здорово!

А тут пару месяцев назад после обновления системы что-то VPN перестал работать. Посмотрел что ядро обновлялось (причем новая ветка 4.10.x), откатился на предыдущую (4.9.9) версию – VPN работает. Решил, что в ядре чего-то накосячили и надо будет через пару недель посмотреть может с новыми версиями проблема решиться. Однако с каждой новой версией ядра проблема не уходила. А это значит что проблема в моих настройках, которые почему-то до ветки ядра 4.10 работали замечательно.

Посмотрел что в журналах пишется:

Май 21 09:59:44 styx kernel: PPP generic driver version 2.4.2
Май 21 09:59:44 styx pppd[2171]: pppd 2.4.7 started by root, uid 0
Май 21 09:59:44 styx pppd[2171]: Using interface ppp0
Май 21 09:59:44 styx pppd[2171]: Connect: ppp0 <--> /dev/pts/1
Май 21 09:59:44 styx pptp[2173]: anon log[main:pptp.c:333]: The synchronous pptp option is NOT activated
Май 21 09:59:44 styx pptp[2181]: anon log[ctrlp_rep:pptp_ctrl.c:258]: Sent control packet type is 1 'Start-Control-Connection-Request'
Май 21 09:59:44 styx pptp[2181]: anon log[ctrlp_disp:pptp_ctrl.c:758]: Received Start Control Connection Reply
Май 21 09:59:44 styx pptp[2181]: anon log[ctrlp_disp:pptp_ctrl.c:792]: Client connection established.
Май 21 09:59:45 styx pptp[2181]: anon log[ctrlp_rep:pptp_ctrl.c:258]: Sent control packet type is 7 'Outgoing-Call-Request'
Май 21 09:59:45 styx pptp[2181]: anon log[ctrlp_disp:pptp_ctrl.c:877]: Received Outgoing Call Reply.
Май 21 09:59:45 styx pptp[2181]: anon log[ctrlp_disp:pptp_ctrl.c:916]: Outgoing call established (call ID 0, peer's call ID 13796).
Май 21 09:59:45 styx pppd[2171]: CHAP authentication succeeded
Май 21 09:59:45 styx kernel: PPP MPPE Compression module registered
Май 21 09:59:45 styx pppd[2171]: MPPE 128-bit stateless compression enabled
Май 21 09:59:47 styx pppd[2171]: Cannot determine ethernet address for proxy ARP
Май 21 09:59:47 styx pppd[2171]: local  IP address X.X.X.248
Май 21 09:59:47 styx pppd[2171]: remote IP address x.x.x.35
Май 21 10:01:45 styx pptp[2181]: anon log[pptp_handle_timer:pptp_ctrl.c:1082]: closing control connection due to missing echo reply
Май 21 10:01:45 styx pptp[2181]: anon log[ctrlp_rep:pptp_ctrl.c:258]: Sent control packet type is 12 'Call-Clear-Request'
Май 21 10:01:45 styx pptp[2181]: anon log[pptp_conn_close:pptp_ctrl.c:438]: Closing PPTP connection
Май 21 10:01:45 styx pptp[2181]: anon log[ctrlp_rep:pptp_ctrl.c:258]: Sent control packet type is 3 'Stop-Control-Connection-Request'
Май 21 10:01:45 styx pptp[2181]: anon log[call_callback:pptp_callmgr.c:84]: Closing connection (call state)
Май 21 10:01:45 styx pppd[2171]: Modem hangup
Май 21 10:01:45 styx pppd[2171]: Connect time 2.0 minutes.
Май 21 10:01:45 styx pppd[2171]: Sent 13061 bytes, received 0 bytes.
Май 21 10:01:45 styx pppd[2171]: MPPE disabled
Май 21 10:01:45 styx pppd[2171]: Connection terminated.
Май 21 10:01:45 styx pppd[2171]: Exit.

Знакомый сетевой специалист подсказал, что раз соединение закрывается из-за неполучения эхо-ответа, то стоило бы посмотреть на маршрутизацию.

До установки VPN-соединения в таблице маршрутизации должна быть прописана сеть на интерфейсе через который у вас интернет доступен (вы к VPN-серверу подключаетесь) и default куда все остальное отправляется (обычно это ваш машрутизатор). Например что-то типа такого:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.0.86    0.0.0.0         UG    0      0        0 enp3s0
192.168.0.80    0.0.0.0         255.255.255.240 U     0      0        0 enp3s0

192.168.0.86 – это адрес маршрутизатора, 192.168.0.80/28 – сеть на интерфейсе enp3s0.

После установки VPN-соединения у вас появляется еще один интерфейс (VPN-туннель), например ppp0. И таблица маршрутизации должна как минимум выглядеть уже вот так:

default         192.168.0.86    0.0.0.0         UG    0      0        0 enp1s0
192.168.0.80    0.0.0.0         255.255.255.240 U     0      0        0 enp1s0
v.v.v.v         192.168.0.86    255.255.255.255 UGH   0      0        0 enp1s0
x.x.x.35        0.0.0.0         255.255.255.255 UH    0      0        0 ppp0

v.v.v.v – адрес VPN-сервера, x.x.x.35 – это remote адрес VPN-туннеля (pptp выводит local и remote адреса туннеля при подключении).

Вроде как раньше само так получалось, а с новыми ядрами нет. Но не будем голову ломать вопросами «почему да как?», а просто создадим или подправим скрипт, который правит маршрутизацию при создании VPN-соединения. Обычно он находится в каталоге /etc/ppp/ip-up.d. Т.е. в каталоге со скриптами которые запускаются при поднятии VPN-туннеля. Если скрипта нет, создадим например 01-route.sh с таким содержимым (или заменим существующий этим):

#!/bin/bash

VPN=v.v.v.v
GATEWAY=$(/sbin/ip route | awk '/default/ { print $3 }')

# to VPN
/sbin/ip route add $VPN via $GATEWAY
# to remote addr
/sbin/ip route add $5 dev $1
# add other networks
/sbin/ip route add n1.n1.n1.0/24 dev $1
/sbin/ip route add n2.n2.n2.0/24 dev $1

VPN – это IP-адрес VPN-сервера (нужно заменить v.v.v.v на адрес вашего сервера). GATEWAY – это адрес шлюза, он определяется автоматически по данным таблицы маршрутизации.

Две последние строчки в скрипте добавляют в таблицу маршрутизации правила по которым сети n1.n1.n1.0/24 и n2.n2.n2.0/24 будут доступны через VPN-соединение (вам необходимо исправить их и прописать то что вам необходимо), а все остальное будет ходить как обычно.

Проверить как и куда пойдет маршрут для заданного адреса или сети можно при помощи этой команды:

# ip route get 10.10.20.206
ip route get 10.10.20.0/24

Удачного коннекта!


Комментарии

Оставить комментарий

Ответ на VPN. IP и маршрутизация