Организуем локальную сеть по VPN (L2 мост)


Recommended Posts

Добрый день, не подскажите не сведущему, как организовать TAP интерфейс и объединить его в мост для OpenVPN.

Хочется организовать VPN канал с "сетевым окружением", заранее благодарен за любые ответы по теме

 

Поправил название темы, т.к. сейчас проблема с передачей broadcast через brctl (bridge-utils)

 

Разобрался, читаем как все это настроить

Edited by Guest
Link to post
Share on other sites
Добрый день, не подскажите не сведущему, как организовать TAP интерфейс и объединить его в мост для OpenVPN.

Хочется организовать VPN канал с "сетевым окружением", заранее благодарен за любые ответы по теме

OpenVPN сам поднимает свои интерфейсы.

Link to post
Share on other sites

Понял. У нас это ("быть удалённой машиной, но частью локальной сети") реализавано на ospf (пакет quagga).

 

Но всё равно, приведу ссылку, я уже выкладывал во вражеской ветке, скрипт который стартует openvpn.

 

Как видно, интерфейсы стартуют.

 

h_1386393163_2131211_8f23840d30.jpeg

Link to post
Share on other sites

Читал эту статью и эту

из проделанного:

ipkg install quagga

переименовал ospfd.conf.sample в ospfd.conf, то же с zebra.conf и vtysh.conf

изменил vtysh.conf на

service integrated-vtysh-config
hostname disk
username root zabra

log file /var/log/quagga/quagga.log

line vty

 

стартанул /etc/sysconfig/quagga/S50quagga

после этого

# telnet localhost 2604
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.

Hello, this is Quagga (version 0.99.15).
Copyright 1996-2005 Kunihiro Ishiguro, et al.

User Access Verification
Password:
ospfd# enable
ospfd# conf t
ospfd(config)# router ospf
ospfd(config-router)# ospf router-id 192.168.1.110
ospfd(config-router)# network 10.1.1.1/30 area 0
ospfd(config-router)# network 192.168.1.1/30 area 0
ospfd(config-router)# write
Configuration saved to /opt/etc/quagga/ospfd.conf

 

дальше смотрим

Disk> vtysh
% Unknown command: username root zebra

Hello, this is Quagga (version 0.99.16).
Copyright 1996-2005 Kunihiro Ishiguro, et al.

quagga-router# show  interface
Interface eth0 is up, line protocol detection is disabled
 index 2 metric 1 mtu 1500
 flags: 
 HWaddr: 00:22:32:08:d6:3c
 inet 192.168.1.110/24 broadcast 192.168.1.255
 inet6 fe80::222:32ff:fe08:d63c/64
Interface lo is up, line protocol detection is disabled
 index 1 metric 1 mtu 16436
 flags: 
 inet 127.0.0.1/8
 inet6 ::1/128
quagga-router#

 

интерфейса tap0 нету, его где то включить надо?

 

прописал в /etc/quagga/zebra.conf и /etc/quagga/ospfd.conf, получил ifconfig:

Interface tap0 is down
 pseudo interface

куда копать? :smile:

Link to post
Share on other sites

Так, я чуть чуть тупанул. Ладно, дописал в /usr/syno/etc/packages/VPNCenter/openvpn/openvpn.conf

 

dev tap0

 

интерфейс стартанул

tap0      Link encap:Ethernet  HWaddr 22:27:9C:D8:10:78
         inet addr:10.8.0.1  Bcast:10.8.0.255  Mask:255.255.255.0
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:0 errors:0 dropped:0 overruns:0 frame:0
         TX packets:29 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:100
         RX bytes:0 (0.0 b)  TX bytes:5229 (5.1 Kb)

 

осталось бридж сделать, пока проделал это:

ipkg install bridge-utils

 

Осталось найти где находится это:

Положим, eth2 — интерфейс, к которому подключена локальная сеть, с назначенным адресом 192.168.168.254. Его настройка выглядела примерно так:

 config_eth2=( "192.168.168.254/24" )

