Jump to content

Recommended Posts

Posted

Доброго времени суток уважаемые форумчане. Есть задача: имеется сервер, один интерфейс которого смотрит в три vlan`a,

в каждом vlan`e интерфейс должен иметь адрес 10.10.10.1 и при этом быть доступным со всех вланов. Во всех вланах есть хосты

с адресами 10.10.10.2-254 которые должны иметь связь с 10.10.10.1. Пробовал настраивать vrf-lite, то есть

на каждый интерфейс вешать отдельную таблицу маршрутизации, но при добавлении ip адресов на vlan интерфейсы в таблице main получается вот что:

 

10.10.10.0/24 dev eth0.1 proto kernel scope link src 10.10.10.1

10.10.10.0/24 dev eth0.2 proto kernel scope link src 10.10.10.1

10.10.10.0/24 dev eth0.3 proto kernel scope link src 10.10.10.1

10.10.10.0/24 dev eth0.4 proto kernel scope link src 10.10.10.1

 

При этом если пинговать узел 10.10.10.1 со второго влана, то при ответе узел видит что сеть 10.10.10.0/24 находится за интерфейсом

eth0.1, а дальше выясняет что мака узла которому нужно ответить на этом интерфейсе нет, соответственно ничего не работает.

 

Подскажите пожалуйста как это исправить?

 

Прилагаю список правил маршрутизации и содержание одной из кастомных таблиц, содержание других таблиц аналогично за исключением

названий интерфейсов.

 

root@hesk:~# ip rule sh

0: from all lookup local

10: from all iif eth0.1 lookup vlan1

20: from all iif eth0.2 lookup vlan2

30: from all iif eth0.3 lookup vlan3

40: from all iif eth0.4 lookup vlan4

32766: from all lookup main

32767: from all lookup default

 

 

root@hesk:~# ip ro sh table vlan2

unreachable default proto static

broadcast 10.10.10.0 dev eth0.2 proto kernel scope link

10.10.10.0/24 dev eth0.2 proto static scope link

local 10.10.10.1 dev eth0.2 proto kernel scope host

broadcast 10.10.10.255 dev eth0.2 proto kernel scope link

 

Заранее благодарю за помощь.

Posted

Либо добавить вланы в мост и на мост вешать нужный адрес, но тогда нужно будет фильтровать.

 

Либо с помощью ARP объявить себя во всех нужных вланах, но детали реализации увы не подскажу.

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

Posted

netns

 

Большое Вам спасибо за совет, воспользовался netns - часть задачи решена, узел доступен со всех вланов, для этого провел следующие действия:

 

ip netns add vlan1

ip link set dev eth0.1 netns vlan1

ip netns exec vlan1 ip a a 10.10.10.1/24 dev eth0.1

ip netns exec vlan1 ip link set dev eth0.1 up

 

ip netns add vlan2

ip link set dev eth0.2 netns vlan2

ip netns exec vlan2 ip a a 10.10.10.1/24 dev eth0.2

ip netns exec vlan2 ip link set dev eth0.2 up

 

ip netns add vlan3

ip link set dev eth0.3 netns vlan3

ip netns exec vlan3 ip a a 10.10.10.1/24 dev eth0.3

ip netns exec vlan3 ip link set dev eth0.3 up

 

ip netns add vlan4

ip link set dev eth0.4 netns vlan4

ip netns exec vlan4 ip a a 10.10.10.1/24 dev eth0.4

ip netns exec vlan4 ip link set dev eth0.4 up

 

На этом же сервере есть еще один физический интерфейс который смотрит в сеть 10.17.0.0/24, как сделать так чтобы эта сеть была доступна во всех контейнерах? Заранее благодарю за ответ.

Posted

На этом же сервере есть еще один физический интерфейс который смотрит в сеть 10.17.0.0/24, как сделать так чтобы эта сеть была доступна во всех контейнерах?

Эм... создать veth пары, одним концом - в бридж с физ. ифейсом, вторым - в контейнер? Правда хз прокатит ли один и тот же адрес, или надо будет контейнерам разные назначать...

Posted

На этом же сервере есть еще один физический интерфейс который смотрит в сеть 10.17.0.0/24, как сделать так чтобы эта сеть была доступна во всех контейнерах? Заранее благодарю за ответ.

Как было сказано выше, это можно сделать через veth. Несколько примеров я описал здесь

 

