Добрый день!
Небольшое вступление. На работе директор ездил в Китай и на себе попробовал китайский файрвол. Twitter в Китае блочится напрочь. В связи с этой поездкой было принято решение создать VPN решение для обхода блокировщиков.
Коммерческие варианты отбросили в сторону, т.к. постоянная потребность в VPN не стоит, так же отбросили прекрасное решение, как OpenVPN, смотря в сторону нативных клиентов, в первую очередь на iOS, будем делать PPTP сервер.
Итак, поехали:)Все будем делать на FreeBSD 9.2, без пересборке ядра, нужные нам модули загрузим с помощью kldload.
Для примера, наш сервер будет иметь реальный IP-адрес XXX.XXX.XXX.XXX на интерфейсе xl0, для VPN клиентов выделим любую фейковую сеть из неиспользуемых в нашей локальной сети (т.к. в моей задаче не стоит, пускать VPN клиентов во внутрь сети) для примера возьмем сеть 192.168.55.0/24.
Обновляем порты
1 | # portsnap fetch update |
Устанавливаем mpd5
1 2 | # cd /usr/ports/net/mpd5/ # make install clen |
В config оставляем все по-умолчанию
Разрешаем запуск mpd5
1 2 | # 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 и устанавливаем им атрибуты
1 2 | # 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 |
Редактируем конфиг
1 | # vi /usr/local/etc/mpd5/mpd.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | 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
1 | # vi /usr/local/etc/mpd5/mpd.secret |
1 2 | #USERNAME PASSWORD IP-address# test mypassword 192.168.55.10 |
IP-адрес прописывать необязательно!
Настраиваем логирование mpd5.
Вписываем /etc/syslog.conf следующее
1 2 | !mpd *.* /var/log/mpd.log |
Настраиваем ротацию лога /var/log/mpd.log.
1 | # vi /etc/newsyslog.conf |
Добавляем в него эту строку
1 | /var/log/mpd.log 600 5 * 100 J |
Создадим лог-файл
1 2 | # touch /var/log/mpd.log # chmod 600 /var/log/mpd.log |
Ресстартуем syslogd newsyslogd
1 2 | # /etc/rc.d/syslogd restart # /etc/rc.d/newsyslog restart |
Стартуем mpd5
1 | # /usr/local/etc/rc.d/mpd5 start |
Смотрим вывод в лог
1 | # tail -f /var/log/mpd.log |
Если все правильно, то вывод должен выглядеть примерно так:
1 2 3 4 | 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.
Делаем из нашего сервера шлюз:)
1 2 3 4 | # 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, соответственно Вы должны вписать имя вашего интерфейса)
1 2 3 4 | 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»)
1 2 | # kldload ipl # sysctl net.inet.ip.forwarding=1 |
Загружаем наши правила NAT
1 | # ipnat -f /etc/ipnat.conf |
Можем проверить состояние NAT, командой ipnat -l
Не забываем прописать разрешающие правила в FireWall, пример для ipfw
1 2 3 4 5 6 7 8 9 | #!/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