- Posted in: Networks
[lang_en]
Sometimes we need to connect two or more geographically distrubuted ethernet networks to one broadcast domain. There can be two different office networks of some company which uses smb protocol partially based on broadcast network messages. Another example of such situation is computer cafes: a couple of computer cafes can provide to users more convinient environment forr playing multiplayer computer games without dedicated servers.
Both sample networks in this article need to have one *nix server for bridging. Our networks can be connected by any possible hardware that provides IP connection between them.
[/lang_en]
[lang_ru]
Часто возникает потребность в соединении нескольких географически разрозненных сетей (ethernet) в единый broadcast domain. Такая потребность, например, может возникнуть при соединении нескольких отделений одной компании, в которой используется smb-протокол (частично основанный на широковещательных сообщениях). Также одним из вариантов использования описываемой схемы являются игровые клубы (несколько клубов одной игровой сети, будучи объединенными в
единое пространство для широковещательных запросов могут обеспечить пользователям возможность сетевой игры без наличия выделенного сервера).
В каждой из рассматриваемых сетей должен присутствовать один сервер, предназначенный для организации бриджинга. Две наших сети могут быть соединены друг с другом любыми средствами, которые позволяют передачу IP-трафика между шлюзовыми машинами данных сетей.
[/lang_ru]
[lang_en]
Short description: In described configuration we are connecting two remote LANs to make them appearing as one network with 192.168.1.0/24 address space (however physically, presense of bridges in network configuration is not affecting IP protocol and is fully transparent for it, so you can freely select any address space). Both of the bridging servers has two network interfaces: one (as eth0 in our example) connested to the LAN, and second (eth1) is being used as transport to connect networks. When ethernet tunnel between gateways in both networks will be bringed up we will connect tunnel interfaces with appropriate LAN interfaces with bridge interfaces. Schematically this configuration can be following:
+-------+ +-------+ | br0 | | br0 | +-------+ +-------+ | | | | Network 1 | | | | Network 2 ----------eth0 tap0---eth1........eth1---tap0 eth0---------------
Setting Up Bridging Servers
Notice: This article describes Debian GNU/Linux servers setup. If you are using another distribution, there can be some differences in network configuration and package management, but the main idea of described actions will be the same.
First of all, we need to check if tun and bridge modules is not included in current kernel. If they are not includen, we need to rebuild kernel with CONFIG_TUN and CONFIG_BRIDGE options.
Next, we need to create tunnel device file for our tunnel:
# cd /dev # ./MAKEDEV tun # mkdir misc # ln -s /dev/net /dev/misc/net
Notice: Last command is needed to make vtun work, because authors build for debian is looking for tunnel device driver at /dev/misc/net/tun.
To create ethernet tunnel between bridging servers we will use vtun software. Debian package (and also source code and other OS packages) can be loaded from authors site.
When package file vtun_X.Y-Z_i386.deb will be downloaded, we will need to install all required packages:
# apt-get install bridge-utils ebtables iptables libssl0.9.6 ... # dpkg -i vtun_X.Y-Z_i386.deb
When vtun will be installed, we will need to select one of the bridging servers as master and second server will be slave and appropriately change vtund-start.conf and vtund.conf file in /etc/ on buth servers. Complete config files for master is following.
/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------------------------------------
Slave server config files is following:
/etc/vtund-start.conf
----cut-here------------------------------------ rembridge 10.1.1.1 -p ----cut-here------------------------------------
Notice: In this example 10.1.1.1 is transport address of master server.
/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------------------------------------
To bring up bridge between LAN ethernet interface and our newly created tunnel interface we need to create bridge interface. To complete this task we will add br0 interface description to /etc/network/interfaces file:
auto br0 iface br0 inet static address 192.168.1.199 netmask 255.255.255.0 bridge_ports eth0
Notice: IP-addresses on both sides of our bridge must be unique in both networks. eth0 is LAN interface.
Now, we need to bring this interface up:
# ifup br0
When br0 interface will be created, we will be able to start vtun.
# /etc/init.d/vtund restart
If everything was done correctly, we will see following results on both sersers (br0 and tap0 interfaces):
# 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) #
If we need to see current state of bridge interface, we can use brctl tool:
# brctl show br0 bridge name bridge id STP enabled interfaces br0 8000.0002442a0330 no eth0 tap0 #
When all of described steps will be completed, our computers in both networks will be able to communicate with each other. IP addresses on bridge interfaces can be used for troubleshooting network connection. And last, if you need, you can turn on compression or enrtyption of data within created tunnel.
[/lang_en]
[lang_ru]
Технические детали: В описываемой конфигурации мы соединяем две локальных сети в одну с адресным пространством 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-интерфейсах
шлюзовых машин. Также, в случае надобности возможно включение/выключение шифрования и сжатия данных, проходящих через созданный тунель.
[/lang_ru]