L2 туннели с помощью OpenVPN

(Статья в режиме правки)
OpenVPN позволяет создавать туннели в режиме не только routed vpn, но и bridged vpn.
Режим bridged подразумевает объединение в bridge(мост) ethernet интерфейса с одним или более виртуальным TAP интерфейсом, который по туннелю OpenVPN будет соединен с аналогичным bridg-ом на другой стороне туннеля. Это является программным аналогом физического коммутатора(свича) и позволяет логически соединить две (или более) расположенные отдельно друг от друга сети в одну так, как будто это одна сеть, т.е. объединить эти сети на уровне L2.
Более подробно см https://openvpn.net/index.php/open-source/documentation/miscellaneous/76...
Работает это так.
Первый шаг это создание ethernet bridge - виртуального сетевого интерфейса, являющегося контейнером для других ethernet интерфейсов(реальных физических сетевых адаптеров или виртуальных,, как TAP или Vlan. Ethernet bridge должен быть создан до того как будет запущен OpenVPN.
IP адрес должен быть назначен для bridge до того как будет запущен OpenVPN.
Под Linux скрипты для создания bridge интерфейса хорошо описаны по первой ссылке, после установки под debian/ubuntu эти скрипты есть в /usr/share/doc/openvpn
Для FreeBSD нужно их написать самостоятельно, по крайней мере, я не нашел готового для моих целей, а за основу взял скрипт отсюда
https://forums.freebsd.org/threads/bridged-openvpn-not-working-on-freebs...
Особенностью работы под FreeBSD является то, что после рестарта OpenVPN интерфейс TAP оказывается в состоянии down и нужно его принудительно переводить в up скриптом.
Сначала создал нужные мне интерфейсы tap0 b vlan10, потом проверял работу (FreeBSD-10.3) таким скриптом

# cat openvpn_tap.sh
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin

exec 1>/dev/null 2>&1

TAP=tap0
NIC=vlan10
BIF=bridge0

case "$script_type" in
        up)
                ifconfig $BIF || ifconfig bridge create
                ifconfig $NIC up
                ifconfig $TAP up
                ifconfig $BIF | awk '/member: / { print $2 }' | grep -w "$NIC" || ifconfig $BIF inet 10.1.1.1/24 addm $NIC up
                ifconfig $BIF | awk '/member: / { print $2 }' | grep -w "$TAP" || ifconfig $BIF addm $TAP up
        ;;
        down)
                ifconfig $BIF | awk '/member: / { print $2 }' | grep -w "$NIC" && ifconfig $BIF deletem $NIC
                ifconfig $BIF | awk '/member: / { print $2 }' | grep -w "$TAP" && ifconfig $BIF deletem $TAP
                ifconfig $BIF destroy
        ;;
esac

Конфиг сервера:
server.tap.conf
port 1196
proto udp
dev tap0
ca tap/keys/ca.crt
cert tap/keys/server.crt
key tap/keys/server.key
dh tap/dh1024.pem
server-bridge
keepalive 10 120
comp-lzo
;user nobody
;group nogroup
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.tap.log
log-append  /var/log/openvpn/openvpn.tap.log

script-security 2
up /usr/local/etc/openvpn/tap/openvpn_tap.sh
down /usr/local/etc/openvpn/tap/openvpn_tap.sh

verb 3

Поскольку целью является соединить две сети, то скрипт для поднятия bridg-а на клиенте аналогичный.
Конфиг клиента:
client
dev tap0
proto udp
remote myvpnserver.net 1196

resolv-retry infinite
nobind

persist-key
persist-tun

ca keys/ca.crt
cert keys/client1.crt
key keys/client1.key

ns-cert-type server

script-security 2
up /usr/local/etc/openvpn/openvpn_tap.sh
down /usr/local/etc/openvpn/openvpn_tap.sh

comp-lzo
verb 3
log-append /var/log/openvpn/openvpn.log

Примеры работающих конфигураций
http://www.mired.org/writing/bridged-openvpn-on-freebsd
http://www.ivoras.net/blog/tree/2013-06-03.openvpn-on-freebsd.html
Полезные ссылки
https://www.freebsd.org/doc/handbook/network-bridging.html