Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> Security —> mpd5 + ipfw-nat

Как впустить удалённых сотрудников в локальную сеть офиса по зашифрованному каналу с помощью VPN

Автор: roygbiv.


Вопрос был давно, но тогда давно не было проблем с nat - изученная конфигурация mpd4 работала на машине, где на 1ой сетевой сервера с помощью следовавшего за ним маршрутизатора было уже два адреса - и внешний, и внутренний, а внутренняя сеть была 192.168.0.0/16 - и выдавать диапазоны подсетей было легко и непринуждённо.

Статья расписана почти для новичков, чтобы было максимально ясно, что и как делается - разжёвано и почти проглочено в помощь начинающим.

На новой работе встал вопрос: как сделать так красиво, чтобы в существующей сети 192.168.0.0/24 без смены (даже через легчайшую автоматизацию с помощью dhcp перераздачи адресов) вещания, можно было впускать извне по VPN клиентов, которые бы варились в небольшом поддиапазоне внутри 192.168.0.0/24, например, 192.168.0.248/29 (192.168.0.249-254 адреса,нам много не надо) и видели внутренние ресурсы, как если бы они физически были за своими рабочими компами в офисе, и могли при этом ещё в тырнет при подключённом ppp ходить с удалённых Windows-машин за счёт того же сервера, где крутится mpd5.

По-простому: сижу я, значит, наглухо в командировке, пиво всё кончилось, за новым идти лень, а захотелось стащить с корпоративной файлопомойки, что в другом городе, забавные конфиденциальные отчёты. При этом, хочется нормально поискать по сетке, ftp-шника для внешних клиентов нету вовсе, а у меня здесь канал вроде не узкий и Win ХтьPфу стоит: так вот, создаю я, значит, обычное VPN-подключение через существующий канал в мир и попадаю сразу в свою локалку, как родной, да ещё могу при этом лазать в тырнет, не отключаясь.

В довесок, уже вышел MPD5 - Multi-link PPP daemon for FreeBSD (отличается слегка от mpd4), а у меня к тому же стояла FreeBSD7.0 с ядром amd64 (i386 в данном случае тоже безусловно подойдёт - никаких завязок на архитектуру нет, но всё же я затрону ещё и пересборку ядра), где, как и во всей новой ветке FreeBSD7.0 RELEASE natd отмер, и его роли переложили в том числе и на мой любимый IPFW2: опция в нём так и назвалась - nat. 64битная архитектура мне понадобилась чтобы без головной боли "увидеть" 8ГБ оперативы, да и пора уже перелезать на модные течения, что мы, рыжие что ли?! Года два назад в 64битной ветке было очень много проблем и половина пакетов даже просто не собирались. Сейчас это не так, и поверьте моему опыту, ВСЕ самые джентельменские и не очень пакеты и связки пока поднимались, тьфу-тьфу, без проблем. Так что, велкам: задействуем никому не нужные 64битные инструкции ядер (производительность по различным мнениям не возросла ни на йоту)!

Рабочих конфигов для такого извращенского подхода, как описал выше, не нашёл, хотя искал довольно усердно. Хотелось красиво и как душа лежит, а не расширять класс сети и делать в общем-то, по-человечески.

Итак, что имеем: обычный ibm-сервер, с Xeon с поддержкой emt64 или как её там - неважно, главное, на amd64 возможностях с ядром сойдутся, 8ГБ невидимой в i386 ОЗУ и дистрибутив 7.0-RELEASE-amd64-disc1.iso, а остальное от лукавого.

Про установку системы ничего особенного, да и на этом сайте есть чего почитать.
Но порты я не ставлю сразу, а подтягиваю потом, на первой рабочей загрузке после установки - чтобы совсем fresh и hot были:
# portsnap fetch extract

Задымилось, жду счастья и сразу ставлю любимый demos commander (простейшую оболочку):
# whereis deco
deco: /usr/ports/misc/deco
# cd /usr/ports/misc/deco ; make install clean
# rehash && deco

(*рэхэш, то есть переиндексирование системных ссылок и прочего, работает только под определёнными интерпретаторами)
Кому как, а мне порой через него сидеть удобней, хотя и есть некоторое кол-во различий в командах по сравнению с обычной командной строкой /sbin/sh - то тже самый rehash в deco не пашет.
Далее, лезу в sys и ищу там amd64 GENERIC ядро (на самом деле, я это делаю в деке, но аналогичные действия привожу из /sbin/sh):
# cd sys/amd64/conf
# cp GENERIC VPNGOD

VPNGOD - так будет называться новое ядро с поддержкой NETGRAPH (необходима для MPD).
По сути, мы можем вообще не трогать ядро, только если для расширения адресации (задействования наших 8ГБ ОЗУ), т.к. и ipfw2 и netgraph могут быть включены как подключаемые при загрузке модули системы, но это не есть правильно, т.к. всё-таки у нас машина будет заниматься именно тем, что мы встраиваем - а не время от времени служить каким-нибудь mail-relay. Да и помнится мне, что вкомпиленное в ядро работает быстрее - но не уверен.
Состав моего нового ядра с помощью:
# ee VPNGOD

я сделал таким:
# cat VPNGOD

cpu             HAMMER
ident           VPNGOD                  # название ядра - любое

# To statically compile in device wiring instead of /boot/device.hints
#hints          "GENERIC.hints"         # Default places to look for devices.

makeoptions     DEBUG=-g        # Build kernel with gdb(1) debug symbols

options         SCHED_ULE               # 4BSD scheduler
options         PREEMPTION              # Enable kernel thread preemption
options         INET                    # InterNETworking
#options        INET6                   # IPv6 communications protocols
#не собиралось с ним, присутствуют зависимости.
#отключил - завязка на ipv6, который мне вдругорядь не нужен.

#options        SCTP                    # Stream Control Transmission Protocol

options         FFS                     # Berkeley Fast Filesystem
options         SOFTUPDATES             # Enable FFS soft updates support
options         UFS_ACL                 # Support for access control lists
options         UFS_DIRHASH      # Improve performance on big directories
options         UFS_GJOURNAL            # Enable gjournal-based UFS journaling

# лишнее
#options        MD_ROOT                 # MD is a potential root device
#options        NFSCLIENT               # Network Filesystem Client
#options        NFSSERVER               # Network Filesystem Server
#options        NFS_ROOT                # NFS usable as /, requires NFSCLIENT

options         NTFS                    # NT File System
options         MSDOSFS                 # MSDOS Filesystem
options         CD9660                  # ISO 9660 Filesystem
options         PROCFS          # Process filesystem (requires PSEUDOFS)
options         PSEUDOFS                # Pseudo-filesystem framework
options         GEOM_PART_GPT           # GUID Partition Tables.
options         GEOM_LABEL              # Provides labelization
options         COMPAT_43TTY            # BSD 4.3 TTY compat [KEEP THIS!]
options         COMPAT_IA32             # Compatible with i386 binaries
options         COMPAT_FREEBSD4         # Compatible with FreeBSD4
options         COMPAT_FREEBSD5         # Compatible with FreeBSD5
options         COMPAT_FREEBSD6         # Compatible with FreeBSD6
#options        SCSI_DELAY=5000         # Delay (in ms) before probing SCSI
#options        KTRACE                  # ktrace(1) support
options         SYSVSHM                 # SYSV-style shared memory
options         SYSVMSG                 # SYSV-style message queues
options         SYSVSEM                 # SYSV-style semaphores
options  _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions
options         KBD_INSTALL_CDEV        # install a CDEV entry in /dev
options         ADAPTIVE_GIANT          # Giant mutex is adaptive.
options         STOP_NMI                # Stop CPUS using NMI instead of IPI
options         AUDIT                   # Security event auditing

# собственно, почти ради чего собираем - опции для IPFW и MPD (через NETGRAPH)
# объяснений опять же можно найти хотя бы даже на этом сайте Лиса.
options         IPFIREWALL              # firewall
options         IPFIREWALL_VERBOSE      # enable logging to syslogd(8)
options         IPDIVERT
options         IPFIREWALL_FORWARD
options         DUMMYNET

# та самая новая поддержка трансляции
options         IPFIREWALL_NAT          # ipfw kernel nat support

options         LIBALIAS
options         NETGRAPH
options         NETGRAPH_ETHER
options         NETGRAPH_SOCKET
options         NETGRAPH_TEE
options         NETGRAPH_MPPC_ENCRYPTION

#options NETGRAPH_MPPC_COMPRESSION
#требуется наличие дополнительной проприетарной библиотеки,мне не нужно

# Make an SMP-capable kernel by default (поддержка многоядерности по умолчанию)
options         SMP                     # Symmetric MultiProcessor Kernel