т.е. делаете veth-пары между netns и глобалом и в глобале коммутируете с нужным интерфейсом или маршрутизируете с нужной сетью

 

если вариант с коммутацией устраивает, то можно его реализовать проще - путём создания macvlan-интерфейсов и запихиванием их в нужные netns-ы. в ядре линукс была проблема на тему macvlan в netns, сейчас она исправлена в net-next, но не уверен, что оно слито с mainline. workaround - ifconfig ethX promisc (на интерфейсе, поверх которого будете плодить mac-vlan'ы)

 

для L3-варианта тоже есть красивое решение без veth, называется vznetdev, но оно живёт только в openvz-ветке ядра

Posted

 

т.е. делаете veth-пары между netns и глобалом и в глобале коммутируете с нужным интерфейсом или маршрутизируете с нужной сетью

 

 

Под коммутированием Вы подразумеваете bridge? И можно подробнее про macvlan интерефейсы? Или ссылочку... Спасибо.

Posted

да, коммутация это bridge. вместо veth+br можно сделать macvlan:

ip li add link eth1 eth1-m1 address 00:11:22:33:44:55 type macvlan

ip li add link eth1 eth1-m2 address 00:11:22:33:44:56 type macvlan

ip link set eth1-m1 netns vrf1

ip link set eth1-m2 netns vrf2

ip netns exec vrf1 ifconfig eth1-m1 10.17.0.254/24 up

ip netns exec vrf2 ifconfig eth1-m2 10.17.0.253/24 up

(это в случае если сеть 10.17/24 является dc)

 

если не будет работать, то ifconfig eth1 promisc или найти нужные патчи

Posted

да, коммутация это bridge. вместо veth+br можно сделать macvlan:

ip li add link eth1 eth1-m1 address 00:11:22:33:44:55 type macvlan

ip li add link eth1 eth1-m2 address 00:11:22:33:44:56 type macvlan

ip link set eth1-m1 netns vrf1

ip link set eth1-m2 netns vrf2

ip netns exec vrf1 ifconfig eth1-m1 10.17.0.254/24 up

ip netns exec vrf2 ifconfig eth1-m2 10.17.0.253/24 up

(это в случае если сеть 10.17/24 является dc)

 

если не будет работать, то ifconfig eth1 promisc или найти нужные патчи

 

Спасибо большое, помогло! Возможно ли запустить индейца в контейнерах? Или для этого уже необходимы lxc ?

Posted

что такое индеец? вообще запускать процессы в netns легко: ip netns exec vrfX PROCESS/RUN_SCRIPT, только помните что умолчанию в netns-ах лупбек не поднят, а иногда обмен данными идёт через него, если приложение запускает несколько процессов или даже внутри одного процесса

 

если нужно запускать несколько одинаковых процессов(в каждом netns свой), то с большой долей вероятности придётся создавать несколько скриптов запуска(изменять параметры типа pid-файл, var-dir, tmp-dir и т.п.), чтоб одновременно запущенные процессы не подрались за них

 

а если у вас есть навыки программирования, то можно пропатчить приложения, чтоб они стали netns-capable, но это палка о двух концах, потом проблемы с обновлениями, чтоб их не было(или минимизировать их) надо прохивать свой патч в апстрим, в используемый дистрибутив, патч могут не принять с резолюцией "не нужно" и т.д.

Posted (edited)

можно, запускайте, у апача вроде бы только пид-файл надо будет поменять, если 4 копии будете запускать

 

Под дебианом приемлемо сделан запуск изолированых апачей. Там достаточно просто сделать запуск их в своих netns-ах, добавив ip netns exec в инит-скрипт.

 

Ну и многие почему-то забывают, что можно для отладки запустить ip netns exec name /bin/sh в интерактивном режимчике.

Edited by vop
Posted

можно, запускайте, у апача вроде бы только пид-файл надо будет поменять, если 4 копии будете запускать

 

Большое Вам спасибо за советы, все работает). У апача сделал необходимое количество копий главного конфига, в каждой копии указал разные

pid`ы и запускаю командой ip netns exec netns_name apache2ctl -f config -k start.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...
На сайте используются файлы cookie и сервисы аналитики для корректной работы форума и улучшения качества обслуживания. Продолжая использовать сайт, вы соглашаетесь с использованием файлов cookie и с Политикой конфиденциальности.