10 февраля 2016 г.

PPTP тунель между Ubuntu за TP-Link и Zyxel Keenetic


Исходные данные:

Сеть №1 (192.168.1.0/24):
Сервер Ubuntu 14.04 LTS (192.168.1.202) - выполняет роль VPN сервера на основе pritunl
Сервер находится за TL-WR841N/TL-WR841ND
Сеть №2 (192.168.5.0/24):
У черта на куличиках видеорегистратор за Zyxel Keenetic Omni II на свистке без белого ip

Проблема:
Видеорегистратор не умеет облачные технологии, а смотреть картинку хочется удаленно.

Задача:
Увидеть видеорегистратор из первой сети используя VPN сервер.



Решение:
Сразу скажу, решение не самое лучшее, и связано это с узкостью оборудования, конкретно Zyxel, который не умеет ipsec (забудьте про сертификаты и pre-shared-key). 
Фактически остается два варианта:

  1. L2TP without ipsec
  2. PPTP
Для первого я не нашел настройки на Ubuntu, не являюсь мегаспецом в сетях, а второе не самое лучшее в виду различных болячек. Но мы остановимся на втором варианте.

Реализация.

Настраиваем TP-Link

Нужно пробросить порт 1723 на наш сервер:

И разрешить PPTP трафик (47 протокол IP):

Настраиваем сервер:

В настройке PPTP на Ubuntu ничего нового нет.

Устанавливаем
apt-get install pptpd
Разрешаем форвард между интерфейсами
net.ipv4.ip_forward = 1
Применяем форвард без перезагрузки
sysctl -p
Сохранить после перезагрузки, в файле /etc/sysctl.conf раскомментировать строку:
net.ipv4.ip_forward=1
Редактируем конфигурацию
nano /etc/pptpd.conf
 option /etc/ppp/pptpd-options
 logwtmp
 localip 172.28.5.1
 remoteip 172.28.5.2

Мне нужно выдавать 1 адрес (remoteip). localip не должен быть равным адресу на других интерфейсах
Далее создаем пользователей/пароли:
nano /etc/ppp/chap-secrets
 # Secrets for authentication using CHAP
 # client server secret IP addresses
 user1 pptpd password "172.28.5.2"

Здесь я явно указал, что пользователю user1 нужно дать ip 172.28.5.2. Синтаксис файла нужно соблюдать!

Не правильное заполнение файла может привести к такому (я такое получил использовав в пароле знак "#"):