# CPU frequency control
device          cpufreq

# Bus support.
device          acpi
device          pci

# Floppy drives
#device         fdc - у меня нет такого раритета

# остальные устройства лучше не удалять, а закомментировать на 
# случай изменений в железе потом легче будет найти. 
# Искать железо стоит вначале при помощи команды dmesg -a, когда
# у вас ещё GENERIC ядро - оно почти всё определяет без проблем,
# и по нему оставлять незакомментированные строки для 
# поддержки устройств. У меня получилось вот так:

# ATA and ATAPI devices
device          ata
device          atadisk         # ATA disk drives
device          ataraid         # ATA RAID drives
device          atapicd         # ATAPI CDROM drives
#device         atapifd         # ATAPI floppy drives
#device         atapist         # ATAPI tape drives
#options         ATA_STATIC_ID   # Static device numbering

# SCSI Controllers
#device         ahc             # AHA2940 and onboard AIC7xxx devices
#options        AHC_REG_PRETTY_PRINT    # Print register bitfields in debug
                                        # output.  Adds ~128k to driver.
#device         ahd             # AHA39320/29320 and onboard AIC79xx devices
#options        AHD_REG_PRETTY_PRINT    # Print register bitfields in debug
                                        # output.  Adds ~215k to driver.
#device         amd             # AMD 53C974 (Tekram DC-390(T))
#device         hptiop          # Highpoint RocketRaid 3xxx series
#device         isp             # Qlogic family
#device         ispfw           # Firmware for QLogic HBAs- normally a module
#device         mpt             # LSI-Logic MPT-Fusion
#device         ncr             # NCR/Symbios Logic
#device         sym      # NCR/Symbios Logic (newer chipsets + those of `ncr')
#device         trm             # Tekram DC395U/UW/F DC315U adapters

#device         adv             # Advansys SCSI adapters
#device         adw             # Advansys wide SCSI adapters
#device         aic             # Adaptec 15[012]x SCSI adapters, AIC-6[23]60.
#device         bt              # Buslogic/Mylex MultiMaster SCSI adapters

# SCSI peripherals
device          scbus           # SCSI bus (required for SCSI)
#device         ch              # SCSI media changers
#device         da              # Direct Access (disks)
#device         sa              # Sequential Access (tape etc)
#device         cd              # CD
#device         pass            # Passthrough device (direct SCSI access)
#device         ses             # SCSI Environmental Services (and SAF-TE)

# RAID controllers interfaced to the SCSI subsystem
#device         amr             # AMI MegaRAID
#device         arcmsr          # Areca SATA II RAID
#device         ciss            # Compaq Smart RAID 5*
#device         dpt       # DPT Smartcache III, IV - See NOTES for options
#device         hptmv           # Highpoint RocketRAID 182x
device          hptrr           # Highpoint RocketRAID 17xx, 22xx, 23xx, 25xx
#device         iir             # Intel Integrated RAID
#device         ips             # IBM (Adaptec) ServeRAID
#device         mly             # Mylex AcceleRAID/eXtremeRAID
#device         twa             # 3ware 9000 series PATA/SATA RAID

# RAID controllers
device          aac             # Adaptec FSA RAID
device          aacp            # SCSI passthrough for aac (requires CAM)
#device         ida             # Compaq Smart RAID
#device         mfi             # LSI MegaRAID SAS
#device         mlx             # Mylex DAC960 family
#XXX pointer/int warnings
#device         pst             # Promise Supertrak SX6000
#device         twe             # 3ware ATA RAID

# atkbdc0 controls both the keyboard and the PS/2 mouse
device          atkbdc          # AT keyboard controller
device          atkbd           # AT keyboard
device          psm             # PS/2 mouse

device          kbdmux          # keyboard multiplexer

device          vga             # VGA video card driver

device          splash          # Splash screen and screen saver support

# syscons is the default console driver, resembling an SCO console
device          sc

device          agp             # support several AGP chipsets

# PCCARD (PCMCIA) support
# PCMCIA and cardbus bridge support
#device         cbb             # cardbus (yenta) bridge
#device         pccard          # PC Card (16-bit) bus
#device         cardbus         # CardBus (32-bit) bus

# Serial (COM) ports
#device         sio             # 8250, 16[45]50 based serial ports
#device         uart            # Generic UART driver

# Parallel port
#device         ppc
#device         ppbus           # Parallel port bus (required)
#device         lpt             # Printer
#device         plip            # TCP/IP over parallel
#device         ppi             # Parallel port interface device
#device         vpo             # Requires scbus and da

# If you've got a "dumb" serial or parallel PCI card that is
# supported by the puc(4) glue driver, uncomment the following
# line to enable it (connects to sio, uart and/or ppc drivers):
#device         puc

# PCI Ethernet NICs.
#device         de              # DEC/Intel DC21x4x (``Tulip'')
#device         em              # Intel PRO/1000 adapter Gigabit Ethernet Card
#device         ixgb            # Intel PRO/10GbE Ethernet Card
#device         le              # AMD Am7900 LANCE and Am79C9xx PCnet
#device         txp             # 3Com 3cR990 (``Typhoon'')
#device         vx              # 3Com 3c590, 3c595 (``Vortex'')

# PCI Ethernet NICs that use the common MII bus controller code.
# NOTE: Be sure to keep the 'device miibus' line in order to use these NICs!
device          miibus          # MII bus support
device          bce             # Broadcom BCM5706/BCM5708 Gigabit Ethernet
#device         bfe             # Broadcom BCM440x 10/100 Ethernet
#device         bge             # Broadcom BCM570xx Gigabit Ethernet
#device         dc              # DEC/Intel 21143 and various workalikes
#device         fxp             # Intel EtherExpress PRO/100B (82557, 82558)
#device         lge             # Level 1 LXT1001 gigabit Ethernet
#device         msk             # Marvell/SysKonnect Yukon II Gigabit Ethernet
#device         nfe             # nVidia nForce MCP on-board Ethernet
#device         nge             # NatSemi DP83820 gigabit Ethernet
#device         nve    # nVidia nForce MCP on-board Ethernet Networking
#device         pcn # AMD Am79C97x PCI 10/100 (precedence over 'le')
#device         re              # RealTek 8139C+/8169/8169S/8110S
#device         rl              # RealTek 8129/8139
#device         sf              # Adaptec AIC-6915 (``Starfire'')
#device         sis             # Silicon Integrated Systems SiS 900/SiS 7016
#device         sk              # SysKonnect SK-984x & SK-982x gigabit Ethernet
#device         ste             # Sundance ST201 (D-Link DFE-550TX)
#device         ti              # Alteon Networks Tigon I/II gigabit Ethernet
#device         tl              # Texas Instruments ThunderLAN
#device         tx              # SMC EtherPower II (83c170 ``EPIC'')
#device         vge             # VIA VT612x gigabit Ethernet
#device         vr              # VIA Rhine, Rhine II
#device         wb              # Winbond W89C840F
#device         xl              # 3Com 3c90x (``Boomerang'', ``Cyclone'')


# Wireless NIC cards
device          wlan            # 802.11 support
device          wlan_wep        # 802.11 WEP support
device          wlan_ccmp       # 802.11 CCMP support
device          wlan_tkip       # 802.11 TKIP support
device          wlan_amrr       # AMRR transmit rate control algorithm
device          wlan_scan_ap    # 802.11 AP mode scanning
device          wlan_scan_sta   # 802.11 STA mode scanning
#device         an              # Aironet 4500/4800 802.11 wireless NICs.
device          ath             # Atheros pci/cardbus NIC's
device          ath_hal         # Atheros HAL (Hardware Access Layer)
device          ath_rate_sample # SampleRate tx rate control for ath
#device         awi             # BayStack 660 and others
#device         ral             # Ralink Technology RT2500 wireless NICs.
#device         wi              # WaveLAN/Intersil/Symbol 802.11 wireless NICs.

# Pseudo devices.
device          loop            # Network loopback
device          random          # Entropy device
device          ether           # Ethernet support
device          sl              # Kernel SLIP
device          ppp             # Kernel PPP
device          tun             # Packet tunnel.
device          pty             # Pseudo-ttys (telnet etc)
#device         md              # Memory "disks"
device          gif             # IPv6 and IPv4 tunneling
#device         faith           # IPv6-to-IPv4 relaying (translation)
device          firmware        # firmware assist module

# The `bpf' device enables the Berkeley Packet Filter.
# Be aware of the administrative consequences of enabling this!
# Note that 'bpf' is required for DHCP.
device          bpf             # Berkeley packet filter