Поскольку он будет участвовать в мосте, ему не нужно назначать адреса. Также, в мосте участвует вновь создаваемый виртуальный интерфейс tap0, которому тоже не назначается никакого адреса. Адрес, который использовался eth2, назначается теперь мосту br0:

 config_eth2=( "null" )

 tuntap_tap0="tap"
 config_tap0=( "null" )

 depend_br0() {
   need net.tap0 net.eth2
 }

 # указываем существующие интерфейсы, объединяя их в мост
 bridge_br0="eth2 tap0"
 # либо, можно динамически подключать туда вновь появляющиеся интерфейсы
 #bridge_add_eth2="br0"

 config_br0=( "192.168.168.254/24" )

Link to post
Share on other sites
стартанул /etc/sysconfig/quagga/S50quagga
То ли у тебя не XPEnology, то ли у меня... т.к. у меня тут /opt/etc/init.d/S50quagga.

 

Скидывай zebra.conf, ospfd.conf и ifconfig -a. Я примерно понял что ты пытаешься сделать.

Link to post
Share on other sites

это я откуда то неверно скопировал, путь тот что ты указал

 

Резюмирую - я теперь не уверен, из-за наличия quagga ли поднялся интерфейс tap0 или из-за того, что я его прописал в конфиге openvpn...

Итак, сейчас имею следующее:

Disk> ifconfig
eth0      Link encap:Ethernet  HWaddr 00:22:32:08:D6:3C
         inet addr:192.168.1.110  Bcast:192.168.1.255  Mask:255.255.255.0
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:82671 errors:0 dropped:0 overruns:0 frame:0
         TX packets:76970 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:1000
         RX bytes:21923257 (20.9 Mb)  TX bytes:20728868 (19.7 Mb)

lo        Link encap:Local Loopback
         inet addr:127.0.0.1  Mask:255.0.0.0
         UP LOOPBACK RUNNING  MTU:16436  Metric:1
         RX packets:120725 errors:0 dropped:0 overruns:0 frame:0
         TX packets:120725 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:0
         RX bytes:15806384 (15.0 Mb)  TX bytes:15806384 (15.0 Mb)

tap0      Link encap:Ethernet  HWaddr 22:27:9C:D8:10:78
         inet addr:10.8.0.1  Bcast:10.8.0.255  Mask:255.255.255.0
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:0 errors:0 dropped:0 overruns:0 frame:0
         TX packets:816 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:100
         RX bytes:0 (0.0 b)  TX bytes:105993 (103.5 Kb)

 

насколько я всё понял из этой статьи, теперь нужно объединить интерфейсы eth0 и tap0 в бридж. Но как то не нашел файл интерфейсов (типа /etc/network/interfaces). Бридж создаст quagga?

 

zebra.conf

! -*- zebra -*-
!
! zebra sample configuration file
!
! $Id: zebra.conf.sample,v 1.1 2002/12/13 20:15:30 paul Exp $
!
hostname Router
password zebra
enable password zebra
!
! Interface's description. 
!
interface lо
interface eth0

!
!interface sit0
! bandwidth
!multicast

!
! Static default route sample.
!
!ip route 0.0.0.0/0 203.181.89.241
!

!log file zebra.log

 

ospfd.conf

!
! Zebra configuration saved from vty
!   2013/12/13 00:00:52
!
hostname ospfd.server
password zebra
log stdout
!
!
!
interface eth0
interface lo
!
! Эти настройки сети я не подтверждаю (взял из одной статьи)
router ospf
ospf router-id 10.1.1.1
redistribute connected route-map Local_Network
network 10.1.1.1/24 area 0.0.0.0
network 192.168.1.1/16 area 0.0.0.0
area 0.0.0.0 authentication message-digest
!
line vty
!

Link to post
Share on other sites

Остановился пока на работе бриджа (или его не работе)

Делаю пока так:

insmod /lib/modules/stp.ko

insmod /lib/modules/bridge.ko

brctl addbr br0

brctl addif br0 eth0 tap0

 

сам bridge-utils интерфейс не создает, tap0 появляется после запуска openvpn, далее выполняю скрипт:

case "$1" in
 start)

insmod /lib/modules/stp.ko
insmod /lib/modules/bridge.ko

