+7 (812) 325 84 00

+7 (499) 322 07 96

Гостевой роутер для виртуальных стендов

По работе мне постоянно приходится иметь дело с виртуальными стендами. Бывает и так, что приходится моделировать среды из нескольких IP-подсетей, между которыми необходимо обеспечить маршрутизацию пакетов. В статье описывается часть моих решений применительно к хост-системе Windows, однако, с незначительными изменениями, они могут применяться и в других средах (VMware vSphere/ESXi, например).

1. Хост-система.
Традиционно я использую в качестве хост-системы Windows Server, на которой поднимается либо Hyper-V, либо VMware Workstation/Player, с необходимым числом виртуальных сетей. Долгое время я пытался организовывать маршрутизацию между гостевыми сетями через хост c с поднятой на нем службой RRAS, однако в конце концов от этой идеи пришлось отказаться. Взаимодействие гипервизора даже с RRAS на одной системе порождает трудноуловимые сетевые проблемы; если же пытаться использовать  решения типа TMG либо Kerio (имеющие, в числе прочего, функционал программной маршрутизации), добавляются еще и трудности сосуществования гипервизора и достаточно глубокого брандмауэра. И, в любом случае, такая маршрутизация нормально не заработает без NAT (т.е. объявления одного из интерфейсов хост-системы “внешним”), что на хосте не всегда приемлемо. Проблем может добавить еще и нагромождающийся на все это хостовой антивирусный модуль, неважно даже, какой именно - такие антивирусы обычно имеют собственный сетевой компонент.
Решение, к которому я пришел за долгие годы экспериментов – организовывать роутер в гостевой VM. Гостевая VM создается с необходимым количеством сетевых интерфейсов (multihomed), и в ней уже поднимается маршрутизатор. Мы рассмотрим как вариант с гостевой ОС Windows Server 2016 с RRAS, так и с гостевым маршрутизатором на CentOS (любой UNIX можно так приспособить; у меня CentOS только потому, что он гарантированно работает в Hyper-V).
Отдельное замечание касается файрволльного модуля в антивирусе хост-системы. Трафик даже между гостевыми виртуальными сетями, так или иначе, через него проходит. Поэтому, может понадобиться некая настройка брандмауэра антивируса для корректной обработки трафика, не подпадающего под правила - “Unmatched IP Traffic” (правила относятся к хост-системе). В Symantec Endpoint Protection клиенте, например, эта настройка выглядит так:

Fig 1. SEP FW Settings.jpg
Переходим к конфигурациям VM.
2. Виртуальный маршрутизатор на Windows Server 2016 RRAS, гипервизор VMware Workstation 12.
Имеем хост-систему Windows Server с установленной VMware Workstation 12 и неким набором виртуальных машин в разных подсетях. Конфигурация виртуальных сетей VMware, к примеру, такая:

Fig 2. VMware virtual networks.jpg

Для стендовых виртуальных машин мы используем сети VMNet1 (192.168.121.0/24), VMNet2 (192.168.122.0/24), VMNet3 (192.168.44.0/24). VMNet0 – это мост в физическую сеть (используются адреса в подсети 192.168.250.0/24). Роутер VM будет осуществлять маршрутизацию между ними всеми, поэтому у созданной VM программного RRAS-маршрутизатора (ROUTER1) четыре интерфейса:

Fig 3. Router VM network settings.jpg

В VM ROUTER1 устанавливаем операционную систему Windows Server 2016. На ней поднимаем роль Remote Access, служба Web Application Proxy, как и компонент DirectAccess, нам не понадобятся:
Fig 4. OS Roles.jpg

После установки конфигурируем службу RRAS и запускаем ее. В задачу узла входит только маршрутизация пакетов, поэтому RRAS у нас работает в режиме LAN Routing Only:

Fig 5. RRAS Settings.jpg

Ни маршрутизация по требованию, ни удаленный доступ VPN нам не нужны. Сетевые интерфейсы в оснастке RRAS выглядят так:

Fig 6. Interfaces.jpg

(видно, что Ethernet0 – это мост в физическую сеть, то есть, если можно так выразиться, “uplink”).

Конфигурация интерфейсов по Ipconfig / all:
Windows IP Configuration
Ethernet adapter Ethernet0:
  Connection-specific DNS Suffix  . :
  Link-local IPv6 Address . . . . . : fe80::f9c2:c00d:b442:efc0%18
  IPv4 Address. . . . . . . . . . . : 192.168.250.10
  Subnet Mask . . . . . . . . . . . : 255.255.255.0
  Default Gateway . . . . . . . . . : 192.168.250.1
