Добрый день!
Небольшое вступление. На работе директор ездил в Китай и на себе попробовал китайский файрвол. 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 оставляем все по-умолчанию
Разрешаем запуск 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