Páginas

quinta-feira, 26 de abril de 2018

Roteamento por Processo no Linux

Uma abordagem simples para a seleção de tabela de roteamento por processo ou grupo de processo pode ser alcançada através do uso do iptables, cgroups e políticas de roteamento.

Para esse mesmo fim, pode-se, alternativamente, criar um network namespace para utilizar uma outra pilha de rede, com suas tabelas de roteamento, regras de firewall e dispositivos de rede, mas é um processo mais complexo que exige a utilização de veth pairs e bridges.

No CentOS 7.4 é possível realizar o roteamento por processo sem a necessidade de instalação de pacotes adicionais.

Primeiramente é necessário criar uma nova tabela de roteamento, adicionar a rota default nessa tabela e criar uma política de utilização dessa regra. Nesse caso, a política aplicada será que todos os pacotes marcados pelo iptables utilizarão a nova rota.

echo 11 new_route >> /etc/iproute2/rt_tables
ip rule add fwmark 11 table new_route
ip route add default via 192.168.10.1 table new_route


Posteriormente cria-se uma regra no iptables para marcar todos os pacotes de um determinado grupo de processos.

iptables -t mangle -A OUTPUT -m cgroup --cgroup 0x00110011 -j MARK --set-mark 11
iptables -t nat -A POSTROUTING -m cgroup --cgroup 0x00110011 -o eth0 -j MASQUERADE


Cria-se um grupo de controle para o controlador net_cls.

mkdir /sys/fs/cgroup/net_cls/new_route
cd /sys/fs/cgroup/net_cls/new_route
echo 0x00110011 > net_cls.classid

E finalmente desabilitamos o reverse path filtering:

sysctl net.ipv4.conf.all.rp_filter=0
sysctl net.ipv4.conf.eth0.rp_filter=0
sysctl net.ipv4.conf.eth1.rp_filter=0


Ao lançar um processo, você pode incluí-lo no grupo de controle new_route simplesmente adicionando o seu PID no arquivo /sys/fs/cgroup/net_cls/new_route/tasks

cd /sys/fs/cgroup/net_cls/new_route 
echo $PID > tasks

Para removê-lo do grupo, escreva seu PID em /sys/fs/cgroup/net_cls/tasks.
Lembre-se que os processos filhos de um processo em um grupo de controle também pertencem ao mesmo grupo de controle.

Você pode ainda lançar um processo já nesse grupo utilizando o comando cgexec. Para deletar o grupo, utilize o comando cgdelete.

Para remover as regras de firewall criadas, substitua o -A por -D. E para limpar a nova tabela de roteamento e remover sua política, utilize os comandos:

ip route flush table new_route
ip rule delete fwmark 11 table new_route

E isso é tudo, pessoal!

Referências:
https://www.evolware.org/?p=369
https://superuser.com/a/1048913

Nenhum comentário:

Postar um comentário