Я хочу подключить несколько локальных сетей, расположенных на удаленных зданиях.
На «центральном» сайте установлен компьютер Linux с OpenVPN. На каждом удаленном сайте также работает OpenVPN.
- центральный сайт имеет локальную сеть с номером 192.168.0.0/24
- несколько удаленных сайтов также пронумерованы 192.168.0.0/24
- Я не могу / не буду / не хочу / что-либо изменить нумерацию локальной сети
- У меня нет контроля над большинством удаленных OpenVPN
Затем мне нужно:
1. определить виртуальные ЛВС
2. настроить 1: 1 NAT для каждого сайта
3. 1: 1 NAT должен быть настроен на центральном маршрутизаторе
,
Таким образом, каждый сайт имеет локальную сеть 10.10.x.0 / 24.
Когда компьютер хочет, скажем, 192.168.0.44 на сайте 12, он просто должен отправить пакет на 10.10.12.44
Использование VPN не проблема для меня. В настоящее время я подключаю более 60 сайтов. Но я не нахожу простой способ сделать это 1: 1 NAT.
Вот пример пакета, отправленного с центрального сайта на удаленный сайт, и его ответного пакета:
Я провел несколько тестов с iptables NETMAP, но мне не удалось заставить его работать, потому что я не нашел способа изменить источник + назначение после решения о маршрутизации.
Я предпочитаю избегать новой функции --client-nat
OpenVPN.
Может быть, я должен заставить маршрутизацию с ip route
? Или дважды зацикливаться на сетевом стеке veth
?
Примечание: я не хочу использовать маскарад. Только 1/1 NAT.
РЕДАКТИРОВАТЬ:
Это невозможно при обычной настройке openVPN. Поскольку пакет с удаленного сайта неотличим от пакета с другого сайта: оба имеют одинаковые адреса отправителя и получателя, и оба имеют одинаковый интерфейс tun (или tap). Так что это не возможно для источника-NAT это.
Решение 1: сделать NAT на удаленных сайтах. В моем случае это невозможно. Я должен сделать это только на центральном сайте.
Решение 2: настроить один VPN для каждого удаленного сайта. Так что у меня будет по одному тюну на каждого. Я думаю, что это может быть хорошо. Не очень эффективная память, но хорошо.
Решение 3: настроить (незашифрованный) туннель внутри VPN для каждого сайта. Это даст один интерфейс для каждого. Простые туннели не являются кроссплатформенными (к моему знанию). Например, GRE или ipip или sit подходят для Linux, но на некоторых удаленных сайтах работает только один компьютер с Windows, поэтому на нем установлен openVPN. Поэтому невозможно настроить простой туннель. Другой вариант - использовать более сложный туннель (что?), Но издержки в системе и на системном администраторе могут быть больше, чем при наличии нескольких VPN
Решение 4: скомпилируйте последнюю версию openVPN, поскольку она включает функцию NAT 1: 1. Я проверяю это на этой неделе.
Ответы:
Очень простое решение:
1. использовать OpenVPN 2.3 или более позднюю (в настоящее время последняя версия 2.3-alpha) для сервера + клиентов
2. использовать опцию конфигурации OpenVPN ниже
3. не использовать ничего другого (без ipfilter, без хитростей)
На стороне сервера вам нужно вручную распределить VPN-адреса (так что никакой
server
опции, вы должны использоватьifconfig
илиifconfig-push
):route
Иpush route
иclient-nat
линии необходимы , если вы хотите общаться непосредственно между маршрутизаторами (ping 10.99.99.1
от отдаленного сайта Повсеместно на VPN). В противном случае вы можете отказаться от них.,
,
Теперь вам нужно выбрать виртуальный сетевой адрес. Я сохранил то же, что вы использовали в своем примере: 10.10.0.0/16
Вы разрешаете маршрутизацию для этого:
,
,
Теперь вы должны указать клиенту использовать NAT 1: 1:
Первая строка устанавливает адрес удаленного маршрутизатора. Остерегайтесь драйверов Windows, требующих специальных адресов.
Вторая и последняя строки позволяют удаленному маршрутизатору обмениваться данными через интерфейс 10.99.99.x.
Третья и четвертая строки делают NAT и источник 1: 1.
Пятая строка сообщает OpenVPN, что делать с соответствующими пакетами.
Этот метод позволяет подключать сайты с одинаковыми (или нет) сетевыми адресами без какого-либо теневого хоста.
источник
Я сделал нечто подобное с реальными интерфейсами, но я не понимаю, почему это не будет работать с интерфейсами VPN.
Идея состоит в том, что, поскольку у вас есть одна и та же подсеть, доступная на разных интерфейсах на этом маршрутизаторе, это усложняет маршрутизацию. В основном, когда пакет для 10.10.13.123 поступает в маршрутизатор, он перед началом маршрутизации к 192.168.0.123 подвергается DNAT, поэтому вы должны иметь возможность указать маршрутизации, что он предназначен для 192.168.0.123 на интерфейсе VPN13 .
Это можно сделать с помощью меток межсетевого экрана и правил маршрутизации, которые используют эти метки. SNAT и DNAT должны выполняться с целью брандмауэра NETMAP. Для SNAT это та же проблема: в POSTROUTING вы потеряли информацию о том, что пакет поступил с того или иного интерфейса, и все они получили адрес источника 192.168.0.x. Таким образом, вам также нужна отметка для передачи этой информации от mangle-PREROUTING к nat-POSTROUTING. Вы можете использовать ту же метку, но тогда это будет означать, что эти пакеты будут использовать эту альтернативную таблицу маршрутизации, поэтому вам придется дублировать глобальную таблицу маршрутизации на всех.
Для каждой сети вы должны сделать:
Выше мы используем первые 4 бита метки , чтобы таким образом можно было маршрутизировать до 7 сетей.
источник