Так же, как немного контекста, это для виртуальной машины, которая выполняет обработку вызовов. Я посмотрел на таблицу маршрутов на виртуальной машине и заметил, что в ней есть следующее:
12.12.12.64/28 dev bond15 proto kernel scope link src 12.12.12.12
12.12.12.64/28 dev bond19 proto kernel scope link src 12.12.12.12
12.12.12.64/28 dev bond11 proto kernel scope link src 12.12.12.12
12.12.12.64/28 dev bond8 proto kernel scope link src 12.12.12.12
Итак, мой вопрос: имеет ли это смысл? Я не добавлял их в таблицу маршрутизации самостоятельно, они были установлены при настройке IP. Но у меня вопрос, как тогда это работает? Если 12.12.12.64/28 приходит пакет, предназначенный для чего-либо, он всегда идет на интерфейс bond15, правильно? Разве это не отменяет полностью интерфейсы bond19 и bond11?
Теперь, как было сказано, я также сделал ifconfig виртуальной машины и заметил, что все эти интерфейсы BOND имеют одинаковый IP:
bond8: flags=209<UP,POINTOPOINT,RUNNING,NOARP> mtu 1472
inet 12.12.12.12 netmask 255.255.255.240 destination 12.12.12.12
bond11: flags=209<UP,POINTOPOINT,RUNNING,NOARP> mtu 1472
inet 12.12.12.12 netmask 255.255.255.240 destination 12.12.12.12
bond15: flags=209<UP,POINTOPOINT,RUNNING,NOARP> mtu 1472
inet 12.12.12.12 netmask 255.255.255.240 destination 12.12.12.12
bond19: flags=209<UP,POINTOPOINT,RUNNING,NOARP> mtu 1472
inet 12.12.12.12 netmask 255.255.255.240 destination 12.12.12.12
Итак, учитывая эти две части информации, мне любопытно, как все это объединить. Означает ли это, что все эти BOND используют один и тот же интерфейс? Если да, то почему в таблице маршрутов должно быть несколько строк? и почему бы просто не создать одну единственную запись в ifconfig, которая объединяет все 4 облигации в одну? Значит, есть только один Bond0 для 12.12.12.12 и запись ipconfig для Bond0 для 12.12.12.12?
Мне кажется, что в соответствии с таблицей маршрутов любой пакет, предназначенный для этой подсети, пойдет только на Bond15, потому что он появляется первым в списке маршрутов?
Спасибо всем..
Сначала вы должны знать, что для любых дополнительных сетевых настроек ifconfig
и route
следует полностью избегать, и ip link
, ip address
, ip route
(так же как ip rule
для маршрутизации политики, bridge
в дополнении к ip link
заменить brctl
) вместо этого. Некоторые функции недоступны в старых инструментах, поскольку новые функции реализованы только в новом API ядра ((RT) netlink вместо ioctl).
Эти маршруты помечены proto kernel
: это означает, что они были автоматически добавлены ядром при добавлении адресов к интерфейсам, возможно, примерно так:
ip address add 12.12.12.12 peer 12.12.12.64/28 dev bond8
Само по себе это не имеет особого смысла: будет использоваться только первый указанный маршрут среди равных: bond15
, для правильной маршрутизации должны быть другие элементы.
Я могу придумать как минимум два способа сделать это:
дополнительные таблицы маршрутизации
Вероятно, это должно работать вместе с зоны conntrack (чтобы избежать смешивания двух идентичных потоков, кроме их интерфейса), Connmarks и Метки (с помощью iptables или столы), чтобы отмечать пакеты, чтобы знать, откуда они пришли, и чтобы ядро могло ответить туда. В ip rule
команда возвращает это в стандартной системе:
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
Если у вас есть дополнительные записи, вероятно, это выбранный метод, и он может стать довольно сложным, если дополнительные настройки будут выполнены с помощью iptables или столы. За каждую дополнительную запись с lookup XXXX
, вы можете отобразить дополнительную таблицу маршрутизации с помощью:
ip route show table XXXX
у которого, вероятно, будет только один bondXX устройство, указанное внутри него (возможно, через другие интерфейсы).
привязка непосредственно к интерфейсу
С помощью SO_BINDTODEVICE
:
SO_BINDTODEVICE
Привяжите этот сокет к определенному устройству, например «eth0», как указано в переданном имени интерфейса. [...] Если сокет привязан к интерфейсу, только пакеты, полученные от этого конкретного интерфейса, обрабатываются сокетом. Обратите внимание, что это работает только для некоторых типов сокетов, особенно сокетов AF_INET.
Обычно для этого требуется уйти Переадресация обратного пути отфильтровать, например, с помощью:
sysctl -w net.ipv4.conf.all.rp_filter=0
sysctl -w net.ipv4.conf.bond8.rp_filter=0
sysctl -w net.ipv4.conf.bond11.rp_filter=0
sysctl -w net.ipv4.conf.bond15.rp_filter=0
sysctl -w net.ipv4.conf.bond19.rp_filter=0
на самом деле возможно просто с этим перед созданием интерфейсов:
sysctl -w net.ipv4.conf.default.rp_filter=0
Я мог бы заставить это работать, используя socat
и это so-bindtodevice=
вариант, но только как клиент (подключение), а не как сервер (прослушивание), поэтому я не знаю, подходит ли он для всех случаев, или это было ограничение с socat
или что-то я пропустил. Что-то вроде:
socat tcp4:12.12.12.65:5555,so-bindtodevice=bond11 -
для связи со службой через порт 5555 / tcp в системе, владеющей 12.12.12.65 на облигация11 стороне (а не той, что на облигация15 сторона).
Кроме того, несмотря на свое название, эти интерфейсы не относятся к типу связь, но наверное туннель какой-то. С помощью ip -details link show
будет отображать их фактический тип (в начале 3-й строки для каждого интерфейса).