Как быстро настроить VPN | FreeBSD

Понадобилось настроить VPN для доступа к ресурсам локальной сетки (файлсервер, rdp, vnc и т.д). Шлюз работает на FreeBSD. Начал смотреть что есть, а есть немало: poptop, mpd5, openVPN, vtun и т.д.

Особых требований у нас нет – настроить клиента под виндой и подключившись к шлюзу получить айпи из диапазона внутренней сети и получить доступ к локальным ресурсам.


Проще всего оказалось настроить mpd5.

Ставим:

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

В опциях ничего не выбираем.

Добавляем в rc.conf строку запуска:

#echo mpd_enable="YES" >> /etc/rc.conf

Правим конфиг /usr/local/etc/mpd5/mpd.conf:

startup:
        # configure mpd users
        set user bigboss 45lkfdgk admin
        # configure the console
        set console self 127.0.0.1 5005
        set console open
        # configure the web server
        set web self 0.0.0.0 5006
        set web open

default:
        load pptp_server

pptp_server:

# Define dynamic IP address pool.
#Эта строка отвечает за то какие адреса будут присваиваться клиентам
#Лучше выделить пул не пересекающийся с тем что раздаёт DHCP
        set ippool add pool1 172.16.5.34 172.16.5.49

# Create clonable bundle template named B
        create bundle template B
# Эта строка позволяет нашей машине взаимодействовать 
# c внутренней сеткой, без неё пинг внутрь не пройдет
        set iface enable proxy-arp
        set iface idle 1800
        set iface enable tcpmssfix
        set ipcp yes vjcomp
# Specify IP address pool for dynamic assigment.
#Это адрес интерфейса через который будет взаимодействовать
#интерфейс ng0 (или подобный) с внутренней сеткой (по сути лупбэк)
#можно назначить любой из свободных внутренних
        set ipcp ranges 172.16.5.2/32 ippool pool1
#DNS - если внутренний есть то пишем его. 
#Если внешний - его. Мне DNS внутри не нужен - 
#как-то особо не проверял как работает.
        set ipcp dns 15.20.54.1
#       set ipcp nbns 192.168.1.4
# The five lines below enable Microsoft Point-to-Point encryption
# (MPPE) using the ng_mppc(8) netgraph node type.
        set bundle enable compression
        set ccp yes mppc
        set mppc yes e40
        set mppc yes e128
        set mppc yes stateless

# Create clonable link template named L
        create link template L pptp
# Set bundle template to use
        set link action bundle B
# Multilink adds some overhead, but gives full 1500 MTU.
# Если во время коннекта получили ошибки по поводу не поддерживаемых
# протоколов и шифрования - то это потому что закомментировали эти строки
# Для нормальной работы они нужны
        set link enable multilink
        set link yes acfcomp protocomp
        set link no pap chap eap
        set link enable chap
# We can use use RADIUS authentication/accounting by including
# another config section with label 'radius'.
#       load radius
        set link keep-alive 10 60
# We reducing link mtu to avoid GRE packet fragmentation.
        set link mtu 1460
# Configure PPTP
# Определяем внешний интерфейc на котором будем слушать
        set pptp self 134.54.35.66
# Allow to accept calls
        set link enable incoming

Далее файл /usr/local/etc/mpd5/mpd.secrets. Формат файла простой:

#user          password            IP
admin         123                     *
user           1223                   172.16.5.45

Если есть фаерволл типа ipfw – добавляем правила:

################
#MPD5
################
${fwcmd} add allow tcp from any to me 1723
${fwcmd} add allow gre from any to any
${fwcmd} add allow ip from any to any via tun0
${fwcmd} add allow ip from any to any via ng0

ВАЖНО: gateway_enable=»YES» в rc.conf (очевидно, что ось не будет передавать пакеты между интерфейсами без net.inet.ip.forwarding=1)

Обращем внимание на то, где стоит правило ${fwcmd} add allow gre from any to any Если на машине работает NAT, и после настройки правила мы не можем подключиться по VPN ИЗ локальной сети (например, если у вас в сети кто-то подключается по VPN к чужой сети) – ставим правило после(!) правила NAT или играемся с net.inet.ip.fw.one_pass

Всё. Запускаемся.

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

Смотрим что всё ок:

# sockstat | grep mpd
root     mpd5       45856 3  dgram  -> /var/run/logpriv
root     mpd5       45856 16 tcp4   127.0.0.1:5005        *:*
root     mpd5       45856 19 tcp4   *:5006                *:*
root     mpd5       45856 23 tcp4   134.54.35.66:1723    *:*

Последняя строка говорит о том что mpd5 принимает на внешнем интерфейсе, если её нет – смотрим ошибки.

Настроить логирование можно в конфиге syslog. Правим syslog.conf

# touch /var/log/all.log and chmod it to mode 600 before it will work
*.*                                             /var/log/all.log

Делаем:

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

Перезапускаем:

/etc/rc.d/syslogd reload

Теперь важные замечания.
Mpd5 не работает на FreeBSD 8.0 – там есть проблемы с proxy-arp. Картина такая, подключаемся – всё ок. Но пинг до любых машин локальной сети не проходит. Можно только пинговать айпи виртуального интерфейса, и адрес внутреннего интерфейса шлюза.
Я подозреваю что вести себя подобным образом будут большинство аналогичных реализаций VPN – по крайней мере poptop работал так же.

#ifconfig | grep ng0
ng0: flags=88d1<UP,POINTOPOINT,RUNNING,NOARP,SIMPLEX,MULTICAST> metric 0 mtu 1396
        inet 172.16.5.1 --> 172.16.5.34 netmask 0xffffffff

Пробуем с любой машины пинговать удалённую машину с Ip 172.16.5.34

PING 172.16.5.34 (172.16.5.34): 56 data bytes
ping: sendto: Host is down
ping: sendto: Host is down
ping: sendto: Host is down
ping: sendto: Host is down

А на машине с mpd5 запускаем tcpdump:

# tcpdump -i xl0 | grep 172.16.5.6
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on xl0, link-type EN10MB (Ethernet), capture size 96 bytes
17:25:37.753913 ARP, Request who-has 172.16.5.34 tell 172.16.5.6, length 46
17:25:38.755116 ARP, Request who-has 172.16.5.34 tell 172.16.5.6, length 46

Видим проблему с арп запросами. В сети говорят что проблема именно с arp в оси. На машинах с веткой 7.Х всё ок. На FreeBSD 8.2-RELEASE – тоже.

Ни особых настроек NAT ни особых таблиц мршрутизации для нормальной работы mpd не нужно (для базового функционала который заявлен в постановке задачи).

  1. отличная статья,спасибо, один вопрос только, mpd5 будет работать только при условии что есть два сетевых интерфейса? на одном работать не будет?

  2. admin:

    А это вопрос топологии. Смотря чего хотите добиться и – надо пробовать. :)