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
Удачного коннекта!