FreeBSD клиент VPN через pptp

Материал из rrv-wiki
Перейти к навигации Перейти к поиску
Подключаем FreeBSD к Windows VPN, посредством pptp-клиента.

Введение

Установка pptpclient

Для начала нам необходимо поставить из портов pptp-клиента.

    #cd /usr/ports/net/pptpclient/
    #make install

При этом установится так эже сопутствующий порт /usr/ports/devel/libgnugetopt.

Настройка ppp

Добавляем несколько строк в файл /etc/ppp/ppp.conf (дефолтные настройки необходимо оставить). Обратите внимание на пробелы в начале каждой строки в блоке, без них работать не будет. (в место cat можно воспользоваться любым другим текстовым редактором).

    #cat >> /etc/ppp/ppp.conf
my-vpn:
 set authname my-vpn-name
 set authkey my-vpn-password
 set timeout 0
 set ifaddr 0 0
 alias enable yes

нажимаем <ctrl+D> для сохранения и выхода из режима редактирования. Здесь:

       my-vpn - произвольное название секции, таких секций может быть несколько, по одной для каждого VPN-соеденения,
       my-vpn-name - имя пользователя для авторизации на VPN сервере, а my-vpn-password - его пароль.

Настройка firewall-а

Так же, необходимо разрешить прохождения пакетов в firewall-е:

       #/sbin/ipfw add 40 allow tcp from me 1024-65535 to ip-adress-vpn-server 1723
       #/sbin/ipfw add 41 allow tcp from ip-adress-vpn-server 1723 to me 1024-65535
       #/sbin/ipfw add 42 allow gre from me to ip-adress-vpn-server
       #/sbin/ipfw add 43 allow gre from ip-adress-vpn-server to me

Пример:

       #/sbin/ipfw add 40 allow tcp from me 1024-65535 to 172.22.0.45 1723
       #/sbin/ipfw add 41 allow tcp from 172.22.0.45 1723 to me 1024-65535
       #/sbin/ipfw add 42 allow gre from me to 172.22.0.45
       #/sbin/ipfw add 43 allow gre from 172.22.0.45 to me

Остальные правила на свой вкус, главное чтобы были разрешены TCP пакеты на порт 1723 VPN-сервера и gre пакеты.

Подключение к VPN серверу

Для подключения к VPN серверу выполните из под root-а:

       # /usr/local/sbin/pptp ip-adress-vpn-server my-vpn

Здесь:

  • ip-adress-vpn-server - IP-адрес VPN сервера
  • my-vpn - имя подключения (из конфига /etc/ppp/ppp.conf)

Например:

       # /usr/local/sbin/pptp 172.22.0.45 my-vpn

Если подключение не "отваливается", значит все хорошо (подождите несколько секунд). Теперь добавим в конец строки & (ampersand) для того, что бы подключение осуществлялось в фоновом режиме, и и запустим pptp снова:

       # /usr/local/sbin/pptp ip-adress-vpn-server my-vpn &

При успешном подключении создастся интерфейс tunX, где X - цифра. Например так:

       #ifconfig tun0
       tun0: flags=8051 mtu 1498
           inet 10.1.1.15 --> 10.1.1.1 netmask 0xffffffff
           Opened by PID 45581

Здесь:

  • 10.1.1.15 - IP-адрес выделенный нам,
  • 10.1.1.1 - Шлюз в VPN подсеть.

Эти ip адреса нам выдает VPN-сервер, запомните их, они нам пригодятся в дальнейшем.

Теперь, необходимо добавить статический маршрут, до подсети к которой мы подключаемся (находящейся за VPN-сервером):

       #/sbin/route add -host ip-adress-vpn-net/mask ip-adress-vpn-geteway

Здесь:

  • ip-adress-vpn-net/mask VPN сеть к которой мы подключаемся, а mask-маска подсети

(например для сети 10.1.1.0 и маски 255.255.255.0 запись будет выглядеть так: 10.1.1.0/24),

  • ip-adress-vpn-geteway - шлюз через который доступна VPN-сеть, например 10.1.1.1.

