NAT: 1: 1 з декількома однаковими локальними мережами


13

Я хочу підключити кілька локальних мереж, розташованих на віддалених будинках.
На "центральному" сайті є комп'ютер Linux, на якому працює OpenVPN. На кожному віддаленому сайті також працює OpenVPN.

  1. центральний сайт має локальну мережу з номером 192.168.0.0/24
  2. кілька віддалених сайтів також пронумеровані 192.168.0.0/24
  3. Я не можу / не хочу / не хочу / що-небудь змінювати нумерацію локальної мережі
  4. У мене немає контролю над більшістю віддалених OpenVPN

Тоді мені потрібно:
1. визначити віртуальну локальну мережу
2. налаштувати NAT 1: 1 для кожного сайту
3. NAT 1: 1 має бути налаштований на центральному маршрутизаторі

LAN карта .
Отже, на кожному веб-сайті видно локальну мережу 10.10.x.0 / 24.
Коли комп'ютер хоче досягти, скажімо, 192.168.0.44 на сайті 12, він просто повинен відправити пакет до 10.10.12.44

Операція VPN не є проблемою для мене. На даний момент я підключаю 60+ сайтів. Але я не знаходжу простого способу зробити це 1: 1 NAT.

Ось приклад пакету, надісланого з центрального сайту на віддалений сайт, та його пакета відповідей:

введіть тут опис зображення

Я зробив кілька тестів з iptables NETMAP, але мені не вдається змусити його працювати, тому що я не знаходжу способу змінити джерело + призначення після рішення маршрутизації.
Я вважаю за краще уникати нової функції --client-natOpenVPN.
Можливо, мені доведеться змусити маршрутизувати ip route? Або двічі зациклюватися на мережевому стеку veth?

Примітка: я не хочу використовувати маскарад. Тільки 1/1 NAT.

РЕДАКТУВАТИ:
Це неможливо при звичайній настройці openVPN. Оскільки пакет з віддаленого сайту не відрізняється від пакета з іншого сайту: обидва мають схожі адреси джерела та місця призначення, і обидва походять з одного інтерфейсу настройки туну (або вибору). Отже, джерело NAT це неможливо.

Рішення 1: виконайте NAT на віддалених сайтах. У моєму випадку це неможливо. Я маю це робити лише на центральному сайті.

Рішення 2: встановлення однієї VPN для кожного віддаленого сайту. Тож у мене буде по одному туну для кожного. Я думаю, це може бути нормально. Не дуже ефективна пам'ять, але гаразд.

Рішення 3: встановити (незашифрований) тунель всередині VPN для кожного сайту. Це дасть один інтерфейс для кожного. Прості тунелі не є міжплатформенними (на мій погляд). Наприклад, GRE, ipip або sit є нормальними для Linux, але на деяких віддалених сайтах працює лише один комп'ютер Windows, тому на ньому встановлено openVPN. Так неможливо встановити простий тунель. Іншим варіантом є використання більш складного тунелю (який?), Але накладні витрати в системі та на системному адміністраторі можуть бути більшими, ніж наявність декількох VPN

Рішення 4: компілюйте останню версію openVPN, оскільки вона включає функцію NAT 1: 1. Я тестую це на цьому тижні.


1
Для рішення 4 вам не доведеться компілювати. Більшість основних дистрибутивів Linux склали пакети на офіційному веб-сайті openVPN. Але це не підійде для вас, оскільки функція --client-nat є простим варіантом. Тому ваші клієнти також повинні використовувати останню версію RC (і ви кажете, що не маєте контролю над віддаленими сайтами).
Григорій МОУСАТ

1
Ну, я помиляюся: функція --client-nat 100% всередині OpenVPN (я думав, що вона використовує ipfilter). Я щойно перевірив: він працює і в Windows. Дивіться моє рішення нижче.
Григорій МОУСАТ

Мені хотілося б дізнатися, чи ти колись працював над цим і що ти робив.
Майкл Грант

Відповіді:


2

Дуже основне рішення:
1. використовуйте OpenVPN 2.3 або більше (на даний момент остання версія 2.3-альфа) для сервера + клієнтів
2. використовуйте параметр конфігурації OpenVPN нижче
3. не використовуйте нічого іншого (ні ipfilter, ні хитрощі)

На стороні сервера вам потрібно вручну поширити VPN адреси (тому жодної serverопції не потрібно використовувати ifconfigабо ifconfig-push):

# /etc/openvpn/server.conf
ifconfig 10.99.99.1 10.99.99.2
route 10.99.99.0 255.255.255.0
push "route 10.99.99.0 255.255.255.0"
push "client-nat dnat 10.99.99.11 255.255.255.255 10.10.111.11"
push "client-nat dnat 10.99.99.12 255.255.255.255 10.10.112.12"
push "client-nat dnat 10.99.99.13 255.255.255.255 10.10.113.13"

routeІ push routeта client-natлінії необхідні , якщо ви хочете спілкуватися безпосередньо між маршрутизаторами ( ping 10.99.99.1від віддаленого сайту Повсюдно на VPN). Інакше ви можете їх відкинути.

.

.

Тепер ви повинні вибрати адресу віртуальної мережі. Я зберігав те саме, що ви використовували у своєму прикладі: 10.10.0.0/16
Ви дозволяєте маршрутизацію для цього:

# /etc/openvpn/server.conf
route 10.10.0.0 255.255.0.0
push "route 10.10.0.0   255.255.0.0"

.

.

Тепер ви повинні доручити клієнтові використовувати NAT: 1: 1

