FreeBSD клиент 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 реальными значениями.