Недавно подкинули интересную задачку: нужно соединить по 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
Собственно это всё :).
5 коментарів “openvpn: одна подсеть по разные стороны”
Спасибо, всё сделал по инструкции и отлично завелось.
Но остался один вопрос: можно ли интерфейсу tap0 давать такой-же айпи как у fxp0 или он обязательно должен быть другим.
Обязательно другим.
Спасибо огромное при помощи это статьи соеденил freebsd linux
Спасибо за столь лаконичный и эффективный метод. С его помощью соединил две локалки. Работает отменно. Возможно ли добавление еще нескольких сетей. Буду признателен за ответ.
Думаю да.