Se aumentar a quantidade de micros será o caos pra você, pois você terá que replicar as regras, anotar cada endereço atribuído, e editar o firewall. Aumentando a quantidade de micros, aumenta a possibilidade de você ter que trocar uma máquina, ou trocar a placa de rede de uma delas, o que significa que você terá que corrigir o script. Há ainda a possibilidade de digitar um endereço IP ou MAC errado, o que vai te exigir depurar tudo... caos.
Enquanto isso, há um erro de procedimento em seu script. Veja que há uma sub-rotina "iniciar", que você usa pra carregar algumas coisas. Todas as suas regras deveriam estar colocadas nesse script; isso garantiria que as regras fossem colocadas na ordem estrita em que foram digitadas, algo essencial pro fluxo de processamento do iptables.
No entanto, você colocou todas as regras de filtragem fora da sub-rotina "iniciar". Com isso, essas regras de filtragem estão sendo executadas antes da "iniciar", fazendo que suas regras fiquem fora de ordem. Isso é ainda pior na hora em que você considera as regras de MASQUERADE, as quais você colocou desnecessariamente uma específica para cada IP/MAC --- bastaria colocar uma regra central (aliás, há uma dentro da rotina "iniciar", e ela seria suficiente), já que qualquer IP/MAC não cadastrado seria bloqueado.
Outro motivo determinante pra lentidão é que você está usando política DROP pra cadeia INPUT, mas não liberou o tráfego na interface Loopback. Esse tráfego é usado em vários programas, inclusive na autenticação dos usuários do Linux. A menos que você não se importe em ficar horas esperando um prompt de senha, depois de digitar o usuário, a regra abaixo, logo no início do firewall, será sua amiga:
iptables -A INPUT -i lo -j ACCEPT