Wrapper para impedir que um programa acesse conexões não locais

3

Considere um programa server que se liga a '*' e ouve conexões de entrada. Eu só me conecto a server do localhost e não quero que usuários externos consigam se conectar a ele. No entanto, o programa server está gravando incorretamente e não fornece uma opção de configuração ou sinalizador para vincular somente o host local. Além disso, é inconveniente hackear o código-fonte de server para corrigir isso.

Por isso, eu estaria procurando por um wrapper para executar server , mas torná-lo vinculado em localhost e não em '*'. (Por exemplo, talvez um truque baseado em LD_PRELOAD pudesse fazer o trabalho, como tsocks para forçar o uso em um proxy SOCKS em um programa de terceiros.) Existe algo assim? raiz na máquina, se isso ajuda.

Eu sei que outra solução seria usar o iptables para isso, mas essas regras não persistem durante as reinicializações para que possam quebrar silenciosamente. Além disso, eles são "globais" e podem ser modificados por outros usuários do servidor ou confundi-los. Por outro lado, ao executar o programa do servidor como wrapper server , ficaria mais confiante de que a configuração não será interrompida por algum outro motivo.

    
por a3nm 28.08.2016 / 15:13

1 resposta

4

Veja como fazer isso usando namespaces ip (requer privilégios de root, o seguinte deve ser executado como root).

Create a namespace for the server:

ip netns add myserverns

Assign an IP address to the loopback in the namespace and turn it on (source: this post):

ip netns exec myserverns ifconfig lo 127.0.0.1 up

Run server in the namespace (where "serveruser" is the user that should run the server)

ip netns exec myserverns sudo -u serveruser server

Let's assume that the server listens on port 4242. Now, use socat to bind the loopback to the namespace (note the use of bind=127.0.0.1 which is the entire point) (source: this answer):

socat tcp-listen:4242,bind=127.0.0.1,fork,reuseaddr exec:'ip netns exec myserverns socat STDIO tcp-connect\:127.0.0.1\:4242',nofork

Isso alcança meu objetivo pretendido: mesmo que server tente se ligar a '*' (ou a portas completamente diferentes), quando executamos desta forma, temos certeza de que ela só pode ser acessada na máquina local com porta 4242 .

    
por 28.08.2016 / 17:03

Tags