Прозрачное Соединение Двух Удаленных Локальных Сетей (Remote Bridging)
Часто возникает потребность в соединении нескольких географически разрозненных сетей (ethernet) в единый broadcast domain. Такая потребность, например, может возникнуть при соединении нескольких отделений одной компании, в которой используется smb-протокол (частично основанный на широковещательных сообщениях). Также одним из вариантов использования описываемой схемы являются игровые клубы (несколько клубов одной игровой сети, будучи объединенными в
единое пространство для широковещательных запросов могут обеспечить пользователям возможность сетевой игры без наличия выделенного сервера).
В каждой из рассматриваемых сетей должен присутствовать один сервер, предназначенный для организации бриджинга. Две наших сети могут быть соединены друг с другом любыми средствами, которые позволяют передачу IP-трафика между шлюзовыми машинами данных сетей.
Технические детали: В описываемой конфигурации мы соединяем две локальных сети в одну с адресным пространством 192.168.1.0/24 (хотя физически наличие мостов предполагает полную прозрачность для протокола IP и ограничений на адресацию в полученной сети нет). На шлюзовых машинах имеется по 2 сетевых интерфейса: один (у нас – eth0) направлен в локальную сеть, и второй (eth1), используемый как транспортный для соединения сетей. После поднятия ethernet-тунеля между шлюзами обоих сетей, тунельные интерфейсы соединяются c соответствующими сетевыми интерфейсами для локальной сети при помощи мостов (bridge-interfaces). Схематически эту конфигурацию можно изобразить следующим образом:
+-------+ +-------+
| br0 | | br0 |
+-------+ +-------+
| | | |
Network 1 | | | | Network 2
----------eth0 tap0---eth1........eth1---tap0 eth0---------------
НАСТРОЙКА ШЛЮЗОВЫХ МАШИН
Примечание: В данной статье рассматривается настройка серверов под управлением ОС GNU/Linux (дистрибутив Debian Unstable). В случае использования другого дистрибутива возможно понадобятся небольшие изменения в описанной конфигурации (чаще всего в отношении сетевых настроек и системы управления пакетами).
Для начала нужно убедиться в наличии модулей tun и bridge для текущего ядра. Если их нет – пересобрать ядро с их поддержкой (опции CONFIG_TUN и CONFIG_BRIDGE).
Далее требуется создание файла устройства для поднятия тунеля:
# cd /dev
# ./MAKEDEV tun
# mkdir misc
# ln -s /dev/net /dev/misc/net
Примечание: последняя команда нужна для того, чтобы vtun в авторской сборке смог получить доступ к устройству /dev/misc/net/tun (объективную причину, по которой он ищет этот файл именно там мне выяснить не удалось).
Для поднятия ethernet-тунеля между машинами мы будем использовать программу vtun. Пакет для Debian (а также исходные тексты или пакеты для других дистрибутивов или ОС) можно скачать с сайта производителей.
После скачивания файла пакета vtun_X.Y-Z_i386.deb нужно установить его и все требуемые для дальнейшей работы пакеты:
# apt-get install bridge-utils ebtables iptables libssl0.9.6
...
# dpkg -i vtun_X.Y-Z_i386.deb
После установки vtun требуется определиться с тем, какая из сторон соединения будет ведущей (сервер), а какая ведомой (клиент). Затем на сервере и на клиенте нужно внести изменения в файлы vtund-start.conf и vtund.conf в каталоге /etc/. Ниже приведены конечные результаты редактирования файлов конфигурации на
сервере.
/etc/vtund-start.conf
----cut-here------------------------------------ --server-- 5000 ----cut-here------------------------------------
/etc/vtund.conf
----cut-here------------------------------------
options {
port 5000; # Listen on this port.
# Syslog facility
syslog daemon;
# Path to various programs
ifconfig /sbin/ifconfig;
route /sbin/route;
firewall /sbin/iptables;
ip /sbin/ip;
}
default {
compress no;
encrypt no;
speed 0;
}
rembridge {
passwd Pa$$Wd;
type ether;
proto udp;
keepalive yes;
compress no;
encrypt yes;
up {
# Connection is Up
ifconfig "%% up";
program "brctl addif br0 %%";
};
down {
# Connection is Down
ifconfig "%% down";
};
}
----cut-here------------------------------------
Файлы конфигурации для клиента:
/etc/vtund-start.conf
----cut-here------------------------------------ rembridge 10.1.1.1 -p ----cut-here------------------------------------
Примечание: В данном случае 10.1.1.1 – это транспортный адрес сервера, к
которому подключается данный клиент.
/etc/vtund.conf
----cut-here------------------------------------
options {
# Path to various programs
ifconfig /sbin/ifconfig;
route /sbin/route;
firewall /sbin/iptables;
}
korsar {
pass Pa$$Wd; # Password
type ether; # Ethernet tunnel
up {
# Connection is Up
ifconfig "%% up";
program "brctl addif br0 %%"
};
down {
# Connection is Down
ifconfig "%% down";
};
}
----cut-here------------------------------------
Для поднятия моста между сетевым интерфейсом, направленным в локальную сеть, и поднятым тунелем необходимо создать bridge-интерфейс. Для этого нужно добавить описание интерфейса br0 в файл /etc/network/interfaces:
auto br0
iface br0 inet static
address 192.168.1.199
netmask 255.255.255.0
bridge_ports eth0
Примечание: IP-адреса и маска подсети на обоих сторонах выбирается в соответствии с соглашениями в вашей локальной сети. Главное требование – уникальность этих адресов в пределах обоих соединяемых сетей. eth0 – интерфейс,
направленный в локальную сеть.
Далее необходимо поднять этот интерфейс:
# ifup br0
После поднятия bridge-интерфейса можно запускать сервер и клиент vtun.
# /etc/init.d/vtund restart
В случае правильной настройки всей конструкции мы получим на обоих шлюзах интерфейсы tap0 и br0:
# ifconfig tap0
tap0 Link encap:Ethernet HWaddr 00:FF:B2:91:CA:DE
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:701818 errors:0 dropped:0 overruns:0 frame:0
TX packets:405939 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:975889241 (930.6 MiB) TX bytes:44704104 (42.6 MiB)
# ifconfig br0
br0 Link encap:Ethernet HWaddr 00:02:44:2A:03:30
inet addr:192.168.1.199 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2660 errors:0 dropped:0 overruns:0 frame:0
TX packets:42 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:239368 (233.7 KiB) TX bytes:2338 (2.2 KiB)
#
Команда brctl позволяет нам посмотреть на статус bridge-интерфейсов:
# brctl show br0
bridge name bridge id STP enabled interfaces
br0 8000.0002442a0330 no eth0
tap0
#
После выполнения все описанных выше действий машины, находящиеся в обоих соединяемых локальных сетях смогут прозрачно общаться друг с другом. Для диагностики соединения могут служить IP-адреса на обоих bribge-интерфейсах
шлюзовых машин. Также, в случае надобности возможно включение/выключение шифрования и сжатия данных, проходящих через созданный тунель.
Related posts:
- Как настроить IP-IP-тунель между FreeBSD и Linux
- Как получить “не зависящий от провайдера” IP-адрес для домашнего сервера?
- Образовательные семинары от Google (techtalks) и Сохранение Роликов из Google Video на Локальный Диск
- Как Получить Данные Для Mrtg Не Запуская SNMP-Сервер?
- Linux Traffic Shaping За 5 Минут При Помощи htb.init

9 Responses to this entry
Would OpenVPN be suitable for this?
Afaik, openvpn does not provide ethernet encapsulation for its tunnels. If if is true, you can’t use openvpn for such configurations.
[...] Connecting Two Remote Local Networks With Transparent Bridging Technique this would be an interesting project, but I wonder what the best way to handle DHCP, because with this, I think each site’s DHCP server would be fighting with the other site. (tags: remote linux ethernet network bridging) Filed under: Quickies — Jay @ 12:18 am [...]
[...] Connecting Two Remote Local Networks: [...]
Seems like you’d get a lot of pointless broadcast traffic back and forth this way, clogging a potentially constricted tunnel. Wouldn’t it be better in most cases to route instead of bridge?
блин!
где тут кнопка раÑ?печатать?
TNX!
nice
Wow… worked perfectly for me.. Even with only one network card (eth0) on each system.
BCP – Bridge Control Protocol. Fun stuff!