Как быстро настроить 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 не нужно (для базового функционала который заявлен в постановке задачи).
отличная статья,спасибо, один вопрос только, mpd5 будет работать только при условии что есть два сетевых интерфейса? на одном работать не будет?
А это вопрос топологии. Смотря чего хотите добиться и – надо пробовать. :)