So what am I missing?
O que você está perdendo é que service comunica com init , essencialmente escapando do namespace da rede. O aplicativo acaba sendo executado no mesmo namespace de rede que o sistema init (por padrão).
Em seu núcleo, o problema é que service não apenas fork e exec o daemon do aplicativo binário (que preservaria o namespace). Em vez disso, ele faz pouco mais do que passar seus parâmetros para init através (acredito) de um soquete de domínio Unix. Os contêineres seguros também isolam o sistema de arquivos para evitar esse tipo de coisa.
Eu tentaria apenas invocar o binário do daemon do aplicativo diretamente (sob ip netns exec [namespace] , é claro). Ou use um software de contêiner real onde alguém já tenha resolvido todos os detalhes complicados ...