# /etc/openvpn/ccd/client_11
ifconfig-push 10.99.99.11 10.99.99.1
push "client-nat snat 10.99.99.11 255.255.255.255 10.10.111.11"
push "client-nat snat 192.168.0.0 255.255.255.0 10.10.11.0"
push "client-nat dnat 10.10.10.0 255.255.255.0 192.168.0.0"
iroute 10.10.11.0 255.255.255.0
iroute 10.10.111.0 255.255.255.0

Перший рядок встановлює адресу віддаленого маршрутизатора. Остерігайтеся драйвера Windows, який потребує спеціальних адрес.
Другий і останній рядки дозволяють віддаленому маршрутизатору спілкуватися зі свого інтерфейсу 10.99.99.x.
Третій та четвертий рядки виконують джерело та призначення 1: 1 NAT
П'ятий рядок повідомляє OpenVPN, що робити з відповідними пакетами.

Цей метод дозволяє підключати сайти з однаковими (або ні) локальними адресами без будь-якого тіньового хоста.


1
Простий, блискучий.
Бертран ШІЦ

Я спробував це, але не зміг змусити його працювати. Я використовую Linux з обох сторін. Щось дивно, або я щось не розумію повністю. Ваш ifconfig-push у файлі client_11 (перший рядок), чи не повинен це бути мережевою маскою для другого аргументу замість 10.99.99.1? По-друге, чому ви використовуєте цю третю мережу 10.10.111.0/24? Здається, ви намагаєтесь використовувати мережу 111 для зв'язку між сайтами, чи не можна мережу 10.10 використовувати для цього безпосередньо? Нарешті, незалежно від того, що я намагаюся, я не бачу (у tcpdump) знімка та дна, що впливають на пакети на клієнті.
Майкл Грант

Не дуже просто, але все-таки геніально.
Нейромедіатор

4

Я робив щось подібне з реальними інтерфейсами, але не можу зрозуміти, чому це не працюватиме з інтерфейсами VPN.

Ідея полягає в тому, що, оскільки у вас є одна підмережа, доступна в різних інтерфейсах цього маршрутизатора, це ускладнює маршрутизацію. В основному, коли пакет для 10.10.13.123 потрапляє в маршрутизатор, він DNATed перед маршрутизацією до 192.168.0.123, тому ви повинні мати можливість сказати маршрутизації, що він був призначений для 192.168.0.123 на інтерфейсі VPN13 .

Це можна зробити за допомогою знаків брандмауера та правил маршрутизації, які використовують ці позначки. SNAT і DNAT мають бути виконані разом із ціллю брандмауера NETMAP. Для SNAT - це та сама проблема, в POSTROUTING ви втратили інформацію про те, що пакет прийшов з того чи іншого інтерфейсу, і всі вони отримали адресу джерела 192.168.0.x. Тож вам також потрібна марка, щоб перенести цю інформацію від mangle-РЕГУЛЮВАННЯ до nat-POSTROUTING. Ви можете використовувати ту саму позначку, але тоді це означатиме, що ці пакети будуть використовувати цю альтернативну таблицю маршрутизації, тому вам потрібно буде дублювати глобальну таблицю маршрутизації для всіх.

Для кожної мережі слід зробити:

lnet=192.168.0.0/24
if10=eth0 if11=tun0 if12=tun1 if13=tun2

n=0
for site in 10 11 12 13; do
  table=$site
  net=10.10.$site.0/24
  n=$(($n + 1))
  eval "interface=\$if$site"
  inmark=$(($n * 2)) outmark=$(($n * 2 + 1))

  iptables -t nat -A PREROUTING -d "$net" -j NETMAP --to "$lnet"
  iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -m mark --mark "$inmark"/0xf -j NETMAP --to "$net"
  iptables -t mangle -A PREROUTING -i "$interface" -j MARK --set-mark "$inmark"/0xf
  iptables -t mangle -A PREROUTING -d "$net" -j MARK --set-mark "$outmark"/0xf
  ip rule add fwmark "$outmark"/0xf table "$table"
  ip route add "$lnet" dev "$interface" table "$table"
done

Вище ми використовуємо перші 4 біти позначки , щоб дозволити таким чином прокладати до 7 мереж.


1
Дякую за вашу відповідь. Я перевірив це, але він не працює. Я тестував лише одну локальну мережу, більше ніякого результату. Я використовую tcpdump для моніторингу пакетів, і коли я надсилаю пакет з віддаленого на центральний сайт, я навіть нічого не бачу (?! Як це можливо?). З вашими вказівками я намагаюся побудувати свою поетапну відповідь. Не впевнений, що мені це вдасться.
Бертран ШІЦ

2
Моя відповідь стосується лише того, що робити на центральному сайті. Я припускаю, що ви правильно налаштували маршрутизацію на інших сайтах. Наприклад, вам, ймовірно, потрібно буде додати маршрут до 10.10.0.0/16 через тунель VPN на віддалених сайтах. Вам також може знадобитися сказати openvpn, щоб пропустити ці пакети. У будь-якому випадку, використовуючи tcpdump, щоб побачити, які пакети отримують, де і як правильний підхід. ціль LOG iptables - це також ваш друг.
Стефан Шазелас

2
Якщо ви не бачите жодних пакетів, вам доведеться заглянути у свій журнал openvpn. Напевно ви знайдете скинуті пакети. Якщо це так, використовуйте "iroute 192.168.0.0 255.255.255.0" для кожного клієнта у своєму client-config-dir
Gregory MOUSSAT
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.