2

Я настроил простую изолированную сеть, состоящую из следующих машин на базе Linux (упрощенный пример): Node1 <----> Router <----> Node2 Маршрутизатор eth0 связан с Node1 eth0. Eth1 маршрутизатора связан с eth0 Node2.

Я хотел бы ограничить скорость трафика между Node1 и Node2 на основе их MAC-адресов, например, до 150 Кбит / с. Я прочитал справочную страницу для iptables и вижу опцию «--limit», но не могу найти способ указать MAC-адрес источника и назначения в сочетании с правилом ограничения трафика.

На простом английском языке правило будет следующим: «Ограничить весь трафик между MAC_Address_1 (для Node1) и MAC_Address_2 (для Node2) максимальной скоростью до 150 Кбит / с».

Можно ли это сделать с помощью iptables?

2 ответа2

0

Это можно сделать с помощью iptables:

iptables может совпадать на основе MAC-адреса источника с --mac-source так что это половина решаемой проблемы. Другая половина сложнее, потому что Mac-адрес назначения недоступен для iptables. Мы можем обойти это с отслеживанием соединения, хотя.

Я бы предложил начать с чего-то более простого, такого как этот вопрос, где есть только один MAC-адрес, тогда мы можем иметь дело с двумя.

Сначала создайте tc классы для ограничения скорости:

rate=$[150*8]
for if in eth0 eth1 ; do
  tc qdisc add dev $if root handle 1: htb
  tc class add dev $if parent 1: classid 1:1 htb rate ${rate}kbit ceil ${rate}kbit prio 2
  tc qdisc add dev $if parent 1:1 handle 1: sfq perturb 10
done


Пометьте соединения с каждого mac-адреса определенным битом:

mac1=11:22:33:44:55:66
mac2=12:34:56:78:9a:bc
iptables -t mangle -A PREROUTING -m state --state NEW -m mac --mac-source $mac1 -j CONNMARK --or-mark 0x1
iptables -t mangle -A PREROUTING -m state --state NEW -m mac --mac-source $mac2 -j CONNMARK --or-mark 0x2


Если оба бита установлены, мы знаем, что это mac1 <-> mac2, классифицируем пакет для ограничения скорости:

iptables -t mangle -A POSTROUTING -m state --state ESTABLISHED,RELATED -m connmark --mark 0x3 -j CLASSIFY 1:1
0

Нет, это нельзя сделать с помощью iptables. Ответ в названии команды и в том, что вы пытаетесь сделать.

В модели OSI MAC-адреса принадлежат канальному уровню. Это означает, что протоколы, такие как IEEE 802.3 (Ethernet), имеют концепцию MAC-адресов, а протоколы, такие как IPv4, - нет. Протоколы канального уровня могут рассматриваться как передающие "кадры".

Обратите внимание, что iptables содержит "IP", что означает интернет-протокол. Это протокол на сетевом уровне, который является более высоким уровнем, чем канальный уровень. Протоколы сетевого уровня могут рассматриваться как передающие "пакеты".

Поскольку протоколы построены друг на друге как стек, протоколы более низкого уровня могут напрямую влиять на поведение протоколов более высокого уровня, а не наоборот. Таким образом, инструмент, работающий на уровне IP, не может напрямую влиять на поведение аппаратного устройства, работающего, например, на уровне Ethernet (802.3).

Если вы знаете о HTTP, вы можете думать об этом так. Как бы вы ответили, если бы кто-то спросил вас: «Как я могу отправлять произвольные данные через TCP-порт 6790, просто используя HTTP?«Ответ заключается в том, что вы не можете - например, порт TCP уже определен к тому времени, когда протокол HTTP находится в игре. Во-вторых, протокол HTTP имеет обязательные заголовки и структурные элементы, которые нельзя удалить без нарушения стандарта. Поэтому, как только вы говорите "HTTP", вы говорите о работе в существующем сокете TCP на заранее определенном порту, и вы застряли, придерживаясь правил протокола HTTP.

То же самое относится и к IP. Как только вы работаете с логическими адресами в стеке IP, вы не можете "проникнуть" вниз на физические уровни и делать низкоуровневые вещи. В качестве простого объяснения, почему устройство может иметь действительный адрес IPv4, но работать с использованием канального уровня, который вообще не использует MAC-адреса. Например, протокол USB может быть разработан для передачи IP-пакетов, но он не будет иметь понятия "Ethernet" или "кадры", поэтому он не будет иметь MAC-адреса или не будет реализовывать стандарт IEEE 802.3.

Что вам нужно, это ebtables. ebtables позволит вам выполнить аналогичную обработку на уровне кадра Ethernet . Вы должны быть уверены, что все устройства, которые вы хотите использовать для брандмауэра, имеют прямое подключение к сети Ethernet по отношению к компьютеру, который выполняет брандмауэр, иначе это не сработает. И если какое-либо из ваших устройств вообще не использует Ethernet, вам не повезло.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .