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