OpenVPN Bridge
Материал из Xgu.ru
- Автор: Игорь Чубин
- Короткий URL: openvpn/bridge
На этой странице описывается каким образом
можно организовать перенос трафика тегированного с помощью тега 802.1Q поверх уровня IP.
Решение этой задачи позволяет сохранить принадлежность трафика VLAN'у даже при переходе через
границу сети на канальном уровне, что, в свою очередь, позволяет создавать сети
с единым планом VLAN'ов независимо от того сколько сетей канального уровня входит в её состав.
Содержание |
[править] Введение
Сейчас практически любая компьютерная сеть сегментируется при помощи VLAN'ов. Это делается по многочисленным причинам, в том числе с целью повышения безопасности сети, её эффективности и управляемости.
VLAN — это группа устройств, имеющих возможность взаимодействовать между собой напрямую на канальном уровне, хотя физически при этом они могут быть подключены к разным сетевым коммутаторам.
Обычно, это верно в случае, если устройства соединены между собой на канальном уровне. Если же устройства соединены между собой только на уровне IP (напрямую или через VPN, не важно), тегированный трафик VLAN не передаётся, и информация о принадлежности пакетов тому или иному VLAN'у теряется.
В этом случае получается, что в одной сети нужно создавать одни VLAN'ы, а в другой другие, и если нужно чтобы какие-то VLAN'ы охватывали несколько сетей разделённых уровнем IP, решать задачу путем создания соответствующих правил фильтрации трафика на уровне IP. Конечно, получившийся в этом случае составной VLAN не имеет ничего общего с настоящим VLAN'ом -- это просто группа сетей, между которыми трафик может передаваться беспрепятственно (они всё равно разделены на уровне IP, так что, например, широковещательный трафик сам по себе передаваться между ними не будет).
Такой подход не всегда удобен. Создание независимого множества VLAN'ов для каждой сети приводит к ненужному умножению управляемых сущностей, снижению гибкости и усложнению системы в целом. Например, если в сети используется аутентификация при доступе к сети 802.1X и пользователь попадает в тот или иной VLAN на основе своей учётной записи (подробнее: 802.1X и RADIUS), вы должны думать не только о том, какой пользователь входит в сеть, но ещё и о том, через какой коммутатор он подключается, и в какой из множества сетей этот коммутатор стоит.
Начиная с какого-то масштаба сети и уровня её распределённости усложнение становится настолько сильным, что теряется вся прелесть VLAN'ов.
Ситуация существенным образом упрощается, если как-то добиться того, что VLAN'ы прозрачно передаются поверх IP. То есть, например, VLAN 2 в одной сети и VLAN2 в другой сети -- это один и тот же VLAN, трафик между компьютерами этого VLAN'а, включая широковещательный, передаётся как и должен, без всяких ограничений, независимо от того, сколько IP-хопов он при этом преодолевает (они должны быть невидимы для сети).
[править] Задача
Существует две сети, соединённые на IP-уровне между собой. Необходимо сделать так чтобы между этими сетями мог прозрачно передаваться трафик, тегированный с помощью тега 802.1Q так как если бы это была большая коммутируемая сеть.
VLANS 2 4 6 8 | | | | | | | | | | | | | | | | +-----------------------+ | 802.1Q enabled switch | | | +-----------------------+ | |802.1Q tagged link | | | IP | +----------------+ +-----------------+ | Linux / FreeBSD|---------| Linux / FreeBSD | +----------------+ +-----------------+ | |802.1Q tagged link | | +-----------------------+ | 802.1Q enabled switch | | | +-----------------------+ | | | | | | | | | | | | | | | | 2 4 6 8 VLANS
[править] Решение
Указанную задачу можно решить с помощью различных средств построения туннелей, в частности vtun и OpenVPN. Ниже описывается решение задачи с помощью OpenVPN.
Рассмотрим топологию:
Здесь есть несколько машин, соединённых в цепочку с помощью
коммутаторов.
- debian1 — машина, находящаяся в одной локальной сети
- debian5 — машина, находящаяся в другой локальной сети
- debian2 — шлюз в Интернет с одной стороны
- debian4 — шлюз в Интернет с другой стороны.
- debian3 — условный Интернет; соединяет между собой шлюзы debian2 и debian4
В качестве операционной системы используется Debian GNU/Linux. Рассматриваемая последовательность действий будет работать и и в других дистрибутивах Linux. В FreeBSD принципиальных отличий нет, но некоторые команды отличаются (настройка мостов и VLAN'ов).
Необходимо сделать так чтобы машина debian1 видела машину debian5 так как будто они находятся с ней в одной коммутируемой сети. Если трафик, передающийся в этой сети тегирован, теги должны сохранятся. Другими словами, если вместо машины debian1 будет коммутатор с настроенными на нём VLAN'ами, который будет смотреть на debian2 тегированным портом (и точно такая же ситуация будет с противоположной стороны), то компьютеры находящиеся в одном VLAN'е будут прекрасно видеть друг друга, независимо от того, в какой части сети они находятся.
[править] Программное обеспечение
Для выполнения процедуры потребуется установить программное обеспечение.
На debian2 и debian4:
- openvpn
- bridge-utils
- iproute2 (не обязательно; но тогда нужно использовать команду ifconfig вместо команды ip)
На debian1 и debian5:
- vlan
- tcpdump
[править] Настройка OpenVPN
Настройки OpenVPN:
На debian2 (сервер):
debian2%# cat /etc/openvpn/server.conf dev tap0 secret static.key
На debian4 (клиент):
remote 192.168.2.2 dev tap secret static.key
(здесь предполагается, что 192.168.2.2 — IP-адрес машины debian2 в условном Интернете)
Как и следовало ожидать, для поднятия туннеля и его использования в режиме моста, IP-адреса не нужны.
После того как туннель поднят
debian2 %# /etc/init.d/openvpn start debian4 %# /etc/init.d/openvpn start
на обеих машинах появляются tap-интерфейсы, однако они находятся в погашеном состоянии (ifconfig -a).
[править] Настройка виртуальных мостов
Необходимо создать мосты на обеих машинах (debian2 и debian4), и включить все необходимые интерфейсы.
На debian2:
debian2 %# brctl addbr br0 debian2 %# brctl addif br0 tap0 debian2 %# brctl addif br0 eth1 debian2 %# ip link set tap0 up debian2 %# ip link set br0 up
На debian4:
debian4 %# brctl addbr br0 debian4 %# brctl addif br0 tap0 debian4 %# brctl addif br0 eth2 debian4 %# ip link set tap0 up debian4 %# ip link set br0 up
[править] Проверка
Теперь машины debian1 и debian5 видят друг друга, так как если бы они находились в одной сети.
debian1%# ifconfig eth1 eth1 Link encap:Ethernet HWaddr 00:16:3e:01:00:c2 inet addr:192.168.4.1 Bcast:192.168.4.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:335 errors:0 dropped:0 overruns:0 frame:0 TX packets:346 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:24490 (23.9 KiB) TX bytes:24736 (24.1 KiB) debian5%# ifconfig eth1 eth1 Link encap:Ethernet HWaddr 00:16:3e:01:04:c2 inet addr:192.168.4.5 Bcast:192.168.4.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:144 errors:0 dropped:0 overruns:0 frame:0 TX packets:132 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:13492 (13.1 KiB) TX bytes:12556 (12.2 KiB)
С машины debian1 можно пингануть машину debian5 и проследить маршрут:
debian1%# ping 192.168.4.5 PING 192.168.4.5 (192.168.4.5) 56(84) bytes of data. 64 bytes from 192.168.4.5: icmp_seq=1 ttl=64 time=5.56 ms --- 192.168.4.5 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 5.566/5.566/5.566/0.000 ms debian1%# traceroute 192.168.4.5 traceroute to 192.168.4.5 (192.168.4.5), 30 hops max, 40 byte packets 1 (192.168.4.5) 108.408 ms 108.389 ms 108.382 ms
Трассировка показала, что debian5 находится с debian1 в одной коммутируемой сети.
Мы также можем передавать тегированный трафик.
На машине debian1:
debian1%# vconfig add eth1 100 debian1%# ifconfig eth1.100 192.168.100.1
На машине debian5:
debian5%# vconfig add eth1 100 debian5%# ifconfig eth1.100 192.168.100.5
Проверяем:
debian1:~# ifconfig eth1.100 eth1.100 Link encap:Ethernet HWaddr 00:16:3e:01:00:c2 inet addr:192.168.100.1 Bcast:192.168.100.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:34 errors:0 dropped:0 overruns:0 frame:0 TX packets:34 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:2712 (2.6 KiB) TX bytes:3188 (3.1 KiB) debian1%# ping 192.168.100.5 PING 192.168.100.5 (192.168.100.5) 56(84) bytes of data. 64 bytes from 192.168.100.5: icmp_seq=1 ttl=64 time=1.34 ms --- 192.168.100.5 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 1.346/1.346/1.346/0.000 ms debian1%# traceroute 192.168.100.5 traceroute to 192.168.100.5 (192.168.100.5), 30 hops max, 40 byte packets 1 (192.168.100.5) 1.960 ms 1.938 ms 1.930 ms
В это время на debian5:
debian5# tcpdump -i eth1 -n device eth1 entered promiscuous mode audit(1203642136.881:2): dev=eth1 prom=256 old_prom=0 auid=4294967295 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes 01:02:29.644256 vlan 100, p 0, IP 192.168.100.1 > 192.168.100.5: ICMP echo request, id 19801, seq 1, length 64 01:02:29.644373 vlan 100, p 0, IP 192.168.100.5 > 192.168.100.1: ICMP echo reply, id 19801, seq 1, length 64 ...
[править] Дополнительная информация
- OpenVPN: Static Key Mini-HOWTO (англ.)
- OpenVPN: Ethernet Bridging (англ.)
[править] Материалы по OpenVPN на xgu.ru
- OpenVPN
- Два шлюза в Интернет и OpenVPN
- OpenVPN в Windows
- OpenVPN Bridge — передача тегированного трафика через VPN
- OpenVPN Proxy ARP