Для примера:

       #/sbin/route add -host 10.1.1.0/24 10.1.1.1

Вообще IP адреса шлюза и подсети, а так же маску, лучше узнать у администраторов VPN-сервера.

Варианты подключения

При этом если мы подключаемся к VPN-серверу для того, что бы подключится к internet, тогда:

1:    Т.к. для выхода в internet нам необходимо, что бы весь трафик шел через VPN-сервер,
      для этого необходимо сменить default geteway, для автоматической смены при подключении
      требуется добавить еще одну строчку в наш my-vpn блок в файле /etc/ppp/ppp.conf:
      
           #cat >> /etc/ppp/ppp.conf
       
           add default HISADDR
               
      И опять же, не забудем про пробел в начале строки.
2:    если VPN-сервер находится вне нашей подсети, необходимо прописать статический маршрут
      до VPN сервера так как иначе при смене default geteway VPN-сервер станет недоступен.
       
            #/sbin/route add -host ip-adress-vpn-server ip-adress-my-gateway
       
      Опять же, ip-adress-vpn-server - это внешний IP-адрес VPN-сервера,
      а ip-adress-my-gateway - это шлюз через который можно попасть на этот IP (обычно это "default geteway")
      Для примера:
      
            #/sbin/route add -host 172.22.0.45 192.168.0.1
       
      Таким же образом необходимо добавить маршруты к локальным подсетям,
      если таковые имелись, для того, что бы трафик к ним шел напрямую, а не через VPN-сервер.
       
      Для примера:
               
            #/sbin/route add -host 192.168.1.0/24 192.168.0.1

Скрипт для подключения

Ну и последнее, для удобства, оформим все вышеизложенное в виде скрипта. Скрипт написан для подключения к VPN-сети, если требуется подключатся через VPN к сети internet, то требуется слегка видоизменить скрипт.

#!/bin/sh
case "$1" in
start)
        /sbin/ipfw add 40 allow tcp from me 1024-65535 to ip-adress-vpn-server 1723
        /sbin/ipfw add 41 allow tcp from ip-adress-vpn-server 1723 to me 1024-65535
        /sbin/ipfw add 42 allow gre from me to ip-adress-vpn-server
        /sbin/ipfw add 43 allow gre from ip-adress-vpn-server to me
        /usr/local/sbin/pptp ip-adress-vpn-server my-vpn &
        /bin/sleep 10 #Обязательно, т.к. туннель появляется не мгновенно, и пока он не появился, нельзя создавать маршрут.
        /sbin/route add -host ip-adress-vpn-net/mask ip-adress-vpn-geteway
        ;;
stop)
        if [ -f /var/run/tun0.pid ]; then
          /sbin/ipfw del 40
          /sbin/ipfw del 41
          /sbin/ipfw del 42
          /sbin/ipfw del 43
          /usr/bin/killall pptp
          /sbin/route delete -host ip-adress-vpn-net/mask
          ifconfig tun0 down
        fi
        ;;
*)
        echo "Usage: For create VPN-connect $0 {start|stop}" >&2
        ;;
esac
exit 0

Не забудьте поменять текст выделенный курсивом на реальные IP-адреса, а так же дать права на выполнение этому скрипту. Если требуется поднимать туннель сразу после загрузки компьютера, то имеет смысл поместить скрипт в /usr/local/etc/rc.d/ и назвать например vpn.sh, а так же выставить права доступа.


P.S. С одной конторой возникли проблемы

Они постоянно меняли внутренний шлюз. Проблему решил в ручную (хотя скрипт сделает это легко) делаем так:

# ifconfig tun0
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1498
       inet 172.17.1.228 --> 172.17.1.220 netmask 0xffffffff
       Opened by PID 13393

Отсюда видно, что шлюз имеет ip-адрес 172.17.1.220.

по этому:

# /sbin/route add -host ip-adress-vpn-net/mask 172.17.1.220

Не забудьте заменить ip-adress-vpn-net/mask реальными значениями.