Ethernet adapter Ethernet1:
  Connection-specific DNS Suffix  . :
  Link-local IPv6 Address . . . . . : fe80::f875:715a:74c2:8463%10
  IPv4 Address. . . . . . . . . . . : 192.168.44.2
  Subnet Mask . . . . . . . . . . . : 255.255.255.0
  Default Gateway . . . . . . . . . :
Ethernet adapter Ethernet2:
  Connection-specific DNS Suffix  . :
  Link-local IPv6 Address . . . . . : fe80::bdd5:7d16:7b99:b456%14
  IPv4 Address. . . . . . . . . . . : 192.168.122.2
  Subnet Mask . . . . . . . . . . . : 255.255.255.0
  Default Gateway . . . . . . . . . :
Ethernet adapter Ethernet3:
  Connection-specific DNS Suffix  . :
  Link-local IPv6 Address . . . . . : fe80::58b8:5340:3b0b:9593%2
  IPv4 Address. . . . . . . . . . . : 192.168.121.2
  Subnet Mask . . . . . . . . . . . : 255.255.255.0
  Default Gateway . . . . . . . . . :

Только Ethernet0 имеет шлюз по умолчанию. Казалось бы, все должно работать, однако, у Windows Server RRAS есть одна особенность – не удается заставить работать маршрутизацию без NAT (в Linux это возможно). Нам нужен интерфейс, объявленный внешним с точки зрения трансляции адресов. Идеальный кандидат на эту роль – Ethernet0. Поэтому, его мы объявляем как Public, а остальные – как Private:

Fig 7. NAT Settings.jpg

Таблица маршрутизации, выдаваемая через команду route print, получается такая (строки протокола IPv6 для краткости не приводим):
===========================================================================
Interface List
18...00 0c 29 01 88 59 ......Intel® 82574L Gigabit Network Connection
10...00 0c 29 01 88 63 ......Intel® 82574L Gigabit Network Connection #2
14...00 0c 29 01 88 6d ......Intel® 82574L Gigabit Network Connection #3
 2...00 0c 29 01 88 77 ......Intel® 82574L Gigabit Network Connection #4
 1...........................Software Loopback Interface 1
16...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter
15...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter #2
 5...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter #3
17...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter #4
===========================================================================
IPv4 Route Table
===========================================================================
Active Routes:
Network Destination  Netmask    Gateway Interface  Metric
   0.0.0.0    0.0.0.0    192.168.250.1   192.168.250.10    257
 127.0.0.0  255.0.0.0   On-link   127.0.0.1    331
 127.0.0.1  255.255.255.255   On-link   127.0.0.1    331
 127.255.255.255  255.255.255.255   On-link   127.0.0.1    331
    192.168.44.0    255.255.255.0   On-link 192.168.44.2    281
    192.168.44.2  255.255.255.255   On-link 192.168.44.2    281
  192.168.44.255  255.255.255.255   On-link 192.168.44.2    281
   192.168.121.0    255.255.255.0   On-link     192.168.121.2    281
   192.168.121.2  255.255.255.255   On-link     192.168.121.2    281
 192.168.121.255  255.255.255.255   On-link     192.168.121.2    281
   192.168.122.0    255.255.255.0   On-link     192.168.122.2    281
   192.168.122.2  255.255.255.255   On-link     192.168.122.2    281
 192.168.122.255  255.255.255.255   On-link     192.168.122.2    281
   192.168.250.0    255.255.255.0   On-link    192.168.250.10    257
  192.168.250.10  255.255.255.255   On-link    192.168.250.10    257
 192.168.250.255  255.255.255.255   On-link    192.168.250.10    257
 224.0.0.0  240.0.0.0   On-link   127.0.0.1    331
 224.0.0.0  240.0.0.0   On-link     192.168.122.2    281
 224.0.0.0  240.0.0.0   On-link    192.168.250.10    257
 224.0.0.0  240.0.0.0   On-link     192.168.121.2    281
 224.0.0.0  240.0.0.0   On-link 192.168.44.2    281
 255.255.255.255  255.255.255.255   On-link   127.0.0.1    331
 255.255.255.255  255.255.255.255   On-link     192.168.122.2    281
 255.255.255.255  255.255.255.255   On-link    192.168.250.10    257
 255.255.255.255  255.255.255.255   On-link     192.168.121.2    281
 255.255.255.255  255.255.255.255   On-link 192.168.44.2    281
