Não vejo necessidade de uma função aqui. Se você precisar de uma função, talvez seja melhor passar a variável como um parâmetro, em vez de tentar usá-la como uma variável global. No entanto, parece bastante simples simplesmente aninhar os loops:
for mac in $(awk -F";" '{print $2}' macs.txt); do
iptables -t nat -A PREROUTING -i eth1 -m mac --mac-source $mac -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -A INPUT -i eth1 -m mac --mac-source $mac -p tcp --dport 8080 -j ACCEPT
for ip in $(sed '/#.*/d' ips.txt); do
if echo $ip | grep -q "-" >/dev/null; then
iptables -A FORWARD -m mac --mac-source $mac -o eth0 -p tcp --dport 443 -m iprange --dst-range "$ip" -j ACCEPT
else
iptables -A FORWARD -m mac --mac-source $mac -o eth0 -p tcp --dport 443 -d $ip -j ACCEPT
fi
done
done
Quanto à mensagem de erro, parece que você tem um processo sendo executado ao mesmo tempo em que essas regras estão sendo processadas. Talvez você deva apenas adicionar -w
às suas linhas do iptables, como o erro sugere. Esta opção deve fazer com que o iptables aguarde o desbloqueio do xtables lock.