O IPTables funciona no nível do Kernel. Em geral, isso significa que não tem conhecimento de aplicativos ou processos. Ele só pode filtrar com base no que obtém dos vários cabeçalhos de pacotes na maior parte.
O host.allow / deny, no entanto, opera no nível do aplicativo / processo. Você pode criar regras para vários processos ou daemons em execução no sistema.
Assim, por exemplo, o IPTables pode filtrar na porta 22. O SSH pode ser configurado para usar essa porta e geralmente é, mas também pode ser configurado para estar em uma porta diferente. O IPTables não sabe em qual porta está, apenas conhece a porta no cabeçalho TCP. Os arquivos hosts.allow, no entanto, podem ser configurados para certos daemons, como o daemon openssh.
Se você tiver que escolher, eu geralmente optaria por um mínimo de IPTables. Eu vejo o hosts.allow como um bônus agradável. Mesmo que pareça que os níveis do daemon parecem mais fáceis, o IPTables irá bloquear o pacote antes que ele realmente chegue muito longe. Com segurança, quanto mais cedo você puder bloquear algo, melhor. No entanto, tenho certeza de que existem situações que mudam essa escolha.