Прозрачное Соединение Двух Удаленных Локальных Сетей (Remote Bridging)
5 Apr2006

Часто возникает потребность в соединении нескольких географически разрозненных сетей (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-интерфейсах
шлюзовых машин. Также, в случае надобности возможно включение/выключение шифрования и сжатия данных, проходящих через созданный тунель.