Для начала нам нужно собрать ядро с поддержкой IPSEC NAT.

Скачиваем исходные коды, если они не установлены.

Собираем ядро со следующими опциями:

options IPSEC   # Уже должна быть ядре, проверьте в файле
options IPSEC_NAT_T
options IPSEC_FILTERTUNNEL
options LIBALIAS
device enc
device crypto   # Уже должна быть ядре, проверьте в файле

В версиях FreeBSD выше 11.0 ядро пересобирать не нужно.

После сборки ядра перезагружаем сервер.

Далее нам необходимо установить набор утилит ipsec-tools. Ставить будем из портов.
Если порты у вас не установлены, то выполняем следующие действия.

# portsnap fetch
# portsnap extract

Но перед установкой ipsec-tools, нам необходимо пропатчить данную программу,
так как в дефолтовой сборке нет возможности принимать подключения со всех ip адресов.
Идем в

# cd /usr/ports/security/ipsec-tools/files
# vi patch-zz-local-1.diff

и создаем файл патча со следующим содержимым

diff -rup srca/racoon/localconf.c srcb/racoon/localconf.c
--- src/racoon/localconf.c 2012-01-29 21:17:41.000000000 +0000
+++ src/racoon/localconf.c 2012-01-29 21:19:09.000000000 +0000
@@ -207,7 +207,8 @@ getpsk(str, len)
 		if (*p == '\0')
 			continue;	/* no 2nd parameter */
 		p--;
-		if (strncmp(buf, str, len) == 0 && buf[len] == '\0') {
+		if (strcmp(buf, "*") == 0 ||
+			(strncmp(buf, str, len) == 0 && buf[len] == '\0')) {
 			p++;
 			keylen = 0;
 			for (q = p; *q != '\0' && *q != '\n'; q++)

Устанавливаем ipsec-tools.

# cd /usr/ports/security/ipsec-tools
# make config-recursive
# make install clean

Далее устанавливаем mpd5.
Так как mpd нам патчить не нужно, ставим его из репозиториев.

# pkg ins mpd5

Ipsec ставится вместе с демоном racoon, который будет слушать подключения на порту и пускать либо отбрасывать эти подключения.
Нам необходимо настроить его.
Создадим файл настроек.

# cd /usr/local/etc/racoon
# vi racoon.conf


path pre_shared_key "/usr/local/etc/racoon/psk.txt";

listen
{ isakmp 192.168.100.192 [500]; isakmp_natt 192.168.100.192 [4500]; } remote anonymous { exchange_mode main; passive on; proposal_check obey; support_proxy on; nat_traversal on; ike_frag on; dpd_delay 20; proposal { encryption_algorithm aes; hash_algorithm sha1; authentication_method pre_shared_key; dh_group modp1024; } proposal { encryption_algorithm 3des; hash_algorithm sha1; authentication_method pre_shared_key; dh_group modp1024; } } sainfo anonymous { encryption_algorithm aes,3des; authentication_algorithm hmac_sha1; compression_algorithm deflate; pfs_group modp1024; }

Создаем файл с секретным ключем и с указанием опции подключения со всех ip "*", то что мы патчили.

# vi psk.txt


* supersecretkey1

Ествественно вам нужно создать более сложный ключ.
Устанавливаем доступ на файл.

# chmod 400 psk.txt

Настроим политики безопасности для IPsec.

# vi setkey.conf


flush;
spdflush;
spdadd 0.0.0.0/0[0] 0.0.0.0/0[1701] udp -P in ipsec esp/transport//require;
spdadd 0.0.0.0/0[1701] 0.0.0.0/0[0] udp -P out ipsec esp/transport//require;

Далее настравиваем mpd5.

# cd /usr/local/etc/mpd5
# vi mpd.conf


startup:
        # configure mpd users
        set user super Psww0rd 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 l2tp_server

l2tp_server:
# Define dynamic IP address pool - these are the IP addresses which will be
# allocated to our remote clients when they join the LAN
# REPLACE w.x.y.from - w.x.y.to with the IP addresses mpd5 will allocate IP address range.
# e.g.  set ippool add pool_l2tp w.x.y.150 w.x.y.199
        set ippool add pool_l2tp 192.168.100.50 192.168.100.90

# Create clonable bundle template named B_l2tp
        create bundle template B_l2tp
        set iface enable proxy-arp
        set iface enable tcpmssfix
        set ipcp yes vjcomp
# Specify IP address pool for dynamic assigment.
       # This is the internal IP and netmask of the box
       # REPLACE w.x.y.z with the IP address for your VPN server
        set ipcp ranges 192.168.100.1/24 ippool pool_l2tp
       # an accessible DNS server for clients to use
       # REPLACE w.x.y.dns with the IP address for your DNS server
       # e.g. set ipcp dns w.x.y.50
        set ipcp dns 8.8.8.8

# Create clonable link template named L_l2tp
        create link template L_l2tp l2tp
# Set bundle template to use
        set link action bundle B_l2tp
# Multilink adds some overhead, but gives full 1500 MTU.
        set link enable multilink
        set link no pap chap eap
        set link enable chap
        set link keep-alive 0 0
# We reducing link mtu to avoid ESP packet fragmentation.
        set link mtu 1280
# Configure L2TP
       # REPLACE with the IP address racoon will listen on (if behind NAT, this is the INSIDE IP)
       # Unfortunately, you can not specify multiple IPs here, so just comment the next line if you need that
        set l2tp self 192.168.100.192
        set l2tp enable length
# Allow to accept calls
        set link enable incoming

Создаем пользователя VPN.

# vi mpd.secret


mpd_user Passw0rd


# chmod 400 mpd.secret

Включаем IPsec, racoon, mpd.

# vi /etc/rc.conf


ipsec_enable="YES"
ipsec_program="/usr/local/sbin/setkey"
ipsec_file="/usr/local/etc/racoon/setkey.conf"
racoon_enable="YES"
racoon_flags="-l /var/log/racoon.log"
mpd_enable="YES"
gateway_enable="YES"

Настраиваем логирование.

# vi /etc/syslog.conf

 В конце файла перед строчкой !*, добавляем следующие строчки

!mpd
*.* /var/log/mpd.log

Создаем логи.

# touch /var/log/mpd.log
# touch /var/log/racoon.log
# chmod a+w /var/log/mpd.log
# chmod a+w /var/log/racoon.log

Перезагружаем сервер для применения настроек.

При пробросе VPN сервера через NAT используйте порты 1701, 500, 4500.

Для подключения из под Windows необходимо в реестре добавить ключ:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PolicyAgent 
RegValue: AssumeUDPEncapsulationContextOnSendRule
Type: DWORD
Data Value: 2

и перезагрузить компьютер.