ifconfig tap0 0.0.0.0 promisc up

ifconfig eth0 0.0.0.0 promisc up

brctl addbr br0

brctl addif br0 eth0

brctl addif br0 tap0

brctl stp br0 on

ifconfig br0 192.168.1.110 netmask 255.255.255.0 broadcast 192.168.1.255 promisc up
route add default gw 192.168.1.1 dev br0
route add -net 192.168.1.0 netmask 255.255.255.0 dev br0
# /bin/echo "Restarting network services"
# /usr/syno/etc.defaults/rc.d/S95sshd.sh restart

;;

stop)
ifconfig br0 down
brctl delbr br0

ifconfig eth0 192.168.1.110 netmask 255.255.255.0 broadcast 192.168.1.255

;;
*)

;;
esac
exit 0

 

поднимается tap0 и собственно мост br0.

 

в конфиге сервера

/usr/syno/etc/packages/VPNCenter/openvpn/openvpn.conf

push "route 192.168.1.0 255.255.255.0"
push "route 192.168.1.255 255.255.255.255"
push "route 192.168.1.0 255.255.255.255"
dev tap0
#management 127.0.0.1 1195
local 192.168.1.110

dh /var/packages/VPNCenter/target/etc/openvpn/keys/dh1024.pem
ca /var/packages/VPNCenter/target/etc/openvpn/keys/ca.crt
cert /var/packages/VPNCenter/target/etc/openvpn/keys/server.crt
key /var/packages/VPNCenter/target/etc/openvpn/keys/server.key

#server 192.168.1.0 255.255.255.0
server-bridge 192.168.1.110 255.255.255.0 192.168.1.200 192.168.1.220

client-to-client

max-clients 5

#client-config-dir /usr/syno/etc/packages/VPNCenter/openvpn/ipp.txt
#route 192.168.1.0 255.255.255.0

user nobody
group nobody
persist-tun
persist-key

verb 3

#log-append /var/log/openvpn.log
#push "dhcp-option WINS 10.8.0.1

keepalive 10 60
reneg-sec 0
comp-lzo

plugin /var/packages/VPNCenter/target/lib/radiusplugin.so /var/packages/VPNCenter/target/etc/openvpn/radiusplugin.cnf 
client-cert-not-required 
username-as-common-name
duplicate-cn

 

подключаюсь, пинг до сервера и сетью за ним идут, из той сети пинг идет до меня, но netbios имена не проходят (в лучшем случае пингуется по имени сам сервер), такие дела!

 

Может быть у кого то есть мысли по этому поводу??

 

Да, в /etc/stsctl.conf добавил

net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-ip6tables = 0
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-arptables=0
net.ipv4.conf.br0.proxy_arp_pvlan=1
net.ipv4.conf.tap0.proxy_arp_pvlan=1
net.ipv4.conf.eth0.proxy_arp_pvlan=1
net.ipv4.conf.default.proxy_arp_pvlan=1
net.ipv4.conf.all.proxy_arp_pvlan=1
net.ipv4.conf.all.proxy_arp=1
net.ipv4.conf.default.proxy_arp=1
net.ipv4.conf.br0.proxy_arp=1
net.ipv4.conf.tap0.proxy_arp=1
net.ipv4.conf.eth0.proxy_arp=1

Link to post
Share on other sites

Получилось!Кроме всего прочего ошибка была в /etc/stsctl.conf, убрал все лишнее, что дописывал, осталось:

kernel.panic=3
kernel.sem=250 32000 32 256

# Убрать различия между пользователями LAN и пользователями bridged VPN
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-ip6tables = 0

 

Попозже напишу инструкцию попонятней

Link to post
Share on other sites

В nix я не профи, поэтому в описание буду вставлять вырезки из других статей, дабы не исказить чего-нибудь

Предположим, что имеется офис с локальной сетью, используется IP-подсеть 192.168.168.0/24. В эту локальную сеть мы включим домашних пользователей, то есть они будут иметь адрес из этой же самой подсети. Необходимо убедиться, что у них «дома» не встречается данная подсеть, и что никакие системы в локальной сети не имеют адресов из диапазона, который мы выделим для удалённых пользователей.

