Создание VPN сервера на FreeBSD для IOS, Android и Windows клиентов

Добрый день!
Небольшое вступление. На работе директор ездил в Китай и на себе попробовал китайский файрвол. Twitter в Китае блочится напрочь. В связи с этой поездкой было принято решение создать VPN решение для обхода блокировщиков.
Коммерческие варианты отбросили в сторону, т.к. постоянная потребность в  VPN не стоит, так же отбросили прекрасное решение, как OpenVPN, смотря в сторону нативных клиентов, в первую очередь на iOS, будем делать PPTP сервер.
Итак, поехали:)Все будем делать на FreeBSD 9.2, без пересборке ядра, нужные нам модули загрузим с помощью kldload.
Для примера, наш сервер будет иметь реальный IP-адрес XXX.XXX.XXX.XXX на интерфейсе xl0, для VPN клиентов выделим любую фейковую сеть из неиспользуемых в нашей локальной сети (т.к. в моей задаче не стоит, пускать VPN клиентов во внутрь сети) для примера возьмем сеть 192.168.55.0/24.

Обновляем порты

# portsnap fetch update

Устанавливаем mpd5

# cd /usr/ports/net/mpd5/
# make install clen

В config оставляем все по-умолчанию
mpd52

Разрешаем запуск mpd5

# echo "mpd_enable="YES"" >> /etc/rc.conf
# echo "mpd_flags="-b"" >> /etc/rc.conf #Detach from the terminal and run as a background deamon

Создаем конфигурационные файлы mpd5 и устанавливаем им атрибуты

# touch /usr/local/etc/mpd5/mpd.conf /usr/local/etc/mpd5/mpd.secret
# chmod 600 /usr/local/etc/mpd5/mpd.conf /usr/local/etc/mpd5/mpd.secret

Редактируем конфиг

# vi /usr/local/etc/mpd5/mpd.conf

 

startup:
   log +PHYS2
   #Устанавливаем админа с именем admin и паролем mypassword
   set user admin mypassword admin
   set console self 127.0.0.1 5005
   set console open
   #Веб интерфейс будет доступен по адресу XXX.XXX.XXX.XXX на порту 5006 (имя и пароль указаны выше)
   set web self XXX.XXX.XXX.XXX 5006
   set web open

default:
    load pptp_server

pptp_server:
    #Наш выделенный пул адресов для клиентов
    set ippool add pool1 192.168.55.1 192.168.55.254
    create bundle template C
    set iface enable proxy-arp
    set iface enable tcpmssfix
    set ipcp yes vjcomp
    #Указываем адрес нашего сервера
    set ipcp ranges XXX.XXX.XXX.XXX/32 ippool pool1
    #Назначаем DNS серверы для клиента (например от google)
    set ipcp dns 8.8.8.8
    #Если нужно, то можно прописать и WINS сервера
    #set ipcp nbns 192.168.0.1
    set bundle enable compression
    set ccp yes mppc
    set mppc yes e128
    set mppc yes stateless
    create link template L pptp
    set link action bundle C
    set link enable multilink
    set link yes acfcomp protocomp
    set link no pap eap
    set link enable chap
    #MTU size
    set link mtu 1460
    #На каком интерфейсе принимать клиентов
    set pptp self XXX.XXX.XXX.XXX
    set link enable incoming

Прописываем наших клиентов в файле /usr/local/etc/mpd5/mpd.secret

# vi /usr/local/etc/mpd5/mpd.secret
#USERNAME         PASSWORD         IP-address#
test              mypassword       192.168.55.10

IP-адрес прописывать необязательно!
Настраиваем логирование mpd5.
Вписываем /etc/syslog.conf следующее

!mpd
*.*                                             /var/log/mpd.log

Настраиваем ротацию лога /var/log/mpd.log.

# vi /etc/newsyslog.conf

Добавляем в него эту строку

/var/log/mpd.log                        600  5     *    100   J

Создадим лог-файл

# touch /var/log/mpd.log
# chmod 600 /var/log/mpd.log

Ресстартуем syslogd newsyslogd

# /etc/rc.d/syslogd restart
# /etc/rc.d/newsyslog restart

Стартуем mpd5

# /usr/local/etc/rc.d/mpd5 start

Смотрим вывод в лог

# tail -f /var/log/mpd.log

Если все правильно, то вывод должен выглядеть примерно так:

process 2703 started, version 5.6 (root@vbox 15:08 30-ок<D1>M-^B-2013)
Oct 30 17:27:17 vbox mpd: CONSOLE: listening on 127.0.0.1 5005
Oct 30 17:27:17 vbox mpd: web: listening on XXX.XXX.XXX.XXX 5006
Oct 30 17:27:17 vbox mpd: PPTP: waiting for connection on XXX.XXX.XXX.XXX 1723

На этом этапе можете попробовать подключится к серверу с указанными логин-паролями в файле /usr/local/etc/mpd5/mpd.secret, если все хорошо, то приступим к NAT.
Я использую ipnat.
Делаем из нашего сервера шлюз:)

# echo "gateway_enable="YES"" >> /etc/rc.conf
# echo "ipnat_enable="YES"" >> /etc/rc.conf
# echo "ipnat_program="/sbin/ipnat"" >> /etc/rc.conf
# echo "ipnat_rules="/etc/ipnat.conf"" >> /etc/rc.conf

Создаем файл /etc/ipnat.conf со следующим содержанием (в начале статьи мы договорились, что внешний интерфейс у нас будет xl0, соответственно Вы должны вписать имя вашего интерфейса)

map xl0 192.168.55.0/24 -> XXX.XXX.XXX.XXX/32 proxy port ftp ftp/tcp
map xl0 192.168.55.0/24 -> XXX.XXX.XXX.XXX/32 portmap tcp/udp 1025:65000
map xl0 192.168.55.0/24 -> XXX.XXX.XXX.XXX/32
# где XXX.XXX.XXX.XXX - адрес вашего внешнего интерфейса

Теперь либо перезагружаете ваш сервер, либо подгружаем модуль ядра, загружаем NAT и делаем из сервера шлюз (если до этой загрузки в rc.conf не было указано gateway_enable=»YES»)

# kldload ipl
# sysctl net.inet.ip.forwarding=1

Загружаем наши правила NAT

# ipnat -f /etc/ipnat.conf

Можем проверить состояние NAT, командой ipnat -l

Не забываем прописать разрешающие правила в FireWall, пример для ipfw

#!/bin/sh
FW=/sbin/ipfw
PPTP=192.168.55.0/24

#For PPTP
$FW add allow ip from $PPTP to any
$FW add allow ip from any to $PPTP
$FW add allow tcp from me 1723 to any keep-state
$FW add allow gre from any to any

На этом вроде все, буду рад — если кому-нибудь эта статья пригодится, опробованные клиенты: Android 2.3.5, iOS 6, Windows 7

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Добавить комментарий

:) :D :( :o 8O :? 8) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.