Qual é a maneira mais eficiente / rápida de iterar valores em uma regra iptables?

0

Estou tentando escrever uma regra iptables que se aplique a várias interfaces com base em uma variável. Qual das regras é mais eficiente / mais rápida? Existe uma maneira melhor de escrever essa regra com um mínimo de código?

#Variable
Ext_INTF="eth0 usb0 tun0 tun1"

1)

for i in $Ext_INTF;
do
iptables -A FORWARD -i $i -j DROP
done

2)

iptables -A FORWARD -i $Ext_INTF -j DROP
    
por uihdff 12.05.2017 / 05:37

1 resposta

2

O método 2 não funciona - produz uma invocação inválida de iptables . O que quer que você tenha pensado que possa fazer, ele adiciona apenas uma regra iptables e você não pode corresponder a um conjunto arbitrário de interfaces em uma única regra. O método 1 é o caminho normal e praticamente o único caminho.

Não que a eficiência de definir regras do iptables seja uma preocupação. Você teria que trabalhar muito para fazer algo visivelmente não ideal. As preocupações aqui são acertar as regras, possivelmente a eficiência das próprias regras, e manter o script legível para que seja fácil de manter.

A gravação de $Ext_INTF - uma substituição de variável fora de aspas duplas - divide o valor da variável em partes separadas por espaços em branco e, em seguida, expande cada parte como um nome de arquivo correspondente a um padrão curinga. Aqui a variável não contém nenhum caractere curinga ( \[*? ). Assim, for i in $Ext_INTF; … faz um loop sobre as palavras no valor da variável. Em geral, você só deve usar substituições de variáveis dentro de aspas duplas , porque $Ext_INTF significa “o valor de Ext_INTF ” somente dentro de aspas duplas, mas aqui você deseja que a divisão ocorra, e as partes não contêm nenhum caractere curinga de shell. / p>

Ext_INTF="eth0 usb0 tun0 tun1"
for i in $Ext_INTF; do
  iptables -A FORWARD -i "$i" -j DROP
done

No bash e no ksh, mas não no sh simples, você pode usar uma matriz em vez de uma variável de string. (E em zsh você deve usar uma matriz ou solicitar explicitamente a divisão com $=Ext_INTF .) Você precisa digitar mais alguns caracteres, mas isso torna a intenção mais clara e permite que os elementos contenham espaços em branco e curingas, se necessário.

Ext_INTF=(eth0 usb0 tun0 tun1)
for i in "${Ext_INTF[@]}"; do
  iptables -A FORWARD -i "$i" -j DROP
done
    
por 14.05.2017 / 01:35