# USB support
device          uhci            # UHCI PCI->USB interface
device          ohci            # OHCI PCI->USB interface
device          ehci            # EHCI PCI->USB interface (USB 2.0)
device          usb             # USB Bus (required)
#device         udbp            # USB Double Bulk Pipe devices
device          ugen            # Generic
device          uhid            # "Human Interface Devices"
device          ukbd            # Keyboard
#device         ulpt            # Printer
device          umass           # Disks/Mass storage - Requires scbus and da
device          ums             # Mouse
#device         ural            # Ralink Technology RT2500USB wireless NICs
#device         urio            # Diamond Rio 500 MP3 player
#device         uscanner        # Scanners

Если вы не работаете в деко, проверим на всякий случай, в какой мы директории:
# pwd
/usr/src/sys/amd64

Всё так, символичный линк (symlink, symbolic link) на директорию sys = /usr/src/sys/ (он в системе по умолчанию, а создаютсяони с помощью команды
ln -s имясуществующейдиры имялинка

), так что мы там, откуда выполним следующую команду для создания каталога исходников в соответствии с вышеуказанной конфигурацией ядра:
# config VPNGOD
Kernel build directory is ../compile/VPNGOD
Don't forget to do ``make cleandepend && make depend''

Идём в:
# cd ../compile/VPNGOD
# pwd
/usr/src/sys/amd64/compile/VPNGOD

Внимание, по умолчанию правило IPFW, который мы собираемся включить, выглядит так:
65535 deny ip from any to any

Т.е. все внешние сетевые подключения обрубит после перезагрузки и закроет ваш сервер от любых притязаний, даже хозяев. Если вы за консолью, это конечно никак не повлияет, если же вы работаете удалённо, позаботьтесь об этом заранее (например, создать скрипт с
allow all from any to any

перед 65535ым правилом на первое время).
Теперь, находясь в директории сырцов нового ядра, последуем просьбе указанной выше системой (это один из двух известных мне способов пересборки ядра, я пользуюсь только им):
# make cleandepend && make depend && make -j8 -B && make install && reboot

Этим набором команд, перечисленных через операторы "&&" - последовательное выполнение одного за другим, мы сразу всё стадо зайцев скосили и при отсутствии ошибок при сборке можем расслабиться, и как говориться при установке всем известных ОС - откинуться на спинку кресла (не купили к установке?). Все эти команды задают зависимости, собирают модули, компилируют их аж в 8 потоков (-j8), но по возможности с последовательной синхронизацией (-B), устанавливают всё в /boot/kernel и перезагружают систему автоматом по окончании.
Если что, смотрите гугл или используйте make buildkernel команду (собсно,снова гугл по хэндбукам). Число потоков и параметр "-B" используйте только на мощных машинах, на слабых их вообще лучше опустить (просто make).
Новое ядро после перезагрузки поприветствует вас как-то так:
Copyright (c) 1992-2008 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
The Regents of the University of California. All rights reserved.
FreeBSD is a registered trademark of The FreeBSD Foundation.
FreeBSD 7.0-RELEASE #0: Tue May 20 09:53:05 MSD 2008
******@ns1.*******.ru:/usr/src/sys/amd64/compile/VPNGOD

Если этого не произошло, значит вы либо не подключили каких-то важных устройств (чаще всего управление питанием - новый acpi/старый apic, и контроллеры ж/д). Можно загрузиться из старого (предшествующего) ядра:
# boot /boot/kernel.old

подробнее об этом.

