суббота, 26 июня 2010 г.

OpenVpn (tap)

Tap интерфейс используется в основном для соединения сервер >> сервер. В связке с bridge-utils он позволяет объединять две удаленные сети в одну, причем позволяет строить туннели второго уровня сетевой модели OSI. И хотя это далеко не единственный способ применения tap интерфейса (подробнее смотрите на сайте OpenVpn), в этой заметке я расскажу именно о таком тоннеле и способах его построения.
Предположим у нас есть два офиса, которые надо объединить в одну сеть. При этом нам необходимо чтобы между ними у нас бегали netbios и тегированый трафик (vlan) ну или что либо не из стека TCP/IP. Для этого нам понадобятся два сервера(часто для этого используются шлюзы). Чтобы быо проще понять что к чему мы рассмотрим настройку на примере всего двух серверов и назовем их например A и B. У одного из них должен быть "внешний" IP адрес, для второго это вовсе не обязательно.(В нашем случае внешний айпишник будет у сервера A, например такой: 123.123.123.123).
Смысл примерно такой настраиваем openvpn и запускаем его на обоих машинах, в результате на каждой машине у нас поднимается TAP интерфейс (оба этих интерфейса являются "концами" нашего туннеля) с помощью bridge-utils объединяем эти интерфейсы в мост с нашим реальным интерфейсом, который смотрит у нас в локалку.

И так, для начала нам понадобится установить openvpn и bridge-utils:
yum install openvpn bridge-utils
Далее генерим ключи и копируем их в /etc/openvpn, как описано это в предыдущем посте.

Пишем конфиги.
Для начала необходимо определиться какие конфиги нам понадобятся:
Для сервера A (собственно он у нас будет принимать соединение { потому то у него и есть внешний IP }) : server-tap.conf(общие настройки опенвпн) а также два скрипта(openvpn-startup и openvpn-shutdown) которые, соответственно поднимут или опустят мост во время старта и выключения опенвпн.
Для сервера B (который у нас будет подключаться к серверу A) нужно все тоже самое за исключением того что конфиг у него будет отличаться от конфига сервера A.

СЕРВЕР A. (/etc/openvpn/server-tap.conf)
port 2000
proto tcp
dev tap0
comp-lzo
tun-mtu 1500
server-bridge 192.168.0.8 255.255.255.0 192.168.0.200 192.168.0.202
#здесь пишем ip внутреннего интерфейса и диапазон ip из которых можно назначать
#адрес tap интерфейсу сервера B
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh1024.pem
persist-key
persist-tun
verb 0

Сервер B. (/etc/openvpn/server-tap.conf)
client
nobind
ping 10
remote 123.123.123.123
#ip сервера A
port 2000
proto tcp
dev tap0
comp-lzo
tun-mtu 1500
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/client1.crt
key /etc/openvpn/keys/client1.key
persist-key
persist-tun
verb 0

Ну а также наши скрипты (они одинаковы для обоих серверов и должны лежать в /etc/openvpn).
Первый скрипт /etc/openvpn/openvpn-startup.
#!/bin/bash
#################################
# Set up Ethernet bridge on Linux
# Requires: bridge-utils
#################################
# Define Bridge Interface
br="br0"
# Define list of TAP interfaces to be bridged,
# for example tap="tap0 tap1 tap2".
tap="tap0"
# Define physical ethernet interface to be bridged
# with TAP interface(s) above.
eth="eth1"
# здесь указываем наш внутренний интерфейс
eth_ip="192.168.0.8"
#его ip для серверов A и B это будут соответственно айпиники их внутренних интерфейсов.
eth_netmask="255.255.255.0"
# маску
eth_broadcast="192.168.0.255"
#и широковещательный адрес
for t in $tap; do
openvpn --mktun --dev $t
sleep 2
done
brctl addbr $br
brctl addif $br $eth
sleep 2
for t in $tap; do
brctl addif $br $t
done
for t in $tap; do
ifconfig $t 0.0.0.0 promisc up
sleep 2
done
ifconfig $eth 0.0.0.0 promisc up
sleep 2
ifconfig $br $eth_ip netmask $eth_netmask broadcast $eth_broadcast


Второй скрипт /etc/openvpn/openvpn-shutdown
#!/bin/bash
####################################
# Tear Down Ethernet bridge on Linux
####################################
# Define Bridge Interface
br="br0"
# Define list of TAP interfaces to be bridged together
tap="tap0"
ifconfig $br down
brctl delbr $br
for t in $tap; do
openvpn --rmtun --dev $t
done

Не забываем сделать их исполняемыми:
chmod +x /etc/openvpn/openvpn-s*

Стартуем openvpn на обоих серверах и ставим openvpn в службы запускаемые по умолчанию
service openvpn start
chkconfig openvpn on
Небольшое замечание: все это будет работать при условии что сети обоих офисов будут относиться к одной логической сети.