Como rotear diferentes usuários em diferentes túneis OpenVPN no Linux?

Como rotear diferentes usuários em diferentes túneis OpenVPN no Linux?

A configuração:

Tenho várias configurações de cliente/servidor OpenVPN de chave estática, rotuladas como "client1", "client2" e "client3" com IPs de servidor/cliente 10.10.1.1/10.10.1.2, 10.10.2.1/10.10.2.2 e 10.10. 3.1/10.10.3.2, respectivamente, hospedados em um servidor Linux e um cliente Linux (com três processos openvpn cada, cada um com uma interface tunX diferente). Tenho três usuários em minha máquina cliente Linux, usuário "client1", "client2" e "client3". Eu tenho meu servidor configurado para fazer NAT para que o tráfego de entrada do cliente1 em 10.10.1.2 saia para a Internet (via -j SNAT em iptables) de um IP, cliente2 em 10.10.2.2 saia de outro IP, etc.

O problema:

O que eu não tenho é uma maneira de a máquina cliente Linux rotear corretamente o tráfego de cada usuário para o IP do servidor OpenVPN adequado através do túnel OpenVPN. Essencialmente, desejo que todo o tráfego destinado à Internet do cliente1 saia de um IP voltado para a Internet no servidor OpenVPN, o tráfego do cliente2 saia de outro e assim por diante para quantos usuários eu gostaria de adicionar . Mas tudo isso deve ser feito em UMA máquina que hospeda todos os diferentes usuários do cliente. Estou ciente de uma funcionalidade do iptables que envolve a marcação de pacotes por ID do usuário e a configuração do roteamento IP com base nessas marcas, mas não sei como realmente conseguir isso.

Existe algum guru de iptables/netfilter/etc que possa me ajudar neste assunto?

Responder1

Você pode marcar pacotes com iptablesbase no UID do processo de criação. Você pode usar esta marca Netfilter tanto para roteamento (avançado) ( ip rule: man ipou man ip-rule; palavra-chave "fwmark") quanto para DNAT. Não tenho certeza de qual é mais fácil/melhor.

Editar 1 Para cada usuário:

iptables -t mangle -A PREROUTING -m owner --uid-owner $user -j MARK --set-mark $usermark
# one line in /etc/iproute2/rt_tables (numbers don't matter)
ip route add default via $user_gw_ip dev $user_if src $user_if_local_ip table $user_table
ip rule add type unicast fwmark $usermark priority 100 table $user_table

informação relacionada