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
compress 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
compress 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

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

Добавить комментарий для skeletor Отменить ответ

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