[spoiler=Конфигурация моей сети]Локальная сеть с сервером synology 192.168.10.0/24 (т.е. от 192.168.10.1 до 192.168.10.254)

Шлюз в сети с сервером sinology 192.168.10.10

Моя локальная сеть 192.168.1.0/24 (т.е. от 192.168.1.1 до 192.168.1.254)

VPN адрасация 192.168.10.0/24

 

Программы

Ставим ipkg

Инструкция (http://www.synology-forum.ru/index.php?showtopic=1632), я ставил дистрибутив http://ipkg.nslu2-linux.org/feeds/optwa ... 7_i686.xsh

И пакет обслуживания моста bridge-utils

Ipkg install bridge-utils

 

Конфигурация сервера

Путь /usr/syno/etc/packages/VPNCenter/openvpn/openvpn.conf

[spoiler=Файл openvpn.conf]dev tap0

 

#отвечает за видимость клиентов в окне VPNServer "список подключений"

management 127.0.0.1 1195

 

server-bridge 192.168.10.110 255.255.255.0 192.168.10.200 192.168.10.230

 

dh /var/packages/VPNCenter/target/etc/openvpn/keys/dh1024.pem

ca /var/packages/VPNCenter/target/etc/openvpn/keys/ca.crt

cert /var/packages/VPNCenter/target/etc/openvpn/keys/server.crt

key /var/packages/VPNCenter/target/etc/openvpn/keys/server.key

 

max-clients 30

 

client-to-client

 

#по моему привязка IP к клиентам не работает

ifconfig-pool-persist /usr/syno/etc/packages/VPNCenter/openvpn/ipp.txt

 

comp-lzo

 

persist-tun

persist-key

 

verb 3

 

#log-append /var/log/openvpn.log

 

keepalive 10 60

reneg-sec 0

 

plugin /var/packages/VPNCenter/target/lib/radiusplugin.so /var/packages/VPNCenter/target/etc/openvpn/radiusplugin.cnf

client-cert-not-required

username-as-common-name

duplicate-cn

 

Создаем сетевой мост

Путь /opt/etc/init.d/bridge

[spoiler=Создаем файл bridge (права доступа 0755)]#!/bin/sh

 

case "$1" in

start)

 

#закоментируем, подгрузим эти библиотеки тут /volume1/@appstore/VPNCenter/scripts/openvpn.sh

#insmod /lib/modules/stp.ko

 

#insmod /lib/modules/bridge.ko

 

ifconfig tap0 0.0.0.0 promisc up

 

ifconfig eth0 0.0.0.0 promisc up

 

brctl addbr br0

 

brctl addif br0 eth0

 

brctl addif br0 tap0

 

#адрес сервера sinology в локальной сети 192.168.10.110

ifconfig br0 192.168.10.110 netmask 255.255.255.0 broadcast 192.168.10.255 promisc up

 

#адрес шлюза в локальной сети с сервером synology 192.168.10.10

route add default gw 192.168.10.10 dev br0

 

;;

 

stop)

 

ifconfig br0 down

 

ifconfig tap0 down

 

brctl delbr br0

 

ifconfig eth0 192.168.10.110 netmask 255.255.255.0 broadcast 192.168.10.255

 

route add default gw 192.168.10.10 dev eth0

 

;;

*)

 

;;

 

esac

exit 0

 

Далее идем сюда

Путь /volume1/@appstore/VPNCenter/scripts/openvpn.sh

[spoiler=Файл openvpn.sh]Находим строку KERNEL_MODULES="x_tables.ko ip_tables.ko … добавляем в конец stp.ko bridge.ko"

Ниже находим строки и дописываем:

echo "Starting openvpn ..."

${PKG_TARGET}/sbin/openvpn --daemon --cd ${CONF_DIR} --config ${OPENVPN_CONF} --writepid /var/run/ovpn_server.pid

 

# создаем bridge

/opt/etc/init.d/bridge start

 

# коментируем эту строку, чтобы не мешала трафику ходить через мост

# /sbin/iptables -t nat -A POSTROUTING -s ${LOCALIP}/24 -j MASQUERADE

 