===========================================================================
Persistent Routes:
 Network Address    Netmask  Gateway Address  Metric
         0.0.0.0    0.0.0.0    192.168.250.1  Default

Полученная конфигурация полностью рабочая, и позволяет VM ROUTER1 маршрутизировать пакеты между подсетями 192.168.121.0/24, 192.168.122.0/24, 192.168.44.0/24, 192.168.250.0/24, а также из первых трех подсетей в физическую сеть и, при необходимости, в Интернет. Естественно, для виртуальных машин в этих подсетях, именно интерфейсы VM ROUTER1 (то есть 192.168.121.2, 192.168.122.2 и 192.168.44.2) нужно указывать в качестве шлюзов по умолчанию.
К слову сказать, в Windows Server 2012/R2 настройки точно такие же. Компонент RRAS в Windows Server 2016 по сравнению с предыдущими версиями не изменился.

3. Виртуальный маршрутизатор на CentOS 6.4, гипервизор Windows Server 2016 Hyper- V.
Сценарий очень похожий. Хост-система Windows Server 2016 с установленной ролью Hyper-V и набором виртуальных машин в разных подсетях. В числе прочих, есть три виртуальных коммутатора типа InternalPapapach, Bugravsk и Puksyalovo, и коммутатор BRIDGED типа External (мост в физическую сеть - “uplink”):

Fig 1. HyperV virtual networks.jpg

Виртуальные сети типа Internal имеют такую адресацию: Papapach - 192.168.44.0/24, Bugravsk - 192.168.41.0/24, и Puksyalovo - 192.168.40.0/24. VM роутера UNIX (CNTR-1- ROUTER) будет осуществлять маршрутизацию между всеми ними, поэтому у нее четыре интерфейса:

Fig 2. Router VM network settings.jpg

Устанавливается ОС CentOS 6.4 с инсталл-профилем Minimal. Далее нам понадобятся следующие пошаговые руководства по конфигурированию сети, маршрутизации и NAT:
·  "Home Lab: CentOS 6.3 as a firewall and Router", http://www.itadmintools.com/2012/10/home-lab-centos-63-as-firewall-and.html;
·  "Moo Trader – IT Infrastructure", http://www.keymoo.info/trading/wp-content/uploads/2012/08/Steps-to-configure-a-CentOS-router.pdf;
·  "Linux Static IP Address Configuration", https://www.cyberciti.biz/faq/linux-configure-a-static-ip-address-tutorial.
Дополнительно про NAT:
·  "Quick-Tip: Linux NAT in Four Steps using iptables. By Frank Wiles", http://www.revsys.com/writings/quicktips/nat.html;
·  "Red Hat Enterprise Linux  4 : Security   Guide  . Chapter 7. Firewalls. 7.4. FORWARD and NAT Rules", https://www.centos.org/docs/4/html/rhel-sg-en-4/s1-firewall-ipt-fwd.html;

Конфигурация сети (вывод команды ifconfig) такая:
eth0 Link encap:Ethernet  HWaddr 00:15:5D:FA:05:07  
   inet addr:192.168.250.10  Bcast:192.168.250.255  Mask:255.255.255.0
   inet6 addr: fe80::215:5dff:fefa:507/64 Scope:Link
   UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
   RX packets:648 errors:0 dropped:0 overruns:0 frame:0
   TX packets:23 errors:0 dropped:0 overruns:0 carrier:0
   collisions:0 txqueuelen:1000
   RX bytes:54842 (53.5 KiB)  TX bytes:2260 (2.2 KiB)

eth1 Link encap:Ethernet  HWaddr 00:15:5D:FA:05:08  
   inet addr:192.168.44.2  Bcast:192.168.44.255  Mask:255.255.255.0
   inet6 addr: fe80::215:5dff:fefa:508/64 Scope:Link
   UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
   RX packets:264 errors:0 dropped:0 overruns:0 frame:0
   TX packets:96 errors:0 dropped:0 overruns:0 carrier:0
   collisions:0 txqueuelen:1000
   RX bytes:28478 (27.8 KiB)  TX bytes:15707 (15.3 KiB)

