O principal problema é que você tem um relacionamento 1: 1 entre os nomes de interface (eth1, eth2, ...) e as redes associadas (10.x, 20.x, ...), mas não há nada em seu código que estabelece explicitamente esse relacionamento de 1: 1.
Você deve em algum lugar vincular ethN
a 192.168.N.x
. Você pode fazer isso com uma única variável NETS
, que conteria uma lista de interface:N
pares. Veja meu código abaixo:
#!/bin/sh
NETS="eth1:10 eth2:20 eth3:30"
for net in $NETS; do
k="${net%:*}" # Yields the name of the interface
i="${net#*:}" # Yields the number bound to the interface
sarg="192.168.$i.0/24"
for net in $NETS; do
j="${net#*:}" # Yields the number bound to the interface
[ "$i" -eq "$j" ] && continue
darg="192.168.$j.0/24"
echo "iptables -I FORWARD -i $k -s $sarg -d $darg -j DROP"
done
done
Notas:
- Eu removi completamente o ciclo
for k in $NAME
, pois parece contradizer o que você deseja alcançar. -
Você pode até colocar a rede na definição de
NETS
e lersarg
edarg
diretamente dela. Algo como:NETS="eth1:192.168.10.0/24 eth2:192.168.20.0/24 eth3:192.168.30.0/24"
[update] Combinado com minha resposta à sua outra pergunta , isso daria esse script:
#!/bin/sh
NETID="10 20 30"
NAME="eth1 eth2 eth3"
NETS=$(set -- $NETID; for iface in $NAME; do echo "$iface:192.168.$1.0/24"; shift; done)
for net in $NETS; do
iface="${net%:*}"
sarg="${net#*:}"
for net in $NETS; do
darg="${net#*:}"
[ "$sarg" != "$darg" ] && echo "iptables -I FORWARD -i $k -s $sarg -d $darg -j DROP"
done
done