#touch a temp file for UI check

 

Еще ниже:

fi

 

${PKG_TARGET}/scripts/radiusd.sh stop

 

#delete USER_CONF_TMP_FILE

if [ -e ${USER_CONF_TMP_FILE} ]; then

/bin/rm -rf ${USER_CONF_TMP_FILE} 2>/dev/null

fi

 

# дописываем

/opt/etc/init.d/bridge stop

 

;;

restart)

 

Теперь мост будет создаваться\удаляться при старте\остановке openvpn сервера

 

Настройка фильтрования

Я сделал так: открываем /etc/sysctl.conf

И дописываем

net.bridge.bridge-nf-call-iptables = 0

net.bridge.bridge-nf-call-ip6tables = 0

[spoiler=или читаем подробнее]Поскольку мы используем мост, есть несколько особенностей организации фильтрования пакетов. Например, не все проходящие пакеты могут вообще оказаться IPv4. Для настройки работы моста в ядре существует несколько параметров:

 

Переменные этой группы сохраняются в файлах директории /proc/sys/net/bridge/. Их можно также настраивать в /etc/sysctl.conf, тогда они все получат префикс «net.brigde.»

bridge-nf-call-arptables

Логическая переменная bridge-nf-call-arptables управляет передачей трафика ARP в цепочку FORWARD пакетного фильтра arptables. Установленное по умолчанию значение 1 разрешает передачу пакетов фильтрам, 0 – запрещает.

bridge-nf-call-iptables

Логическая переменная bridge-nf-call-iptables управляет передачей проходящего через мост трафика IPv4 в цепочки iptables. Используемое по умолчанию значение 1 разрешает передачу пакетов для фильтрации, 0 – запрещает.

bridge-nf-call-ip6tables

Действие аналогично предыдущему, только оно настраивает передачу трафика IPv6 для фильтрования в цепочки ip6tables.

bridge-nf-filter-vlan-tagged

Логическая переменная bridge-nf-filter-vlan-tagged определяет возможность передачи трафика IP/ARP с тегами VLAN программам фильтрации пакетов (arptables/iptables). Значение 1 (установлено по умолчанию) разрешает передачу пакетов с тегами VLAN программам фильтрации, 0 – запрещает.

Кроме этого, конфигурация ядра должна разрешать передачу пакетов на фильтрацию iptables, т.е. bridge-nf-call-iptables=1 и bridge-nf-call-ip6tables=1 (если вы используете IPv6).

После можете использовать, например, такие правила для фильтрования:

iptables -A FORWARD -p tcp --dport 22 -m physdev --physdev-in eth1 --physdev-out eth0 -j ACCEPT

 

Поподробнее про настройку фильтрации между портами поста можно почитать в статье Building bridges with Linux

 

Если вы не хотите делать никаких различий между пользователями LAN и пользователями bridged VPN, вы можете просто выключить эти параметры в ядре (они включены по умолчанию):

echo "net.bridge.bridge-nf-call-iptables = 0" >> /etc/sysctl.conf

echo "net.bridge.bridge-nf-call-ip6tables = 0" >> /etc/sysctl.conf

 

Немного лоска

Чтобы оснастка VPN сервера не ругалась на отсутствующий eth0 интерфейс, меняем в:

Путь /usr/syno/etc/packages/VPNCenter/synovpn.conf

[spoiler=Файл synovpn.conf]vpninterface=br0

runopenvpn=yes

 

Вообще при создании моста в оснастке синолоджи появляется ошибка в окне VPNServer «настройки сети» и в окне «Сеть» панели управления, т.к. берут они сведения все с того же eth0 который уже находится в бридже. Где и что поправить, чтобы системе объявлялся новый интерфейс br0 взамен eth0 я пока не нашел, может кто подскажет?

Так же не стоит менять адрес сервера из оснастки VPNServer, конфиг она отредактирует по своему. Конечно хотелось бы обучить ее этому, но это все время!

 

Настройка клиента

Путь C:\Program Files\OpenVPN\config\openvpn.ovpn

[spoiler=Файл openvpn.ovpn]client