eth2 Link encap:Ethernet  HWaddr 00:15:5D:FA:05:09  
   inet addr:192.168.40.2  Bcast:192.168.40.255  Mask:255.255.255.0
   inet6 addr: fe80::215:5dff:fefa:509/64 Scope:Link
   UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
   RX packets:144 errors:0 dropped:0 overruns:0 frame:0
   TX packets:86 errors:0 dropped:0 overruns:0 carrier:0
   collisions:0 txqueuelen:1000
   RX bytes:12794 (12.4 KiB)  TX bytes:3828 (3.7 KiB)

eth3 Link encap:Ethernet  HWaddr 00:15:5D:FA:05:0A  
   inet addr:192.168.41.2  Bcast:192.168.41.255  Mask:255.255.255.0
   inet6 addr: fe80::215:5dff:fefa:50a/64 Scope:Link
   UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
   RX packets:225 errors:0 dropped:0 overruns:0 frame:0
   TX packets:65 errors:0 dropped:0 overruns:0 carrier:0
   collisions:0 txqueuelen:1000
   RX bytes:25729 (25.1 KiB)  TX bytes:9569 (9.3 KiB)

lo  Link encap:Local Loopback  
   inet addr:127.0.0.1  Mask:255.0.0.0
   inet6 addr: ::1/128 Scope:Host
   UP LOOPBACK RUNNING  MTU:16436  Metric:1
   RX packets:0 errors:0 dropped:0 overruns:0 frame:0
   TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
   collisions:0 txqueuelen:0
   RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

“Рабочими” являются интерфейсы eth0-eth3. Eth0 смотрит в физическую сеть (то есть, подключен к виртуальному коммутатору BRIDGED типа External). Остальные интерфейсы подключены к коммутаторам типа Internal, и каждый из них относится к соответствующей подсети виртуального стенда. IP-адреса этих интерфейсах указываются в других VM в качестве шлюзов по умолчанию.

Включаем NAT для интерфейса eth0. Таблица iptables (файл / etc/ sysconfig/ iptables) получается такой:

# Generated by iptables-save v1.4.7 on Mon Jan 30 23:45:45 2017
*filter
:INPUT ACCEPT [1438:192141]
:FORWARD ACCEPT [8777:3124578]
:oUTPUT ACCEPT [1745:143062]
-A FORWARD -i eth0 -j ACCEPT
-A FORWARD -o eth0 -j ACCEPT
COMMIT
# Completed on Mon Jan 30 23:45:45 2017
# Generated by iptables-save v1.4.7 on Mon Jan 30 23:45:45 2017
*nat
:PREROUTING ACCEPT [5401:731115]
:POSTROUTING ACCEPT [2490:181208]
:oUTPUT ACCEPT [0:0]
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
# Completed on Mon Jan 30 23:45:45 2017
В CentOS маршрутизация будет работать и без NAT. Однако, наличие  NAT позволяет, в случае необходимости, публиковать порты.

Вывод команды route:

Kernel IP routing table
Destination     Gateway   Genmask   Flags Metric Ref    Use Iface
192.168.44.0    *   255.255.255.0   U     0 0  0 eth1
192.168.250.0   *   255.255.255.0   U     0 0  0 eth0
192.168.40.0    *   255.255.255.0   U     0 0  0 eth2
192.168.41.0    *   255.255.255.0   U     0 0  0 eth3
link-local *   255.255.0.0     U     1002   0  0 eth0
link-local *   255.255.0.0     U     1003   0  0 eth1
link-local *   255.255.0.0     U     1004   0  0 eth2
link-local *   255.255.0.0     U     1005   0  0 eth3
default   192.168.250.1   0.0.0.0   UG    0 0  0 eth0

Шлюз по умолчанию в системе указывается только для eth0, это позволяет маршрутизировать трафик VM в Интернет.
Полученная конфигурация полностью рабочая, и по функциональности аналогична приведенной в разделе 2.

4. Заключение
Вместо программного маршрутизатора RRAS или CentOS можно было бы использовать “псевдо-аппаратный” на эмуляторе GNS3 (https://www.gns3.com). GNS3 – это полнофункциональный эмулятор Cisco, который, в отличие от Packet Tracer, можно использовать в кастомизированной виртуальной среде. Изначально он доступен в качестве VMware VM, но существуют и способы его адаптации под Hyper-V (Google в помощь). Использование GNS3 позволяет привнести в стенд еще и логику Cisco устройств - возможности для экспериментирования здесь безграничные.