Иначе, всё путём, идём дальше.
Мои сетевые карты (и loopback девайс (; настроены так:
# ifconfig
bce0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=1bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,TSO4>
ether **********
inet 218.22.33.218 netmask 0xfffffff8 broadcast 218.22.33.223
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
bce1: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=1bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,TSO4>
ether **********
inet 192.168.0.2 netmask 0xffffff00 broadcast 192.168.0.255
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
inet 127.0.0.1 netmask 0xff000000

Где bce0 (218.22.33.218/29) смотрит в провайдера, а тот подглядывает во внешний мир, а bce1 (192.168.0.2/24) - в локальную корпоративную сеть.
Сервер может являться как шлюзом для ЛВС предприятия, так и просто vpn-сервером для удалённых клиентов. У меня он ещё и проксирует http-https-ftp запросы, держит сайт, статистику по snmp (cacti), а так же ftp (proftpd) с веб-мордой (proftpdadmin).
В rc.conf сетевые настройки и firewall выглядят следующим образом:
# cat /etc/rc.conf

(..опустил ненужное..)
# настройки сети
gateway_enable="YES"
defaultrouter="218.22.33.217"
hostname="vpn.bulyzhnik.ru"
ifconfig_bce0="inet 218.22.33.218  netmask 255.255.255.248"
ifconfig_bce1="inet 192.168.0.2  netmask 255.255.255.0"

# ручной маршрут, в том случае,если у вас будет 
# всё-таки другая vpn-подсеть авось да пригодится
# route_lnet="-net 10.1.1/29 218.22.33.218"
# static_routes="lnet"

# включаем фаер, включаем логгирование
firewall_enable="YES"
firewall_script="/etc/rc.fire"
firewall_logging="YES"

А скрипт фаера выглядит так:
# cat /etc/rc.fire

# Firewall rules Written by Marc Silver (marcs@draenor.org)
# http://draenor.org/ipfw # Freely distributable
# add to rc.conf: firewall_script="/etc/rc.fire"

fwcmd="/sbin/ipfw"

# Force a flushing of the current rules before we reload.
$fwcmd -f flush

        eint="bce0"
        eip="218.22.33.218"
        iip="192.168.0.2"
        iint="bce1"

        m0="255.255.0.0"
        m1="255.255.255.0"
        m2="255.255.255.248"

        n1="192.168.0.0"
        n2="218.22.33.216"
        vpn="192.168.0.248"

        # pass all through loopback device
        ${fwcmd} add pass all from any to any via lo0

        # deny other lo0
        ${fwcmd} add deny all from any to 127.0.0.0/8
        ${fwcmd} add deny all from 127.0.0.0/8 to any

        # anti-hack from outside
        ${fwcmd} add deny ip from me to any in recv bce0

        # deny netbios
        ${fwcmd} add deny ip from any 137-139 to any
        ${fwcmd} add deny ip from any to any 137-139

        # SSH for localhost allow
        ${fwcmd} add allow tcp from me 22 to any
        ${fwcmd} add allow tcp from any to me 22

        # DNS transfers to world
        ${fwcmd} add allow udp from me 53 to any
        ${fwcmd} add allow udp from any to me 53

        # DNS, NTP, SNMPx2, DNSs
        ${fwcmd} add allow udp from me to any 53,123,161
        ${fwcmd} add allow udp from any 53,123,161 to me

        #  VPN-connect - это порт для даемона MPD, 
        # на него поступают запросы на авторизацию
        ${fwcmd} add allow tcp from me 1723 to any keep-state
        # GRE for MPD5 - в этот протокол инкапсулируются все пакеты
        # установившегося соединения VPN
        ${fwcmd} add allow gre from any to any
        # VPN-LAN  - разграничение двух сеток: подсети VPN и общей LAN,
        # чтобы отдельно для каждой определять правила доступа. 
        # здесь разрешаем междусобойчик этих двух сеток
        ${fwcmd} add allow all from ${vpn}/29 to ${n1}/24{1-231,240-254}
        ${fwcmd} add allow all from ${n1}/24{1-231,240-254} to ${vpn}/29

        # PROXY - это для прозрачного прокси-сервера, 
        # на моей машине он до кучи сервисов
        ${fwcmd} add fwd ${iip},3348 tcp from ${n1}/24 to any http via ${iint}
        ${fwcmd} add fwd ${iip},3348 tcp from ${n1}/24 to any https via ${iint}
        ${fwcmd} add fwd ${iip},3348 tcp from ${n1}/24 to any ftp ${iint}

        # Allow forced local PROXY - обычная прокся
        ${fwcmd} add allow tcp from ${n1}/24 to ${iip} 3348 \
                via ${iint} keep-state
        ${fwcmd} add allow tcp from not ${n1}/24 to ${eip} \
                3348 via ${eint} keep-state

        # FTP & HTTP from this server to world - для самого сервера,
        # выход в мир - качать порты, например
        ${fwcmd} add allow tcp from me to any 20,21,80,443 keep-state
        # Passive FTP backports
        ${fwcmd} add allow tcp from me to any 49151-65535 keep-state

        # FTP & HTTP to LAN
        ${fwcmd} add allow tcp from ${oip} 20,21,80,443 to ${n1}/24 \
                 via ${iint} keep-state
        ${fwcmd} add allow tcp from ${oip} 49152-65534 to ${n1}/24 \
                 via ${iint} keep-state

        # HTTP ----------local site------------ -
        # у меня тут ещё и сайт есть на серваке (: apache)
        ${fwcmd} add allow tcp from ${eip} 80 to any keep-state

        # NATd - вот правило транслирования адресов для двух сетей разделены
        ${fwcmd} nat 123 config ip ${eip}
        ${fwcmd} add nat 123 ip from ${vpn}/29 to not ${n1}/24{1-231,240-254}
        ${fwcmd} add nat 123 ip from ${n1}/24{1-231,240-249} to any
        ${fwcmd} add nat 123 ip from any to ${eip} via ${eint}

        # далее идут правила для всех клиентов, обслуживаемых через NAT: 
        # запросы из LAN в мир

        # ICMP (echo-reply,destunreach,echo-req,time exceeded,tracert)
        ${fwcmd} add deny icmp from any to any frag
        ${fwcmd} add allow icmp from any to any icmptypes 0,3,4,8,10,11,30

        # FTP & SSH from LAN
        ${fwcmd} add allow tcp from ${n1}/24{1-231,240-254} to any \
                 20,21,22,80,443 keep-state
        # Passive FTP backports
        ${fwcmd} add allow tcp from ${n1}/24{1-231,240-254} to any 49151-65535

        # MAIL (SMTP,POP3,IMAP,IMAPs, POP3s)
        ${fwcmd} add allow tcp from ${n1}/24{1-231,240-254} to any \
                 25,110,143,993,995 keep-state

        # ICQ
        ${fwcmd} add allow tcp from ${n1}/24{1-231,240-254} to any \
                 5190 keep-state

        # internal VPN-LAN to OUT
        ${fwcmd} add allow ip from any to ${vpn}/29

        # немного шейперов канала - режу скорость
        # shapes for administry
        ${fwcmd} pipe 1005 config bw 50Mbits/s
        ${fwcmd} pipe 1006 config bw 2Mbits/s
        ${fwcmd} pipe 1007 config bw 10Mbits/s

        ${fwcmd} table 54 flush
        ${fwcmd} table 54 add 192.168.0.0/24{1-10,105,246} 1005
        ${fwcmd} table 54 add 192.168.0.0/24{11-104,106-245,246-254} 1006
        ${fwcmd} table 54 add 218.63.40/24 1007
        ${fwcmd} add pipe tablearg ip from any to 'table(54)'
        ${fwcmd} add pipe tablearg ip from 'table(54)' to any

        # shapes for users
        ${fwcmd} add pipe 5 ip from any to ${n1}/24
        ${fwcmd} add pipe 5 ip from ${n1}/24 to any
        ${fwcmd} pipe 1 config bw 2Mbits/s

        # log - всё, что не пропустилось, в лог 
        # (/var/log/security по умолчанию)
        ${fwcmd} add deny log logamount 3000 all from any to any

Это не совсем оптимизированный список правил, к тому же, перегруженный - т.к. у меня на машине не один сервис, и она служит шлюзом для локальных клиентов - пропускает, проксируя, http/ftp трафик, а остальное транслирует с помощью ipfw nat - как видно из правил, это все icmp запросы (например, ping и tracert), почту и icq. Опять же, эта конфигурация рабочая и может пригодится для многих новичков, которым всё и сразу. Для каждого двустороннего правила есть краткий заголовок, думаю, все знают англицкий и аббревиатуры протоколов и даемонов (:
Итак, мы собрались ставить свеженький MPD5 и по правилам хорошего и удобного тона из портов, конечно же, благо, они свежие и ещё не успели совсем остыть:
# whereis mpd5
/usr/ports/net/mpd5
# cd /usr/ports/net/mpd5 ; make install clean

Options for mpd 5.1
   [ ] NG_CAR     Use ng_car kernel module from port (< 7.0 only)
   [ ] NG_IPACCT  Use ng_ipacct kernel module from port 
                  [...................]
                  [  OK  ]       Cancel

Я ничего не выбирал и вам не советую, так что жмём Oll Klear и понеслась.
После добавим сразу стартовую строку для MPD в /etc/rc.conf:
# echo 'mpd_enable="YES"' >> /etc/rc.conf ; echo 'mpd_flags="-b"' >> /etc/rc.conf

цифра в версии в данном случае не имеет значения. Приведённые строки после echo добавились в конец rc.conf, можете проверить командой "cat имяфайла" или "less (либо more) имяфайла".
Займёмся теперь конфигурационным файлом нашего будущего VPN сервера:
# cd /usr/local/etc/mpd5

Именно сюда установились необходимые нам файлы, но пока только примеры - .sample расширения.
Перед тем как переименовывать файлы, сделайте их резервную копию, чтобы в случае чего можно было всегда вернуться и посмотреть как сделано в примере.
# mkdir sample
# cp *.sample sample/

Переименовать множество файлов можно следующим скриптом (из-под деко не сработает, т.к. ";" - не воспринимается, нужно записать в исполняемый файл всю строку и затем его запустить):
# for i in *.sample; do mv $i `basename $i ".sample"`; done

Я доправил свой конфиг mpd.conf до такого состояния:
# ee mpd.conf

startup:
# настройки локальных мониторов по следующим реквизитам
# (vpngod:12345) для пользователя с admin-привелегиями:
       set user vpngod 12345 admin
# можно подлючиться с консоли
       set console self 127.0.0.1 5005
       set console open
# или с веба
       set web self 192.168.0.2 5006
       set web open
default: # загружаем по умолчанию профиль vpn
        load vpn
vpn: # сам профиль
# Определяем диапазон выдаваемых удалённым клиентам алиас№ 
# (адреса виртуальных подключений)
# у меня с 249го по 254ый
        set ippool add poolsat 192.168.0.249 192.168.0.254
# Create clonable bundle template named B - эту секцию не менял
        create bundle template B
        set iface enable proxy-arp
        set iface idle 1800
        set iface enable tcpmssfix
        set ipcp yes vjcomp
# Specify IP address pool for dynamic assigment -
# здесь задаём "шлюзовой" адрес для vpn-сервера
# который обслуживает наш поддиапазон - 192.168.0.255 в моём случае,
# и не думайте, такой адрес возможен.
# вместо виртуально выдуманного 0.255 можно задать адрес 
# сетевой bce1 - 192.168.0.2.
# но в целях дополнительной конспирации я этого делать не стал.
        set ipcp ranges 192.168.0.255/32 ippool poolsat
        # внутрикорпоративные dns-сервера, могут быть и внешние
        set ipcp dns 192.168.0.2 192.168.0.3 
#       set ipcp nbns 192.168.0.1 - у меня его нет
# The five lines below enable Microsoft Point-to-Point encryption
# (MPPE) using the ng_mppc(8) netgraph node type. 
# Поддержка шифрования Microsoft для Windows-клиентов, не изменял секцию.
        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
# различные настройки для поддержания MTU в 1500 байт
        set link enable multilink
        set link yes acfcomp protocomp
# We reducing link mtu to avoid GRE packet fragmentation.
        set link mtu 1460
# запрещаем pap (никакой защиты), 
# включаем поддержку chap (хоть какое-то предвар.рукопожатие)
        set link no pap chap
        set link enable chap
# Здесь можно подключить авторизацию по RADIUS базе, мы не используем
# иначе, нужно создать ещё одну секцию 'radius' и там задать доп.параметры
#       load radius
        set link keep-alive 10 60
# Configure PPTP - это мой внешний IP адрес, 
# на котором будет слушать MPD, на приём пациентов.
        set pptp self 218.22.33.218
# Allow to accept calls - включаем входящие "звонки" (запрос на соединение)
        set link enable incoming

В MPD5 по умолчанию поддерживаются стандартные настройки внешних виндовых клиентов, то есть, после обычного мастера настроек, вам нужно только ввести имя и пароль и больше ничего - раньше приходилось отключать шифрование пакетов и/или сжатие данных в настройках подключения (WinXP SP2/2003), об этом позже.
Теперь нам необходимо задать список пар реквизитов для авторизации внешних клиентов, он может хранится в файле mpd.secret (ещё в БД, RADIUS или в самом mpd.conf - но последнее резко не рекомендую):
# cat mpd.secret
user1       qwerty
tolya       12345
akakij       $23fS7NdsE    192.168.0.253

Мы завели троих пользователей, при чём, user1 и tolya при подключении получат случайный адрес из диапазона 192.168.0.248/29, а akakij всегда будет получать адрес 192.168.0.253.
Файл mpd.script в данном случае не используется - у меня нет dial-up интерфейсов, подключение статичное.
Для того чтобы видеть все всплески настроения даемона, создадим для него лог-файл, который по умолчанию почему-то не предусмотрен в стартовом скрипте. Для этого, откроем для редактирования:
# ee /etc/syslog.conf

И добавим в конец файла:
!mpd
*.*                                             /var/log/mpd.log

Создадим соответствующий файл, зададим ему права только на чтение root'ом и перезапустим syslog:
# touch /var/log/mpd.log ; chmod 600 /var/log/mpd.log && /etc/rc.d/syslogd reload

Проверяем работоспособность даемона:
# /usr/local/etc/rc.d/mpd5 start

Создаём новое подключение на удалённом клиенте (для проверки можно и на LAN-машине):
заходим в панель управления > создаём новое подключение либо слева,либо в меню "файл" > подключить к сети на рабочем столе > наш выбор снова VPN (второе) > адрес в моём случае как на картинке > я бы для удобства поставил галку на "создать ярлык на рабочем стуле" и готово > вносим данные и подключить > подключено.
и смотрим в лог:
# cat /var/log/mpd.log
Jun 5 17:26:10 ns1 mpd: [L-1] Accepting PPTP connection
Jun 5 17:26:10 ns1 mpd: [L-1] Link: OPEN event
Jun 5 17:26:10 ns1 mpd: [L-1] LCP: Open event
Jun 5 17:26:10 ns1 mpd: [L-1] LCP: state change Initial --> Starting
Jun 5 17:26:10 ns1 mpd: [L-1] LCP: LayerStart
Jun 5 17:26:10 ns1 mpd: [L-1] PPTP: attaching to peer's outgoing call
Jun 5 17:26:10 ns1 mpd: [L-1] Link: UP event
Jun 5 17:26:10 ns1 mpd: [L-1] Link: origination is remote
Jun 5 17:26:10 ns1 mpd: [L-1] LCP: Up event
Jun 5 17:26:10 ns1 mpd: [L-1] LCP: state change Starting --> Req-Sent
Jun 5 17:26:10 ns1 mpd: [L-1] LCP: SendConfigReq #1
Jun 5 17:26:10 ns1 mpd: ACFCOMP
Jun 5 17:26:10 ns1 mpd: PROTOCOMP
Jun 5 17:26:10 ns1 mpd: MRU 1500
Jun 5 17:26:10 ns1 mpd: MAGICNUM ed4e3296
Jun 5 17:26:10 ns1 mpd: AUTHPROTO CHAP MSOFTv2
Jun 5 17:26:10 ns1 mpd: MP MRRU 1600
Jun 5 17:26:10 ns1 mpd: MP SHORTSEQ
Jun 5 17:26:10 ns1 mpd: ENDPOINTDISC [802.1] ** ** ** ** ** **
Jun 5 17:26:10 ns1 mpd: [L-1] LCP: rec'd Configure Request #0 (Req-Sent)
Jun 5 17:26:10 ns1 mpd: MRU 1400
Jun 5 17:26:10 ns1 mpd: MAGICNUM 5c74770f
Jun 5 17:26:10 ns1 mpd: PROTOCOMP
Jun 5 17:26:10 ns1 mpd: ACFCOMP
Jun 5 17:26:10 ns1 mpd: CALLBACK 6
Jun 5 17:26:10 ns1 mpd: MP MRRU 1614
Jun 5 17:26:10 ns1 mpd: ENDPOINTDISC [LOCAL] 60 6c 53 98 57 8a 40 ea b3 9f 08 31 d2 04 dc e3 00 00 0
Jun 5 17:26:10 ns1 mpd: [L-1] LCP: SendConfigRej #0
Jun 5 17:26:10 ns1 mpd: CALLBACK 6
Jun 5 17:26:10 ns1 mpd: [L-1] LCP: rec'd Configure Request #1 (Req-Sent)
Jun 5 17:26:10 ns1 mpd: MRU 1400
Jun 5 17:26:10 ns1 mpd: MAGICNUM 5c74770f
Jun 5 17:26:10 ns1 mpd: PROTOCOMP
Jun 5 17:26:10 ns1 mpd: ACFCOMP
Jun 5 17:26:10 ns1 mpd: MP MRRU 1614
Jun 5 17:26:10 ns1 mpd: ENDPOINTDISC [LOCAL] 60 6c 53 98 57 8a 40 ea b3 9f 08 31 d2 04 dc e3 00 00 0
Jun 5 17:26:10 ns1 mpd: [L-1] LCP: SendConfigNak #1
Jun 5 17:26:10 ns1 mpd: MP MRRU 1600
Jun 5 17:26:10 ns1 mpd: [L-1] LCP: rec'd Configure Request #2 (Req-Sent)
Jun 5 17:26:10 ns1 mpd: MRU 1400
Jun 5 17:26:10 ns1 mpd: MAGICNUM 5c74770f
Jun 5 17:26:10 ns1 mpd: PROTOCOMP
Jun 5 17:26:10 ns1 mpd: ACFCOMP
Jun 5 17:26:10 ns1 mpd: MP MRRU 1600
Jun 5 17:26:10 ns1 mpd: ENDPOINTDISC [LOCAL] 60 6c 53 98 57 8a 40 ea b3 9f 08 31 d2 04 dc e3 00 00 0
Jun 5 17:26:10 ns1 mpd: [L-1] LCP: SendConfigAck #2
Jun 5 17:26:10 ns1 mpd: MRU 1400
Jun 5 17:26:10 ns1 mpd: MAGICNUM 5c74770f
Jun 5 17:26:10 ns1 mpd: PROTOCOMP
Jun 5 17:26:10 ns1 mpd: ACFCOMP
Jun 5 17:26:10 ns1 mpd: MP MRRU 1600
Jun 5 17:26:10 ns1 mpd: ENDPOINTDISC [LOCAL] 60 6c 53 98 57 8a 40 ea b3 9f 08 31 d2 04 dc e3 00 00 0
Jun 5 17:26:10 ns1 mpd: [L-1] LCP: state change Req-Sent --> Ack-Sent
Jun 5 17:26:12 ns1 mpd: [L-1] LCP: SendConfigReq #2
Jun 5 17:26:12 ns1 mpd: ACFCOMP
Jun 5 17:26:12 ns1 mpd: PROTOCOMP
Jun 5 17:26:12 ns1 mpd: MRU 1500
Jun 5 17:26:12 ns1 mpd: MAGICNUM ed4e3296
Jun 5 17:26:12 ns1 mpd: AUTHPROTO CHAP MSOFTv2
Jun 5 17:26:12 ns1 mpd: MP MRRU 1600
Jun 5 17:26:12 ns1 mpd: MP SHORTSEQ
Jun 5 17:26:12 ns1 mpd: ENDPOINTDISC [802.1] ** ** ** ** ** **
Jun 5 17:26:12 ns1 mpd: [L-1] LCP: rec'd Configure Reject #2 (Ack-Sent)
Jun 5 17:26:12 ns1 mpd: MP SHORTSEQ
Jun 5 17:26:12 ns1 mpd: [L-1] LCP: SendConfigReq #3
Jun 5 17:26:12 ns1 mpd: ACFCOMP
Jun 5 17:26:12 ns1 mpd: PROTOCOMP
Jun 5 17:26:12 ns1 mpd: MRU 1500
Jun 5 17:26:12 ns1 mpd: MAGICNUM ed4e3296
Jun 5 17:26:12 ns1 mpd: AUTHPROTO CHAP MSOFTv2
Jun 5 17:26:12 ns1 mpd: MP MRRU 1600
Jun 5 17:26:12 ns1 mpd: ENDPOINTDISC [802.1] ** ** ** ** ** **
Jun 5 17:26:12 ns1 mpd: [L-1] LCP: rec'd Configure Ack #3 (Ack-Sent)
Jun 5 17:26:12 ns1 mpd: ACFCOMP
Jun 5 17:26:12 ns1 mpd: PROTOCOMP
Jun 5 17:26:12 ns1 mpd: MRU 1500
Jun 5 17:26:12 ns1 mpd: MAGICNUM ed4e3296
Jun 5 17:26:12 ns1 mpd: AUTHPROTO CHAP MSOFTv2
Jun 5 17:26:12 ns1 mpd: MP MRRU 1600
Jun 5 17:26:12 ns1 mpd: ENDPOINTDISC [802.1] ** ** ** ** ** **
Jun 5 17:26:12 ns1 mpd: [L-1] LCP: state change Ack-Sent --> Opened
Jun 5 17:26:12 ns1 mpd: [L-1] LCP: auth: peer wants nothing, I want CHAP
Jun 5 17:26:12 ns1 mpd: [L-1] CHAP: sending CHALLENGE #1 len: 21
Jun 5 17:26:12 ns1 mpd: [L-1] LCP: LayerUp
Jun 5 17:26:12 ns1 mpd: [L-1] LCP: rec'd Ident #3 (Opened)
Jun 5 17:26:12 ns1 mpd: MESG: MSRASV5.10
Jun 5 17:26:12 ns1 mpd: [L-1] LCP: rec'd Ident #4 (Opened)
Jun 5 17:26:12 ns1 mpd: MESG: MSRAS-0-KOSTIK-100
Jun 5 17:26:12 ns1 mpd: [L-1] CHAP: rec'd RESPONSE #1 len: 61
Jun 5 17:26:12 ns1 mpd: Name: "usat001"
Jun 5 17:26:12 ns1 mpd: [L-1] AUTH: Trying INTERNAL
Jun 5 17:26:12 ns1 mpd: [L-1] AUTH: INTERNAL returned undefined
Jun 5 17:26:12 ns1 mpd: [L-1] CHAP: Auth return status: undefined
Jun 5 17:26:12 ns1 mpd: Response is valid
Jun 5 17:26:12 ns1 mpd: Reply message: S=566AEC3499DA1DE852DFFDA963054A2FA4D64747
Jun 5 17:26:12 ns1 mpd: [L-1] CHAP: sending SUCCESS #1 len: 46
Jun 5 17:26:12 ns1 mpd: [L-1] LCP: authorization successful
Jun 5 17:26:12 ns1 mpd: [L-1] Link: Matched action 'bundle "B" ""'
Jun 5 17:26:12 ns1 mpd: [L-1] Creating new bundle using template "B".
Jun 5 17:26:12 ns1 mpd: [B-1] Bundle: Interface ng0 created
Jun 5 17:26:12 ns1 mpd: [B-1] Bundle: Status update: up 1 link, total bandwidth 64000 bps
Jun 5 17:26:12 ns1 mpd: [B-1] IPCP: Open event
Jun 5 17:26:12 ns1 mpd: [B-1] IPCP: state change Initial --> Starting
Jun 5 17:26:12 ns1 mpd: [B-1] IPCP: LayerStart
Jun 5 17:26:12 ns1 mpd: [B-1] CCP: Open event
Jun 5 17:26:12 ns1 mpd: [B-1] CCP: state change Initial --> Starting
Jun 5 17:26:12 ns1 mpd: [B-1] CCP: LayerStart
Jun 5 17:26:12 ns1 mpd: [B-1] IPCP: Up event
Jun 5 17:26:12 ns1 mpd: [B-1] IPCP: Got IP 192.168.0.251 from pool "poolsat"
Jun 5 17:26:12 ns1 mpd: [B-1] IPCP: state change Starting --> Req-Sent
Jun 5 17:26:12 ns1 mpd: [B-1] IPCP: SendConfigReq #1
Jun 5 17:26:12 ns1 mpd: IPADDR 192.168.0.255
Jun 5 17:26:12 ns1 mpd: COMPPROTO VJCOMP, 16 comp. channels, no comp-cid
Jun 5 17:26:12 ns1 mpd: [B-1] CCP: Up event
Jun 5 17:26:12 ns1 mpd: [B-1] CCP: state change Starting --> Req-Sent
Jun 5 17:26:12 ns1 mpd: [B-1] CCP: SendConfigReq #1
Jun 5 17:26:12 ns1 mpd: MPPC
Jun 5 17:26:12 ns1 mpd: 0x01000060:MPPE(40, 128 bits), stateless
Jun 5 17:26:12 ns1 mpd: [B-1] CCP: rec'd Configure Request #5 (Req-Sent)
Jun 5 17:26:12 ns1 mpd: MPPC
Jun 5 17:26:12 ns1 mpd: 0x010000e1:MPPC, MPPE(40, 56, 128 bits), stateless
Jun 5 17:26:12 ns1 mpd: [B-1] CCP: SendConfigNak #5
Jun 5 17:26:12 ns1 mpd: MPPC
Jun 5 17:26:12 ns1 mpd: 0x01000040:MPPE(128 bits), stateless
Jun 5 17:26:12 ns1 mpd: [B-1] IPCP: rec'd Configure Request #6 (Req-Sent)
Jun 5 17:26:12 ns1 mpd: IPADDR 0.0.0.0
Jun 5 17:26:12 ns1 mpd: NAKing with 192.168.0.251
Jun 5 17:26:12 ns1 mpd: PRIDNS 0.0.0.0
Jun 5 17:26:12 ns1 mpd: NAKing with 192.168.0.3
Jun 5 17:26:12 ns1 mpd: PRINBNS 0.0.0.0
Jun 5 17:26:12 ns1 mpd: SECDNS 0.0.0.0
Jun 5 17:26:12 ns1 mpd: NAKing with 192.168.0.2
Jun 5 17:26:12 ns1 mpd: SECNBNS 0.0.0.0
Jun 5 17:26:12 ns1 mpd: [B-1] IPCP: SendConfigRej #6
Jun 5 17:26:12 ns1 mpd: PRINBNS 0.0.0.0
Jun 5 17:26:12 ns1 mpd: SECNBNS 0.0.0.0
Jun 5 17:26:12 ns1 mpd: [B-1] IPCP: rec'd Configure Reject #1 (Req-Sent)
Jun 5 17:26:12 ns1 mpd: COMPPROTO VJCOMP, 16 comp. channels, no comp-cid
Jun 5 17:26:12 ns1 mpd: [B-1] IPCP: SendConfigReq #2
Jun 5 17:26:12 ns1 mpd: IPADDR 192.168.0.255
Jun 5 17:26:12 ns1 mpd: [B-1] CCP: rec'd Configure Nak #1 (Req-Sent)
Jun 5 17:26:12 ns1 mpd: MPPC
Jun 5 17:26:12 ns1 mpd: 0x01000040:MPPE(128 bits), stateless
Jun 5 17:26:12 ns1 mpd: [B-1] CCP: SendConfigReq #2
Jun 5 17:26:12 ns1 mpd: MPPC
Jun 5 17:26:12 ns1 mpd: 0x01000040:MPPE(128 bits), stateless
Jun 5 17:26:12 ns1 mpd: [B-1] CCP: rec'd Configure Request #7 (Req-Sent)
Jun 5 17:26:12 ns1 mpd: MPPC
Jun 5 17:26:12 ns1 mpd: 0x01000040:MPPE(128 bits), stateless
Jun 5 17:26:12 ns1 mpd: [B-1] CCP: SendConfigAck #7
Jun 5 17:26:12 ns1 mpd: MPPC
Jun 5 17:26:12 ns1 mpd: 0x01000040:MPPE(128 bits), stateless
Jun 5 17:26:12 ns1 mpd: [B-1] CCP: state change Req-Sent --> Ack-Sent
Jun 5 17:26:12 ns1 mpd: [B-1] IPCP: rec'd Configure Request #8 (Req-Sent)
Jun 5 17:26:12 ns1 mpd: IPADDR 0.0.0.0
Jun 5 17:26:12 ns1 mpd: NAKing with 192.168.0.251
Jun 5 17:26:12 ns1 mpd: PRIDNS 0.0.0.0
Jun 5 17:26:12 ns1 mpd: NAKing with 192.168.0.3
Jun 5 17:26:12 ns1 mpd: SECDNS 0.0.0.0
Jun 5 17:26:12 ns1 mpd: NAKing with 192.168.0.2
Jun 5 17:26:12 ns1 mpd: [B-1] IPCP: SendConfigNak #8
Jun 5 17:26:12 ns1 mpd: IPADDR 192.168.0.251
Jun 5 17:26:12 ns1 mpd: PRIDNS 192.168.0.3
Jun 5 17:26:12 ns1 mpd: SECDNS 192.168.0.2
Jun 5 17:26:12 ns1 mpd: [B-1] IPCP: rec'd Configure Ack #2 (Req-Sent)
Jun 5 17:26:12 ns1 mpd: IPADDR 192.168.0.255
Jun 5 17:26:12 ns1 mpd: [B-1] IPCP: state change Req-Sent --> Ack-Rcvd
Jun 5 17:26:12 ns1 mpd: [B-1] CCP: rec'd Configure Ack #2 (Ack-Sent)
Jun 5 17:26:12 ns1 mpd: MPPC
Jun 5 17:26:12 ns1 mpd: 0x01000040:MPPE(128 bits), stateless
Jun 5 17:26:12 ns1 mpd: [B-1] CCP: state change Ack-Sent --> Opened
Jun 5 17:26:12 ns1 mpd: [B-1] CCP: LayerUp
Jun 5 17:26:12 ns1 mpd: Compress using: mppc (MPPE(128 bits), stateless)
Jun 5 17:26:12 ns1 mpd: Decompress using: mppc (MPPE(128 bits), stateless)
Jun 5 17:26:12 ns1 mpd: [B-1] IPCP: rec'd Configure Request #9 (Ack-Rcvd)
Jun 5 17:26:12 ns1 mpd: IPADDR 192.168.0.251
Jun 5 17:26:12 ns1 mpd: 192.168.0.251 is OK
Jun 5 17:26:12 ns1 mpd: PRIDNS 192.168.0.3
Jun 5 17:26:12 ns1 mpd: SECDNS 192.168.0.2
Jun 5 17:26:12 ns1 mpd: [B-1] IPCP: SendConfigAck #9
Jun 5 17:26:12 ns1 mpd: IPADDR 192.168.0.251
Jun 5 17:26:12 ns1 mpd: PRIDNS 192.168.0.3
Jun 5 17:26:12 ns1 mpd: SECDNS 192.168.0.2
Jun 5 17:26:12 ns1 mpd: [B-1] IPCP: state change Ack-Rcvd --> Opened
Jun 5 17:26:12 ns1 mpd: [B-1] IPCP: LayerUp
Jun 5 17:26:12 ns1 mpd: 192.168.0.255 -> 192.168.0.251
Jun 5 17:26:12 ns1 mpd: [B-1] IFACE: Up event

При этом в ifconfig появился (до mpd5 все виртуальные интерфейсы висели со старта даемона) новый виртуальный interface:
ng0: flags=88d1<UP,POINTOPOINT,RUNNING,NOARP,SIMPLEX,MULTICAST> 
metric 0 mtu 1500 inet 192.168.0.255 --> 192.168.0.251 netmask 0xffffffff

Заходим из браузера по адресу http://218.22.33.218:5006 (логин:пароль из mpd.conf - vpngod:12345):
Multi-link PPP Daemon for FreeBSD
Current status summary
Bund	Iface	IPCP	IPV6CP	CCP	ECP	Link	LCP	User	Device	Peer		
  	L 	Initial 		pptp 	DOWN 			
B 		Down 	Initial 	Initial 	Initial 	Initial 	 
B-1 	ng0 	Up 	Opened 	Initial 	Opened 	Initial 	L-1 	>
>Opened 	tolya 	pptp 	UP 	*.*.*.* 		<=		[Open][Close]

Чтобы зайти с консоли сервера (на localhost=127.0.0.1), задействуем telnet с теми же реквизитами (vpngod:12345):
# telnet 127.0.0.1 5005
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Multi-link PPP daemon for FreeBSD

Username: vpngod
Password:

Welcome!
Mpd pid 98350, version 5.0 (root@*******.ru 12:50 12-Apr-2008)
[] ?
Available commands:
bundle : Choose/list bundles close : Close a layer
create : Create new item destroy : Destroy item
exit : Exit console iface : Choose bundle by iface
help : Help on any command link : Choose link
load : Read from config file log : Set/view log options
msession : Ch. bundle by msession-id open : Open a layer
quit : Quit program repeater : Choose/list repeaters
session : Choose link by session-id set : Set parameters
show : Show status
[]

Надо отметить, что через консольные команды доступно очень немало действий, просмотрите хотя бы самостоятельно команду show.
В случае, если у вас не указан чёткий адрес для логина, то по этому логину можно подключаться со стольки клиентов (windows-машин,например), сколько адресов у вас в подсети выделенной для VPN, т.е.:
ng0: flags=88d1<UP,POINTOPOINT,RUNNING,NOARP,SIMPLEX,MULTICAST>
metric 0 mtu 1500
inet 192.168.0.255 --> 192.168.0.251 netmask 0xffffffff
ng1: flags=88d1<UP,POINTOPOINT,RUNNING,NOARP,SIMPLEX,MULTICAST>
metric 0 mtu 1396
inet 192.168.0.255 --> 192.168.0.253 netmask 0xffffffff

это я зашёл с двух разных PC по одним и тем же реквизитам - разные vpn-адреса.
Если что не так, смотрите логи, ошибки windows-клиентов и ещё пользуйтесь tcpdump (встроена в FreeBSD) и например, trafshow:
# whereis trafshow
trafshow: /usr/ports/net/trafshow
# cd /usr/ports/net/trafshow; make install clean ; rehash ; trafshow

Interface         Address         Description

bce0              **:**:**:**:**:** 218.22.33.218                      Ethernet
ng0               192.168.0.255                                       Loopback
bce1              **:**:**:**:**:** 192.168.0.2                        Ethernet
ng1               192.168.0.255                                       Loopback
lo0               127.0.0.1                                           Loopback

далее, выбираем курсорами сетевую и жмём энтер - вы увидите все текущие соединения и потоки в кбит/с и суммарным траффиком.

Вроде всё (:



размещено: 2008-05-31,
последнее обновление: 2011-11-14,
автор: roygbiv


corky, 2008-06-09 в 3:12:40

спасибо автору! по другому чуток, но в целом описанные в статье опции ускорили процесс настройки mpd5 pptp client + kernel nat на 2 интерфейса для подключения внутренней сетки к инету провайдера

RapteR, 2008-06-09 в 9:26:03

Все классно и замечательно работает, автору благодарность. Вопрос такой: клиент конектиться и получает адресс 192.168.100.11 а адрес сервера почему то остается как в локальной сети 192.168.1.253. Какой опцией задается "Адрес сервера"?

Foblas, 2008-06-10 в 3:41:45

Афтору плюсик, но таких статей навалом по инету. Если бы рассказали как прикрутить к mpd радиус с каким нибудь работающим биллингом чтобы с пользователей статистику снимать/блочить/ограничивать по времени/траффику было бы гораздо-гораздее.

RapteR, 2008-06-10 в 9:56:35

Foblas - собственно этим сейчас на работе и занимаюсь, как даделаю запостю статью.

roygbiv, 2008-06-10 в 13:49:21

Rapter,
# Specify IP address pool for dynamic assigment - здесь задаём "шлюзовой" адрес для vpn-сервера
# который обслуживает наш поддиапазон - 192.168.0.255 в моём случае, и не думайте, такой адрес возможен.
# вместо виртуально выдуманного 0.255 можно задать адрес сетевой bce1 - 192.168.0.2.
# но в целях дополнительной конспирации я этого делать не стал.
       set ipcp ranges 192.168.0.255/32 ippool poolsat
Т.е. 192.168.0.255 (вещание 255.255.255.255 = /32 префикс) - здесь адрес сервера для уже подключённых по vpn-клиентов, его можно выставить практически любой.

RapteR, 2008-06-10 в 13:55:43

set ipcp ranges в моем понимании это дефайлт рутер. на ип сервера это не влияет.

roygbiv, 2008-06-10 в 14:05:09

Foblas, цель не просто описать банальную установку, а полное решение - то есть от начала и до конца провести по всем этапам. Для 5го mpd я честно ничего не нашёл месяц назад, а в связке с ipfw-nat тем более. Решил в общем-то простую проблему, но решил поделиться - мне таких описаний очень не хватало 2 года назад. Фактически, это готовое решение.
С radius это гуд, тоже поглядел бы - а то всё никак руки не дойдут до биллинга (не очень нужен пока), хотя с радиусом mpd4 в прошлом году скрутил по очень хорошему ману на opennet. А netams никак? Его с netflow хорошо вязать.
Вообще, ребят, делитесь инфой, это ж благо (:

Foblas, 2008-06-12 в 20:01:49

RapteR аналогично =) Искал-гугли, пару находил решений древних, но ниодно не заработало как надо. Сейчас думаю попробовать с abills разобраться.

Кстати, может кто подскажет каким образом на один и тот же интерфейс ngX вешать один и тот же ip при подключении пользователя?

Foblas, 2008-06-12 в 20:03:23

Сорри, roygbiv, прошлый пост был адресован тебе

paradox, 2008-06-13 в 1:19:31

>Foblas
зачем вешать на один и тот же ngX
помоему вы в чем то неразобрались

Foblas, 2008-06-13 в 3:21:04

а чтобы для каждого пользователя общий траффик считать

paradox, 2008-06-13 в 12:14:20

ну вы меня теперь точно добили
а радиус для чего?
и причем тут один и тот же ip на один интерфейс
неее
я вам советую очень хорошо изучить mpd
и саму систему

Foblas, 2008-06-13 в 18:11:55

Да без радиуса у меня сделано.
Был ба радиус с биллингом, эти глупые идею автоматически бы отпали за ненадобностью.

paradox, 2008-06-13 в 20:03:42

ну так поставте радиус
в чем проблема
либо если радиус ненравиться
есть up/down скрипты в mpd
по которым тоже можно считать
а то придумываете всякое...

dovidov, 2008-06-28 в 17:41:36

попробовал mpd5, для юзеров у которых явно не прописан ip вылетает ошибка "сервер не назначил адрес" и соответственно дисконнект, в логах mpd не обнаружил "Got IP ххх.ххх.ххх.ххх from pool "pool1""

RapteR, 2008-06-28 в 18:41:49

по идеи за это отвечает:
set ippool add poolsat 192.168.0.249 192.168.0.254

допускаю конечно что такой косяк имеет место быть, в понедельник проверю у себя с динамической выдачей.

dovidov, 2008-06-30 в 11:03:21

в данной статье в логах видна динамическая выдача "Got IP 192.168.0.251 from pool "poolsat"", но у меня (с практически аналогичными настройками mpd.conf) выдача не происходит... mpd-5.0.b1, FreeBSD-7.0-RELEASE, amd64...

dovidov, 2008-06-30 в 19:50:13

есть ещё один нюанс, если в юзерских настройках впн подключения задать ip-адрес, то ему назначится именно указанный им адрес, а нето что указан в mpd.secret, что тоже не есть хорошо...

RapteR, 2008-07-01 в 6:01:59

dovidov - это обман. У меня mpd5 радостно сообщает, что ip отвергнут.

dovidov, 2008-07-01 в 10:21:27

виноват... прописал ip на пользователя у которого не был указан ip в mpd.secret, для тех у кого указан, отвергает.

Nordy, 2008-09-18 в 10:53:21

Автор либо чайник либо раздолбай
при таких правилах его сайт увидят только внутри сети, да и то сомневаюсь.
# HTTP ----------local site----------— -
# у меня тут ещё и сайт есть на серваке (: apache)
${fwcmd} add allow tcp from ${eip} 80 to any keep-state
Должно быть
${fwcmd} add allow tcp from any to ${eip} 80 keep-state
а еще лучше
${fwcmd} add allow tcp from any to me 80 keep-state

lissyara, 2008-09-18 в 11:15:30

Автор и не писал что это внешний сайт.
И для кого сайт - тоже не писал.
Вполне может быть чисто внутренний сайт.

Nordy, 2008-09-18 в 15:17:52

Внутренний сайт на внешнем интерфейсе? верх извращений..
судя по этому правилу сайт САМ отдает контент клиентам направо и налево... какие уж там запросы к серверу от клиентов..  
Сойдемся на том, что автор описАлся

mazdayka, 2008-09-18 в 17:56:50

что то тут не сходится!
при таком раскладе правил у меня вообще файер не пашет:(
FreeBSD 7.0
и откуда появился ${oip} ?

Rimlyanin, 2008-10-01 в 23:58:29

я ньюб, может я ещё не все понимаю. но у меня:

gate# cat /usr/local/etc/mpd5/mpd.conf.sample | grep set | grep ccp |grep yes | grep mpp
       set ccp yes mppc
       set ccp yes mpp-e40
       set ccp yes mpp-e128
       set ccp yes mpp-stateless
       set ccp yes mppc
       set ccp yes mpp-e40
       set ccp yes mpp-e128
       set ccp yes mpp-stateless
gate#

Саша, 2008-10-02 в 17:56:29

The five lines below enable Microsoft Point-to-Point encryption
# (MPPE) using the ng_mppc(8) netgraph node type. Поддержка шифрования Microsoft
# для Windows-клиентов, не изменял секцию
       set bundle enable compression
       set ccp yes mppc
       set mppc yes e40 #ошибочка
       set mppc yes e128 #ошибочка
       set mppc yes stateless #ошибочка


Sep 16 11:42:23 olimp-motors mpd: mpd.conf:52: Unknown command: 'set mppc'. Try "help".
Sep 16 11:42:23 olimp-motors mpd: mpd.conf:53: Unknown command: 'set mppc'. Try "help".
Sep 16 11:42:23 olimp-motors mpd: mpd.conf:54: Unknown command: 'set mppc'. Try "help".

надо
       set ccp yes e40
       set ccp yes e128
       set ccp yes stateless



alik, 2009-01-19 в 15:39:45

.... deleted ......
каммент удалён администратором.
пишите в форум

alik, 2009-01-19 в 15:42:58

Прошу прошения, за бардак, я случайно.

docd, 2009-01-19 в 20:29:38

Классно, супер НО! Я в сети практически ничего не нашёл о l2tp/ipsec для Win!(set l2tp) Поделитесь секретом в виде статьи :-)).

omega, 2009-01-27 в 13:44:36

# shapes for users
       ${fwcmd} add pipe 5 ip from any to ${n1}/24
       ${fwcmd} add pipe 5 ip from ${n1}/24 to any
       ${fwcmd} pipe 1 config bw 2Mbits/s

А тут случаем очепятки нету? pipe 1 config там не 5 случаем должно быть?

Wic, 2009-02-20 в 18:40:53

Отличная статья, хорошо описан фаервол, настройка и сборка ядра, и сама процедура подъема сервера тоже хорошо описана.
Только новичкам не стоит бездумно сдирать конфиги, всё нужно продумывать и понимать, а не скопировал вставил и разбираться почему не работает то или это.
ps когда собирал руками mpd5.2 из портов руками то нужно было сделать ./src/configure а только потом make install all, как описано в ридми

tez, 2009-05-09 в 23:08:25

Хочу сказать просто БОЛЬШУШЧЕЕ спасибо...

sergicus, 2009-10-01 в 9:27:24

Спасибо за статью, помогла

daggerok, 2009-10-03 в 20:15:25

        # PROXY - это для прозрачного прокси-сервера, на моей машине он до кучи сервисов
       ${fwcmd} add fwd ${iip},3348 tcp from ${n1}/24 to any http via ${iint}
       ${fwcmd} add fwd ${iip},3348 tcp from ${n1}/24 to any https via ${iint}

расскажите, чем вы прозрачно проксируете https траффик?

да, 2010-04-27 в 4:40:05

daggerok
Порты 80 и 443 проксируются сквидом или хз чем на порту 3348 скорее для подсчета трафика и резки баннеров. Всё остальное идёт через нат

daggerok, 2010-04-28 в 12:55:40

>да, 2010-04-27 в 4:40:05
>daggerok
>Порты 80 и 443 проксируются сквидом или хз чем на >порту 3348 скорее для подсчета трафика и резки >баннеров. Всё остальное идёт через нат

на сколько я знаю - прозрачно проксировать https-трафик нельзя, ну или во всяком случае у меня сквидой не получилось этого добиться. именно поэтому я и спросил - чем именно Вы его прозрачно проксируете. так как у меня, там где стоит прозрачный проксик, весь https-трафик ходит по нату.

ASM, 2010-05-24 в 20:20:19

Автор, обратите внимание, в эти строки вкралась ошибка:
# FTP & HTTP to LAN
${fwcmd} add allow tcp from ${oip} 20,21,80,443 to  {n1}/24 via ${iint} keep-state
${fwcmd} add allow tcp from ${oip} 49152-65534 to ${n1}/24 via ${iint} keep-state
Дело в том, что переменная ${oip} не обозначена, и насколько я понял, нужно сделать замену ${oip} на ${eip}.

ASM, 2010-05-24 в 21:05:44

Еще вот что. С правилом ${fwcmd} add allow tcp from me 1723 to any keep-state должно идти правило ${fwcmd} allow tcp from any to me dst-port 1723 keep-state, иначе мы просто не сможем подключиться к серверу.

aspera, 2010-08-19 в 17:36:32

И вообще не стоит использовать "me" в конфиге фаервола, если у вас будет несколько адресов провайдера и коннектится будут не на дефолтный гейт, то тупо не отработает. А после разделения трафика по направлениям "me" использовать нельзя вообще...
Лучше будет ipfw add allow tcp from any to $oip 1723 keep-state

aspera, 2010-08-19 в 17:38:38

P.S.: если указать правило ipfw add allow tcp from any to $oip 1723 keep-state то  правило ${fwcmd} add allow tcp from me 1723 to any keep-state вообще не нужно

tehnikpc, 2012-09-11 в 13:55:59

"# deny netbios
       ${fwcmd} add deny ip from any 137-139 to any
       ${fwcmd} add deny ip from any to any 137-13"
Зачем samba прибили? :). Бедные пользователи :).

tehnikpc, 2012-09-11 в 14:01:34

"# SSH for localhost allow
       ${fwcmd} add allow tcp from me 22 to any
       ${fwcmd} add allow tcp from any to me 22"
Это глобальное правило.

tehnikpc, 2012-09-11 в 14:05:29

"#  VPN-connect - это порт для даемона MPD,
       # на него поступают запросы на авторизацию
       ${fwcmd} add allow tcp from me 1723 to any keep-state"
Это правило для исходящего порта 1723, а нужно наоборот открыть входящий.



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.1096 секунд
Из них PHP: 66%; SQL: 34%; Число SQL-запросов: 77 шт.
Исходный размер: 146224; Сжатая: 30952