Respostas:
O IPTables funciona no nível do Kernel. Em geral, isso significa que não tem conhecimento de aplicativos ou processos. Ele pode filtrar apenas com base no que é obtido 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.
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 determinados daemons, como o daemon openssh.
Se você tiver que escolher, geralmente optarei pelo menos por IPTables. Eu vejo os hosts.allow como um bom bônus. Mesmo que pareça que os níveis de daemon parecem mais fáceis, o IPTables 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 alteram essa escolha.
O iptables bloqueia o acesso antes que ele atinja o aplicativo, enquanto hosts.allow / hosts.deny faz parte do PAM e requer que o aplicativo implemente a verificação do PAM e manipule corretamente o arquivo. Ambos são úteis, e ter os dois no lugar é ainda melhor.