Rotear o tráfego IP com base no processo para diferentes rotas / interfaces padrão

6

Estou tentando determinar se é possível rotear seletivamente pacotes IP de um processo ou grupo de processos por meio de uma interface específica, enquanto todos os outros pacotes são roteados por meio de outra interface. Ou seja, eu quero que todo o tráfego de /usr/bin/testapp seja roteado através de eth1 , enquanto todos os outros pacotes passam por eth0 . Os pacotes neste caso podem ser TCP, UDP, ICMP, etc. e podem ser configurados pelos usuários finais para usar várias portas.

Como não sou capaz de forçar facilmente o processo em questão a se vincular a uma interface específica, estou tentando obter o mesmo resultado por meio do roteamento. Isso é possível?

--- editar ---

Através de uma sugestão útil aqui, e em muitos outros lugares, é para marcar pacotes baseados em UID; esse não é realmente o objetivo. O objetivo é marcar / filtrar / rotear com base no processo independentemente do usuário . Ou seja, se alice , bob e charlie todos executassem sua própria instância de /usr/bin/testapp ; todos os pacotes das três instâncias devem passar por eth1 , enquanto todos os outros pacotes do sistema devem passar por eth0 .

Observe que a marcação por porta de origem / destino, nome de usuário / UID, etc. não é suficiente, pois vários usuários podem executar testapp e podem configurar portas diferentes em seus próprios ~/.config/testapp.conf ou o que for. A questão é sobre filtragem por processo.

Uma opção disponível, embora eu não saiba como é útil, é usar um wrapper /bin/(ba|z)?sh -based em torno do binário nativo.

--- editar ---

Estou me referindo ao roteamento em um sistema que executa um kernel moderno do Linux, digamos 4.0 ou melhor. Se houver dependências de software além de iproute2 , nftables , conntrack e ferramentas semelhantes, estou disposto a explorar soluções de código aberto, embora as ferramentas básicas sejam preferíveis.

    
por justinzane 16.06.2015 / 21:38

4 respostas

2

Seu roteamento dos pacotes através de eth1 ou eth0. tabelas mangle deve abordar isso. Para fazer isso, eu tive que marcar os pacotes e configurar regras para lidar com isso. Primeiro, adicione uma regra que torne os pacotes de rota do kernel marcados com 2 através da tabela

ip rule add fwmark 2 table 3

Adicione uma rota para redirecionar o tráfego em uma interface diferente, supondo que o gateway seja 10.0.0.1:

ip route add default via 10.0.0.1 table 3

Liberar seu cache de roteamento.

ip route flush cache

Agora, defina uma regra de firewall para marcar os pacotes designados:

iptables -t mangle -A OUTPUT -p tcp --dport 465 -j MARK --set-mark 2

Finalmente, relaxe a validação da origem do caminho inverso. Alguns sugerem que você o defina como 0, mas 2 parece uma escolha melhor de acordo com https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt . Se você ignorar isso, receberá pacotes (isso pode ser confirmado usando tcpdump -i tap0 -n ), mas os pacotes não serão aceitos. O comando para alterar a configuração para que os pacotes sejam aceitos:

sysctl -w net.ipv4.conf.tap0.rp_filter=2

Referência: http://serverfault.com/questions/345111/iptables-target-to-route-packet-to-specific-interface

    
por 08.07.2015 / 09:18
0

Você pode executar o processo com um usuário específico e corresponder os pacotes com a extensão owner do iptable. Uma vez correspondido, você pode marcá-lo e usá-lo com outra tabela de roteamento, use POSTROUTING ou qualquer outra solução que você queira.

Esta postagem explica melhor a correspondência de pacotes com owner .

    
por 16.06.2015 / 22:28
0

Infelizmente, o manpage de extensões do iptables ( link ) não estabelece nenhum módulo para preencher seus requisitos.

Eu sugeriria o mesmo que Mauricio López .

Você pode usar setuid ou setgid do aplicativo de destino para um usuário ou grupo específico, de modo que independentemente de quem originalmente iniciou o aplicativo, ele sempre será executado como um usuário ou grupo específico:

adduser specialrouteuser
chown specialrouteuser: /usr/bin/testapp
chmod +s /usr/bin/testapp

e, em seguida, use a extensão iptables owner para corresponder a esse UID ou GID específico.

Isso, é claro, pode adicionar outros problemas ou problemas de segurança.

    
por 09.07.2015 / 15:23
0

Bem, dado que você nos disse:

Because I'm not able to easily force the process in question to bind to a specific interface, I am trying to achieve the same outcome via routing. Is this possible?

podemos começar a ajudá-lo a partir deste ponto. Era uma vez no FreeBSD jail chamada do sistema apareceu com o objetivo de restringir um processo, ou grupo de processos para alguma subseção sobre os recursos do sistema. Particularmente, pode-se especificar um endereço IP que os processos "isolados" usariam para sua atividade de rede. Isso foi tão útil que eu realmente senti muita falta desse recurso no Linux. Mas o Linux também tem algumas maneiras de obter resultados semelhantes:

ou, a mais leve seria apenas mexer nos namespaces manualmente: link

    
por 09.07.2015 / 15:50