openvpn: одна подсеть по разные стороны

Недавно подкинули интересную задачку: нужно соединить по vpn’y 2 офиса, причём внутренняя подсеть у них одна и та же. В качестве vpn’a выбрал openvpn. Шлюзы крутились на FreeBSD 7.2. Для соединения по vpn была выделена подсеть 10.15.0.0/30, то есть только 2 адреса: 10.15.0.1, 10.15.0.2

1) Подготовка.

Установку и создания ключей описывать не буду, они уже описаны другой статье. Идея соединения такова: сервера подключаются по vpn’y, создаётся мост между сетевым подключениемvpn и локальной сетью.

Для того, что бы можно было работать с бриджом (мостом), нужно либо

— включить поддержку в ядре: пересобираем ядро с опцией

device if_bridge

— либо подгрузить модулем: добавить в /boot/loader.conf

if_bridge_load="YES"

Ещё очень немаловажным моментом будет использование интерфейса tap вместо tun в openvpn. В tap используется инкапсуляция на уровне OSI 2, а в tun — 3. Нам же нужен именно 2-ой. Для возможности использования tap его нужно подгружать модулем: добавляем в /boot/loader.conf:

if_tap_load="YES"

2)Настройка openvpn’a.

Конфиг openvpn’a следующий (сервер):

dev tap
port 2284
ifconfig 10.15.0.1 255.255.255.252
ping 10
ping-restart 120
comp-lzo
verb 3
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
tls-server
user nobody
group nobody
log-append /var/log/vpn/server.log
status /var/log/vpn/status.log

конфиг клиента:

dev tap
port 2284
remote XX.XX.XX.XX
ifconfig 10.15.0.2 255.255.255.252
ping 10
ping-restart 120
user nobody
group nobody
comp-lzo
verb 3
ca ca.crt
cert client1.crt
key client1.key
dh dh1024.pem
tls-client
explicit-exit-notify 2
log-append /var/log/vpn/server.log
status /var/log/vpn/status.log

Вот так выглядит скрипт, запускающий vpn-соединение:

#!/bin/sh
while :; do
/usr/local/sbin/openvpn --cd /usr/local/etc/openvpn --config /usr/local/etc/openvpn/openvpn.conf >> /var/log/vpn.log
done

Сам скрипт помещаю в папку /scripts, а для его запуска во время загрузки, создаём вот такой скрипт (называем его vpn) и помещаем его в /usr/local/etc/rc.d:

#!/bin/sh
# PROVIDE: vpn
# REQUIRE: DAEMON
# KEYWORD: shutdown
. /etc/rc.subr
: ${vpn_enable="YES"}
name="vpn"
rcvar=`set_rcvar`
load_rc_config $name
command_args="&"
command="/scripts/${name}"
run_rc_command "$1"

3)Заключение.

Для нормального запуска во время загрузки, в /etc/rc.conf должны присутствовать такие строки:

cloned_interfaces="bridge0 tap0"
ifconfig_bridge0="addm fxp0 addm tap0 up"

где, fxp0 — сетевая, которая смотрит в локалку.

Если не хотите подгружать вручную модули и создавать бридж, запускать скрипты vpn’a, то просто перегрузите сервер. А если всё-таки не хотите перегружать сервер, то ниже приведена последовательность действий:

— подгружаем модули tap, bridge:

#kldload if_bridge
#kldload if_tap

— проверяем, подгрузились ли они:

# kldstat
Id Refs Address    Size     Name
1    9 0xc0400000 8a0a58   kernel
2    1 0xc0ca1000 585c     if_tap.ko
3    1 0xc0ca7000 a30c     if_bridge.ko
4    2 0xc0cb2000 62b0     bridgestp.ko

— создаём bridge:

#ifconfig bridge0 create
#ifconfig bridge0 addm fxp0 addm tap0 up

— проверяем создался ли:

#ifconfig bridge0
bridge0: flags=8843 metric 0 mtu 1500
ether 2e:f5:7d:09:07:15
id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15
maxage 20 holdcnt 6 proto rstp maxaddr 100 timeout 1200
root id 00:00:00:00:00:00 priority 32768 ifcost 0 port 0
member: tap0 flags=143
ifmaxaddr 0 port 8 priority 128 path cost 2000000
member: fxp0 flags=143
ifmaxaddr 0 port 5 priority 128 path cost 2000000

— запускаем сам скрипт для поднятия vpn’a:

#/scripts/vpn &

— ну и смотрим на само соединение:

# ifconfig tap0
tap0: flags=8943 metric 0 mtu 1500
ether 00:bd:26:0f:00:00
inet 10.15.0.1 netmask 0xfffffffc broadcast 10.15.0.3
Opened by PID 1278

Собственно это всё :).

openvpn: одна подсеть по разные стороны: 5 комментариев

  1. иван

    Спасибо, всё сделал по инструкции и отлично завелось.
    Но остался один вопрос: можно ли интерфейсу tap0 давать такой-же айпи как у fxp0 или он обязательно должен быть другим.

  2. Ulukbek

    Спасибо за столь лаконичный и эффективный метод. С его помощью соединил две локалки. Работает отменно. Возможно ли добавление еще нескольких сетей. Буду признателен за ответ.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *