Назад | Перейти на главную страницу

Как настроить безопасное соединение между несколькими подсетями

У меня следующая установка

2 x linode vps
1 x lab (physical) running 4 vps

Моя цель - сделать так, чтобы все узлы работали так, как будто они находятся в одной локальной сети. Это позволит мне изменить правила IPTable, чтобы разрешить только локальный трафик, вместо того, чтобы добавлять новую запись IPTable для КАЖДОГО сервера, которому требуется доступ к порту на целевом узле.

Я провел предварительное исследование и тестирование и, похоже, не могу найти лучшее решение для того, что я пытаюсь достичь. Я практиковался с двумя из моих лабораторных VPS, которые находятся в разных подсетях, прежде чем я начну настраивать фактический производственный VPS.

У лабораторной машины есть два физических устройства; eth0 и eth1. eth1 настроен как мост для предоставления виртуальных сетевых адаптеров VPS.

Настройка выглядит следующим образом

service-a-1 (physical node):
    eth0: 192.168.0.1
    eth1: br0
    br0:  192.168.0.2

service-a-2 (vps):
    eth0: 192.168.0.3
    eth0:0 10.0.0.1, 255.255.192.0
    eth0:1 10.0.1.1, 255.255.192.0, gw 10.0.0.1

service-a-3 (vps):
    eth0: 192.168.0.4
    eth0:0 10.0.64.1, 255.255.192.0
    eth0:1 10.0.65.1, 255.255.192.0, gw 10.0.64.1

Я использую 192.168.0.x ip addies для подключения к VPS, но 10.0.x ip addies, чтобы попрактиковаться в подключении подсетей. Моя цель с указанным выше дизайном - создать безопасный туннель между сервис-а-2 и сервис-а-3 через их IP-адреса шлюза; 10.0.0.1 и 10.0.64.1соответственно. Затем для всех других узлов в каждой подсети используйте шлюзы, для которых туннель уже установлен, поэтому мне не нужно создавать новый туннель для каждого узла в любой подсети.

Для проверки возможности подключения я использовал: ping -I 10.0.1.1 10.0.65.1, который должен имитировать обмен данными между узлом 1 в подсети 1 и узлом 1 в подсети 2.

Я пытался следовать инструкциям, изложенным в этом руководство как это казалось довольно простым, но после прочтения других сообщений я не уверен, что он действительно зашифрован, поскольку установлен режим 'gre'. Но после прочтения некоторой информации об использовании OpenSSH кажется, что для каждого узла в подсети требуется новое соединение, а не для установления единого соединения между двумя шлюзами.

После дополнительных поисков я наткнулся на статья предоставленный linode, который выглядел многообещающим, но в первых нескольких абзацах упоминалось, что OpenSSH является предпочтительным методом (по сравнению с OpenVPN) для выполнения того, что я пытаюсь сделать.

Итак, мой вопрос состоит из двух частей:

  1. Подходит ли моя логика для попытки соединить подсети друг с другом? (Установите туннель между шлюзами, затем назначьте шлюз каждому узлу в подсети)

  2. Каков предпочтительный метод создания туннеля между двумя шлюзами, который будет совместно использоваться X узлами в их соответствующих подсетях? Используете linux route, OpenSSH, OpenVPN или что-то еще?

-- Обновить --

После некоторых экспериментов мне кажется, что мне нужно установить туннель Open-SSH (для шифрования) между разными маршрутизаторами. Туннель соединит внешние IP-адреса обоих маршрутизаторов, что, как я полагаю, при правильной настройке позволит мне получить доступ к узлам за маршрутизатором на другом конце.

Меня осенило еще кое-что, допустим, у меня следующая настройка:

subnet-1: Office #1, San Diego, CA

subnet-2: Colo #1, Dallas, TX

subnet-3: Colo #1, Tokyo, Japan

subnet-4: Colo #1, Sydney, Australia

Имеет ли смысл устанавливать туннели между каждой подсетью, чтобы они действовали как виртуальная сеть? Как я уже упоминал в исходном вопросе, я делаю это для того, чтобы IPTables мог разрешить любой трафик, проходящий через 10.0.0.0/18, вместо того, чтобы вырезать iptables для каждого сервера, для которого требуется доступ с другого сервера.

Если сделать еще шаг назад, имеет ли смысл запускать IPTables на КАЖДОМ сервере, если он находится за брандмауэром? Возможно, было бы проще просто остановить IPTables на всех серверах за брандмауэром. Я серьезно отношусь к безопасности, и кажется разумным запускать IPTables на каждом узле, даже если он находится за брандмауэром. Но если кто-то получает доступ к узлу, то теоретически он может получить доступ к другим узлам, как если бы они не работали с IPTables, из-за правила 10.0.0.0/18, закрепленного на каждом сервере.