nobind

dev tap

proto udp

remote «адрес сервера» 1194

resolv-retry infinite

persist-key

persist-tun

user nobody

group nogroup

pull

script-security 2

ca ca.crt

comp-lzo

ns-cert-type server

reneg-sec 0

auth-user-pass

 

Связывать в мост ТАР интерфейс (TAP-Windows Adapter V9) и интерфейс локальной сети не нужно

 

Все это делалось на прошивке synoboot-trantor-4.3-3810-v1.0

За основу были взяты статьи:

[spoiler=открыть]VPN-мост в локальную сеть (http://habrahabr.ru/post/67238/)

Локальная сеть глобального масштаба (http://habrahabr.ru/company/webnames/blog/162193/)

Qnap: Gigabit Bridged Connection (http://orion195.muppetslab.org/qnap-gigabit-bridged-connection)

А так же:

Инструкция по установке IPKG (http://www.synology-forum.ru/index.php?showtopic=1632) дистрибутив: http://ipkg.nslu2-linux.org/feeds/optwa ... 7_i686.xsh

Файл конфигурации OpenVPN сервера (http://www.lissyara.su/doc/man/safety/openvpn/)

man:brctl (http://xgu.ru/wiki/man:brctl)

Debian & bridge (http://www.linux.org.ru/forum/admin/4868575)

Настройка сети (ifconfig, route) (http://linuxforum.ru/viewtopic.php?id=225)

Добавляем маршрут в Windows. Синтаксис route.exe (http://it2web.ru/index.php/rras/126--windows-routeexe)

Cоздание сети для виртуальных машин (http://www.thislinux.org/2012/06/guests-networking.html)

Устанавливаем OpenVPN сервер на Synology (http://forum.zyxmon.org/topic51-ustanavlivaem-openvpn-server-na-synology.html)

 

Отдельное благодарю k0ste

 

Файлы с изменениями

Настройка openvpn в режиме L2 моста на synology.rar

Link to post
Share on other sites

Познавательно, спасибо! Только вопрос, для чего нужно чтоб у удалённых пользователей была внутренняя адресация?

Я вот тоже думал над похожей, но немного другой задачей...

Дано - Есть две одинаковые сети (две квартиры с сетями 192.168.50.0/24), необходимо объединить их в одну локальную с единой адресацией, но со своими шлюзами.

Нужно настроить на каждом шлюзе свой диапазон DHCP, и ограничить (можно через iptables) DHCPREQUEST в рамках одной квартиры, ну и настроить статическую маршрутизацию (правда по маске сети не получится). В принципе всё возможно, вот только чем осуществлять соединение (если на одном конце будет сервер с Xpernology а на другом обычный роутер). Очень понравилась возможность бросать L2 тоннель через ssh (http://www.khanh.net/blog/archives/51-u ... e-VPN.html), но на сколько это поддерживают современные роутеры, и пролезет ли broadcast?

Link to post
Share on other sites

Если нужно объединить две сети, без отдельной авторизации каждого компьютера, то:

- сети должны быть в одном адресном пространстве, например 192.168.1.0

- в моем примере, в конфиге сервера (файл openvpn.conf) изменить строчку:

server-bridge 192.168.10.110 255.255.255.0 192.168.10.200 192.168.10.230

на

server-bridge 10.8.0.1 255.255.255.0 10.8.0.200 10.8.0.230

- и нужен мост между tap и eth интерфейсами на стороне клиента

Link to post
Share on other sites
Дано - Есть две одинаковые сети (две квартиры с сетями 192.168.50.0/24), необходимо объединить их в одну локальную с единой адресацией, но со своими шлюзами.
У вас сети общаются как? Зачем вам что-то городить если у вас два DHCP сервера? Один пусть живет в 192.168.50.1-192.168.50.63, другой в 192.168.50.64-192.168.50.127 при маске 26.
Link to post
Share on other sites

Всё затевается ради общего L2 сегмента, простыми словами чтоб через DLNA на NASе, который стоит в первой квартире, можно было смотреть фильмы на телевизоре из второй. :grin:

Link to post
Share on other sites