Taxa de limitação de tráfego entre hosts específicos (com base em seu MAC) usando iptables

2

Eu configurei uma rede isolada simples consistindo em seguir máquinas baseadas em Linux (exemplo simplificado): Nó1 < ---- > Roteador < ---- > Nó2 A eth0 do roteador está conectada com a eth0 do Node1. A eth1 do roteador está conectada com a eth0 do Node2.

Eu gostaria de limitar a taxa de tráfego entre o nó 1 e o nó 2 com base em seus endereços MAC, por exemplo, para 150 KBps. Eu li a página de manual do iptables e vejo a opção "--limit" mas não consigo "encontrar uma maneira de especificar o endereço MAC de origem e de destino em conjunto com a regra de limite de tráfego.

Em inglês, a regra seria "Limitar todo o tráfego entre MAC_Address_1 (para Node1) e MAC_Address_2 (para Node2) para uma taxa máxima de 150 KBps".

Isso pode ser feito usando o iptables?

    
por modest 17.10.2012 / 19:34

2 respostas

0

Não, isso não pode ser feito usando o iptables. A resposta está no nome do comando e no que você está tentando fazer.

No modelo OSI , os endereços MAC pertencem à camada de enlace de dados. Isso significa que protocolos como o IEEE 802.3 (Ethernet) têm um conceito de endereços MAC, mas protocolos como o IPv4 não. Os protocolos da camada de enlace de dados podem ser considerados como "quadros" de transmissão.

Observe que iptables contém "IP", que significa Protocolo da Internet. Este é um protocolo na camada de rede, que é uma camada superior à camada de enlace de dados. Os protocolos da camada de rede podem ser considerados como "pacotes" de transmissão.

Como os protocolos são construídos uns em cima dos outros como uma pilha, só é possível que protocolos de nível inferior afetem diretamente o comportamento de protocolos de nível mais alto, e não o contrário. Portanto, não é possível para uma ferramenta que opera na camada IP afetar diretamente o comportamento de um dispositivo de hardware operando, digamos, na camada Ethernet (802.3).

Se você conhece o HTTP, pode pensar assim. Como você responderia se alguém lhe perguntasse: "Como eu posso enviar dados arbitrários pela porta TCP 6790 usando apenas HTTP?" A resposta é que você não pode - por exemplo, a porta TCP já está decidida pelo tempo em que o protocolo HTTP está em jogo. Segundo, o protocolo HTTP tem cabeçalhos obrigatórios e elementos estruturais que não podem ser removidos sem violar o padrão. Então, assim que você diz "HTTP" você está falando sobre operar dentro de um soquete TCP existente em uma porta pré-determinada e você está preso às regras de protocolo do HTTP.

O mesmo acontece com o IP. Uma vez que você está lidando com endereços lógicos na pilha de IPs, você não pode "alcançar" as camadas físicas e fazer coisas de baixo nível. Como uma explicação simples, é possível que um dispositivo tenha um endereço IPv4 válido, mas opere usando uma camada de enlace de dados que não usa endereços MAC. Por exemplo, um protocolo USB poderia ser projetado para transmitir pacotes IP, mas não teria nenhum conceito de "Ethernet" ou "quadros", portanto, não teria um endereço MAC nem implementaria o padrão IEEE 802.3.

O que você precisa é ebtables . ebtables permitirá que você para executar processamento semelhante na camada de quadros ethernet . Você precisará ter certeza de que todos os dispositivos que você deseja firewall têm uma conexão Ethernet direta com o computador que está fazendo o firewall, caso contrário, isso não funcionará. E se algum de seus dispositivos não usa ethernet, você está sem sorte.

    
por 17.10.2012 / 20:06
0

É possível fazer isso com o iptables:

iptables podem combinar com base no endereço MAC de origem com --mac-source , então metade do problema foi resolvido. A outra metade é mais complicada porque o endereço MAC de destino não está disponível para o iptables. Podemos contornar isso com rastreamento de conexão.

Sugiro começar com algo mais simples, como esta pergunta onde há apenas um endereço MAC, então podemos lidar com dois.

Primeiro, crie classes tc para limitar a taxa:

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


Marcar conexões de cada endereço mac com um bit específico:

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


Se ambos os bits estiverem definidos, sabemos que isso é mac1 < - > mac2, classifica o pacote para limitar a taxa:

iptables -t mangle -A POSTROUTING -m state --state ESTABLISHED,RELATED -m connmark --mark 0x3 -j CLASSIFY 1:1
    
por 10.07.2017 / 23:42

Tags