- Обновление №2 -

Итак, у меня n2n настроен следующим образом:

service-a-1 (behind router, but pinholed 55554 udp):

  IP config: 
    ifcfg-eth0:  inet addr:10.0.0.1  Bcast:10.0.63.255  Mask:255.255.192.0 HWaddr 00:1B:78:BB:91:5A

  n2n (edge) startup:
    edge -d n2n0 -c comm1 -k eme -u 99 -g 99 -m 00:1B:78:BB:91:5C -a 10.0.0.1 -l supernode1.example.com:55555 -p 55554 -s 255.255.192.0

service-a-3 (linode vps):

  IP config:
    ifcfg-eth0: inet addr:4.2.2.2  Bcast:4.2.127.255  Mask:255.255.255.0 HWaddr F2:3C:91:DF:D4:08

    ifcfg-eth0:0: inet addr:10.0.64.1  Bcast:10.0.127.255  Mask:255.255.192.0 HWaddr F2:3C:91:DF:D4:08

    n2n (server) startup:
     supernode -l 55555 -v

    n2n (edge) startup:
      edge -d n2n0 -c comm1 -k eme -u 99 -g 99 -m F2:3C:91:DF:D4:08 -a 10.0.64.1 -l supernode1.example.com:55555 -p 55554 -s 255.255.192.0

С этой настройкой я полностью ожидал, что пингую службу-а-3 (10.0.64.1) из службы-а-1 (10.0.0.1), но я продолжаю получать «сеть назначения недоступна». IPTables на обоих серверах отключен, но service-a-1 находится за брандмауэром, но настроен на разрешение ВСЕГО исходящего трафика. Есть идеи, почему я не могу пинговать между двумя подсетями, как если бы это была плоская сеть?

Вы можете упростить решение ...

Если вы ищете способ связать все эти серверы (не маршрутизаторы или шлюзы), как если бы они находились в одной плоской сети, я бы посоветовал взглянуть на n2n одноранговое предложение от ntop.

Этот инструмент позволяет перемещаться по промежуточным устройствам; полезно, если у вас нет доступа к брандмауэрам или есть сложные проблемы с маршрутизацией. В моем случае я использую n2n для мониторинга клиентских систем из центра. Он чище, чем VPN типа "сеть-сеть", и я могу обойти перекрывающиеся подсети / IP-адреса. Подумай об этом...

Редактировать:

Я рекомендую использовать вилка n2n_v2 и ручная компиляция.

Пример конфигурации n2n будет выглядеть следующим образом:

На ваше надузел, вам необходимо выбрать UDP-порт, который будет разрешен через брандмауэр перед системой надузла. Допустим, порт UDP 7655 с именем edge.mdmarra.net:

# supernode -l 7655 -f -v 
# edge -d tun0 -m CE:84:4A:A7:A3:40 -c mdmarra -k key -a 10.254.10.1 -l edge.mdmarra.net:7655

В клиентских системах у вас есть множество вариантов. Вы должны выбрать имя туннельного устройства, MAC-адрес (возможно), имя сообщества, ключ / секрет, IP-адрес и адрес: порт надузла. Я предпочитаю использовать более полную командную строку:

# edge -d tun0 -m CE:84:4A:A7:A3:52 -c mdmarra -k key -a 10.254.10.10 -l edge.mdmarra.net:7655

Их можно запускать на переднем плане для тестирования, но все функции находятся в edge команда. Я обычно помещаю это в Монит framework, чтобы обеспечить бесперебойную работу процессов.

Вы можете настроить туннель GRE и посмотреть, соответствует ли он вашим потребностям. Общая идея (очень общая) близка к решениям VPN, только без дополнительных затрат на безопасность. Это основано на моем предположении, что вам не нужна и не нужна безопасность.

Если позже вы решите добавить безопасности к ссылке, вы можете это сделать. Относительно легко реализовать PPTP-over-GRE и даже IPSEC-over-GRE.

Хотя GRE - это технология, разработанная CISCO, она ни в коем случае не является частной собственностью. Многие дистрибутивы Linux имеют необходимые инструменты для настройки туннеля GRE.

Вы можете проверить это краткое описание о PPTP-over-GRE в том виде, в каком он реализован в Arch Linux, дистрибутиве, который я использую для большинства серверов, которые я настраивал.