На zyxel:
[I] Feb 10 13:07:25 ndm: Network::Interface::Base: "PPTP0": interface is up.
[I] Feb 10 13:07:28 pptp[323]: Plugin pptp.so loaded.
[I] Feb 10 13:07:28 pptp[323]: PPTP plugin version 0.8.3 compiled against pppd 2.4.4-4
[I] Feb 10 13:07:28 pptp[323]: pppd 2.4.4-4 started by root, uid 0
[I] Feb 10 13:07:28 ndm: Network::Interface::PPTP: added host route to XXX.YYY.ZZZ.QQQ via xxx.yyy.zzz.qqq.
[I] Feb 10 13:07:28 pptp[327]: IP: XXX.YYY.ZZZ.QQQ
[I] Feb 10 13:07:28 pptp[327]: control connection
[I] Feb 10 13:07:28 pptp[327]: unix_sock
[I] Feb 10 13:07:28 pptp[328]: enable echo requests (30:3)
[I] Feb 10 13:07:28 pptp[328]: Sent control packet type is 1 'Start-Control-Connection-Request'
[I] Feb 10 13:07:28 pptp[328]: Received Start Control Connection Reply
[I] Feb 10 13:07:28 pptp[328]: Client connection established.
[I] Feb 10 13:07:29 pptp[328]: Sent control packet type is 7 'Outgoing-Call-Request'
[I] Feb 10 13:07:29 pptp[328]: Received Outgoing Call Reply.
[I] Feb 10 13:07:29 pptp[328]: Outgoing call established (call ID 6, peer's call ID 384). [I] Feb 10 13:07:29 ndm: kernel: Fast VPN ctrl: setup for src XXX.YYY.ZZZ.QQQ[I] Feb 10 13:07:29 pptp[323]: Using interface ppp0
[I] Feb 10 13:07:29 pptp[323]: Connect: ppp0 <--> pptp (XXX.YYY.ZZZ.QQQ)
[I] Feb 10 13:07:29 pptp[328]: read returned zero, peer has closed
[I] Feb 10 13:07:29 pptp[328]: Closing connection (shutdown)
[I] Feb 10 13:07:29 pptp[328]: Sent control packet type is 12 'Call-Clear-Request'
[I] Feb 10 13:07:29 pptp[328]: read returned zero, peer has closed
[I] Feb 10 13:07:29 pptp[328]: Closing connection (call state)
[I] Feb 10 13:07:29 pptp[323]: Modem hangup
[I] Feb 10 13:07:29 pptp[323]: Connection terminated.
[I] Feb 10 13:07:29 ndm: kernel: Fast VPN ctrl: release for src XXX.YYY.ZZZ.QQQ[I] Feb 10 13:07:29 pptp[323]: Exit.
[E] Feb 10 13:07:29 ndm: Service: "PPTP0": unexpectedly stopped.
На Windows:
Сходу получите ошибку 619 (скорее всего)
На сервере PPTP:
tail -f /var/log/syslogFeb 10 13:11:41 ovpn-srv-01 pppd[25731]: Plugin rp-pppoe.so loaded.
Feb 10 13:11:41 ovpn-srv-01 pppd[25731]: Plugin /usr/lib/pptpd/pptpd-logwtmp.so loaded.
Feb 10 13:11:41 ovpn-srv-01 pppd[25731]: The remote system is required to authenticate itself
Feb 10 13:11:41 ovpn-srv-01 pppd[25731]: but I couldn't find any suitable secret (password) for it to use to do so. Feb 10 13:11:41 ovpn-srv-01 pppd[25731]: (None of the available passwords would let it use an IP address.)
Feb 10 13:11:41 ovpn-srv-01 pptpd[25729]: GRE: read(fd=6,buffer=7f808e1494a0,len=8196) from PTY failed: status = -1 error = Input/output error, usually caused by unexpected termination of pppd, check option syntax and pppd logs
Feb 10 13:11:41 ovpn-srv-01 pptpd[25729]: CTRL: PTY read or GRE write failed (pty,gre)=(6,7)
Feb 10 13:11:41 ovpn-srv-01 pptpd[25729]: CTRL: Reaping child PPP[25731]
Feb 10 13:11:41 ovpn-srv-01 pptpd[25729]: CTRL: Client XX.XX.XX.XX control connection finished
Feb 10 13:11:44 ovpn-srv-01 pptpd[25743]: CTRL: Client XX.XX.XX.XX control connection started
Feb 10 13:11:45 ovpn-srv-01 pptpd[25743]: CTRL: Starting call (launching pppd, opening GRE)

Редактируем опции
nano /etc/ppp/pptpd-options
 name pptpd
 refuse-pap
 refuse-chap
 refuse-mschap
 require-mschap-v2
 require-mppe-128
 ms-dns 8.8.8.8
 ms-dns 8.8.4.4
 proxyarp
 nodefaultroute
 lock
 nobsdcomp
 novj
 novjccomp
 nologfd
 noipx
 mtu 1400
 mru 1400

DNS можете указать другой, mtu/mru по-умолчанию 1500. В случае потери пакетов можете с поиграться с этим параметром.
Перезапускаем сервер
service pptpd restart
netstat -alpn | grep :1723
tcp 0 0 0.0.0.0:1723 0.0.0.0:* LISTEN 27160/pptpd
Сервер запустился и слушает, этой же командой можно просмотреть текущие подключения:
netstat -alpn | grep :1723
tcp 0 0 xx.xx.xx.xx:1723 xx.xx.xx.xx:60342 ESTABLISHED 27101/pptpd [xx.xx.

Разрешаем движение траффика с интерфейсов на eth0 (смотрит в локалку)
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Если надо видеть другие тачки:
iptables --table nat --append POSTROUTING --out-interface ppp0 -j MASQUERADE
iptables -I INPUT -s 172.28.5.0/24 -i ppp0 -j ACCEPT
iptables --append FORWARD --in-interface eth0 -j ACCEPT
Не забываем сохранять правила
iptables-save >/etc/iptables
nano /etc/network/interfaces
в конце добавляем
pre-up iptables-restore < /etc/iptables
post-down iptables-save > /etc/iptables

Настраиваем ZYXEL:

Создаем подключение:
 Добавляем правила:

В принципе PPTP настроено.

Так, у нас две сети реальные, и одна виртуальная.
Как же объяснить ПК в сети 1 как найти ПК в сети 2?
На сервере добавляем правило маршрутизации:
route add -net 192.168.5.0 netmask 255.255.255.0 ppp0
Т.е. все что приходит для пятой подсети направить в наш PPTP тунель.
При этом на TP-Link`у нам нужно сказать:
"Эй, прилетит пакет на пятую подсеть, кидай его на сервер Ubuntu"

Все, сеть 2 из 1 первой видна.
В обратную сторону:

Чтобы не добавлять маршрут при каждой перезагрузке, создаем скрипт (имя любое) в папке /etc/ppp/ip-up.d/script:
 #!/bin/sh
 PATH=/sbin:/bin:/usr/sbin:/usr/bin
 if [ "$4" = "172.28.5.1" ]; then
  route add -net 192.168.5.0 netmask 255.255.255.0 $1
 fi

Применяем
chmod x+ /etc/ppp/ip-up.d/script
Можно в /etc/ppp/ip-down.d/ указать удаление маршрута

Комментариев нет:

Отправка комментария