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