Depois de muita tentativa e erro, consegui encontrar a resposta para a minha própria pergunta. O problema não era com o iptables ou com a versão do Ubuntu / Linux que eu estava usando, mas sim com a terceira regra:
/sbin/iptables -A OUTPUT -p udp --dport 53 -m owner --gid-owner internet -j ACCEPT
Como udp/53
port é usado para a resolução de nomes DNS, os serviços de segundo plano como dnsmasq
poderiam usá-los, portanto a resolução de nomes não estava acontecendo quando tentei executar um programa com o grupo internet
como esses outros serviços não estava naquele grupo. No entanto, o ideal é que esses serviços ainda tenham acesso à porta, pois eles estão sendo executados na conta root ( e root podem fazer qualquer coisa! ), mas o design do módulo proprietário iptables parece não respeitar tais privilégios de root .
Assim que eu removi a verificação do módulo proprietário desta última regra, a internet começou a funcionar:
/sbin/iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
Editar
Outro problema, não diretamente vinculado, mas relacionado, é usar o módulo proprietário para o grupo raiz. Estamos inclinados a atribuir o acesso do grupo raiz à Internet (além de ou em vez do grupo internet
) assim:
/sbin/iptables -A OUTPUT -p tcp --dport 80 -m owner --gid-owner root -j ACCEPT
No entanto, isso não funciona na prática porque muitos aplicativos não usam o usuário root para se conectar à Internet por motivos de segurança. Por exemplo, o seguinte comando não funcionará mesmo depois de fazer o acima:
sudo apt-get update
Isso porque o programa apt
usa internamente o usuário _apt
para fazer download de pacotes por motivos de segurança.