Организация защищённого бриджа между двумя Ethernet-сегментами через Интернет

Q: Как организовать защищённый бридж между двумя Ethernet-сегментами через Интернет (или через публичный vlan, или через чего там ещё, неважно)?

A:

Схема организации бриджа

Шлюзы GW1 и GW2 контачат промеж собой по IP через некую среду посредством интерфейсов Eth1. OpenVPN использует виртуальные Ethetnet-интерфейсы Tap, которые после установки шифрованного VPN-соединения между шлюзами объединяются в один Ethernet-сегмент. Теперь осталось на каждом шлюзе объединить интерфейсы Tap и Eth2 в бридж и задача объединения удалённых сегментов LAN1 и LAN2 решена.

Реализация под FreeBSD 7.1-RELEASE

Необходимо разрешить форвардинг пакетов между интерфейсами:

	gateway_enable="YES"

Драйверы tap и bridge можно грузить модулями, а можно вкомпилировать в ядро. Я вкомпилировал:

	device          if_bridge
	device          tap

По идее, OpenVPN сама создаёт интерфейс tap, но в моём случае, создавая, она его не поднимала (up), из-за чего я довольно долго рвал себе мозг в попытках заставить работать конфигурацию, пока не заметил этот маленький нюанс.
Бридж можно создавать и разрушать после установки или разрыва коннекта скриптами, определяемым опциями client-connect и client-disconnect конфигурационного файла, но, поскольку у нас только два сегмента, создавать и поднимать tap и bridge можно (я бы даже сказал нужно, учитывая нюансы) при загрузке системы:

	cloned_interfaces="bridge0 tap0"
	ifconfig_bridge0="addm re0 addm tap0 up"
	ifconfig_tap0="up"

Необходимо разрешить форвардинг пакетов между интерфейсами:

	gateway_enable="YES"

Дальше ставим порт OpenVPN, в rc.conf добавляем опции:

	openvpn_enable="YES"
	openvpn_configfile="/usr/local/etc/openvpn/server.conf"
	openvpn_dir="/usr/local/etc/openvpn"

Генерим сертификаты (читать доки), кладём в /usr/local/etc/openvpn, переделываем под себя типовые конфигурационные файлы на клиенте и сервере. Собственно, всё.

Конфигурационные файлы

Ядро

	device          if_bridge
	device          tap

rc.conf (server/#client)

	gateway_enable="YES"
	ifconfig_re0="inet 192.168.5.47  netmask 255.255.255.0"	# внутрь
	#ifconfig_re0="inet 192.168.5.46  netmask 255.255.255.0"	# внутрь
	ifconfig_em0="inet 10.10.10.1  netmask 255.255.255.252"	# наружу
	#ifconfig_em0="inet 10.10.10.2  netmask 255.255.255.252"	# наружу
	cloned_interfaces="bridge0 tap0"
	ifconfig_bridge0="addm re0 addm tap0 up"
	ifconfig_tap0="up"
	openvpn_enable="YES"
	openvpn_configfile="/usr/local/etc/openvpn/server.conf"
	#openvpn_configfile="/usr/local/etc/openvpn/client.conf"
	openvpn_dir="/usr/local/etc/openvpn"

server.conf

	local 10.10.10.1
	port 1194
	proto udp
	dev tap0
	ca ca.crt  
	cert Server.crt
	key Server.key
	dh dh1024.pem
	mode server
	tls-server
	keepalive 10 120
	cipher BF-CBC
	persist-key
	persist-tun
	status openvpn-status.log
	verb 3

client.conf

	client
	dev tap0
	proto udp
	remote 10.10.10.1 1194
	nobind
	persist-key
	persist-tun
	ca ca.crt      
	cert Client.crt
	key Client.key
	verb 3

© Александр Дружин (lx at raz.ru), 2009    Rambler's Top100