Como faço para rotear todo o tráfego em uma máquina através de um servidor openvpn enquanto a própria máquina executa um servidor openvpn?

0

Informações avançadas

Machines involved:
A := vpn server inet 10.9.0.1 peer 10.9.0.2 tun0
B := vpn server inet 10.8.0.1 peer 10.9.0.2 tun2
     vpn client inet 10.9.0.6 peer 10.9.0.5 tun1
C := vpn client inet 10.8.0.6 peer 10.9.0.5 tun0

Descrição

Existem três máquinas. A máquina B executa um servidor e um cliente openvpn. Agora, quando a máquina A envia redirect-gateway def1 para a máquina B, a máquina C não pode se conectar ao servidor openvpn na máquina B, obviamente, porque os pacotes de resposta vpn-server são roteados para a máquina A, devido à 0.0.0.0/1 via 10.9.0.5, 128.0.0.0/1 via 10.9.0.5 rotas. Agora preciso de roteamento de política para rotear os pacotes pelo gateway WAN da máquina.

Falha na tentativa 1

Eu tentei marcar os pacotes enviados do servidor vpn com:

iptables -t mangle -A OUTPUT -p tcp -m multiport --sports 1194 -j MARK --set-xmark 14
ip route add table 14 default via WAN_IP
ip rule add fwmark 14 table 14

Mas eles ainda são roteados para a máquina A, que eu pude observar com tcpdump -i tun1 na máquina B e tcpdump -i tun0 na máquina A.

**machine B**
eth0:
22:22:33.734511 IP machine_C_IP.54089 > machine_B_IP.1194: UDP, length 86
tun1:
22:32:42.713371 IP 10.9.0.6.1194 > machine_C_IP.34514: UDP, length 94

**machine A**
tun0:
20:47:47.769628 IP machine_A_IP.openvpn > machine_C_IP.40287: UDP, length 94

Falha na tentativa 2

Eu também tentei marcar pacotes pelo proprietário do processo openvpn. Eu adicionei ao openvpn @ .service Group = vpnserver e depois:

iptables -t mangle -A OUTPUT -m proprietário --gid-owner vpnserver -j MARK --set-xmark 14     ip route add table 14 default via WAN_GATEWAY     regra ip adicionar fwmark 14 tabela 14

Mas os pacotes ainda são roteados para a máquina A.

Tentativa de trabalho

A seguir funciona, mas é algo que eu quero evitar usar, porque não é conveniente, porque eu teria que adicionar rotas para cada cliente pelo seu IP. Alguns clientes também têm IPs dinâmicos, portanto, eu teria que usar um script para recuperar o IP correto por um nome de domínio.

ip route add table 14 default via WAN_IP
ip rule add to machine_C_IP table 14

Resumo

Talvez os pacotes marcados não sejam roteados corretamente, porque a cadeia OUTPUT do iptables se aplica após o roteamento real? Ou eu sinto falta de algo ao marcar os pacotes? Existe alguma outra maneira de encaminhar os pacotes do servidor vpn de saída para o meu gateway WAN?

Estado atual

Rotas
default via WAN_GATEWAY dev eth0  table 42 
0.0.0.0/1 via 10.9.0.5 dev tun1 
default via WAN_GATEWAY dev eth0 onlink 
10.1.1.0/24 dev veth0  proto kernel  scope link  src 10.1.1.2 
10.8.0.0/24 via 10.8.0.2 dev tun0 
10.8.0.2 dev tun0  proto kernel  scope link  src 10.8.0.1 
10.9.0.0/24 via 10.9.0.5 dev tun1 
10.9.0.5 dev tun1  proto kernel  scope link  src 10.9.0.6 
WAN_SUBNET/26 via WAN_GATEWAY dev eth0 
WAN_SUBNET/26 dev eth0  proto kernel  scope link  src WAN_IP 
MACHINE_A_IP via WAN_GATEWAY dev eth0 
128.0.0.0/1 via 10.9.0.5 dev tun1
Regras de IP
0:      from all lookup local 
32760:  from all fwmark 0xe lookup 42 
32761:  from all fwmark 0xa lookup 42 
32764:  from all to WAN_IP lookup 42 
32765:  from WAN_IP lookup 42 
32766:  from all lookup main 
32767:  from all lookup default 
    
por fremon 13.09.2017 / 19:32

2 respostas

1

Criando uma resposta anterior no tópico, foi assim que consegui resolver o problema no meu computador Ubuntu 17.10 (habilidoso) executando o OpenVPN 2.4.3.

1) Desativar filtragem de caminho reverso

Precisamos de alterar o encaminhamento do caminho inverso unicast para o modo solto ( rp_filter=2 ) em vez do modo estrito ( rp_filter=1 ). No modo estrito, um pacote de entrada deve ser recebido na mesma interface de rede que seria usada para encaminhar o pacote de retorno.

sysctl -w net.ipv4.conf.<if>.rp_filter=2

Onde <if> é a interface física de ethernet que o computador usa para se conectar ao roteador. No meu caso, o comando ficou assim: sysctl -w net.ipv4.conf.enp2s0.rp_filter=2 . Para ler o parâmetro do kernel, use sysctl net.ipv4.conf.<if>.rp_filter .

Para tornar a alteração persistente após uma reinicialização, adicione ou altere essa linha em /etc/sysctl.conf :

net.ipv4.conf.<if>.rp_filter=2

2) Defina o servidor OpenVPN para marcar pacotes criptografados

No arquivo .conf do servidor, adicione:

mark <value>

Em que <value> é um valor arbitrariamente exclusivo para marcar os pacotes. Isso permitirá o reencaminhamento dos pacotes criptografados pelo servidor OpenVPN. Eu usei mark 9 .

Reinicie o servidor OpenVPN.

3) Redirecione os pacotes marcados para o roteador com uma nova regra ip e rota ip

ip rule add fwmark <value> table <N>
ip route add default via <router> table <N>

Onde <N> é um número arbitrariamente exclusivo para a tabela de roteamento e <router> é o endereço IP do roteador na minha LAN. Em outras palavras, executei estes comandos: ip rule add fwmark 9 table 42 e ip route add default via 192.168.8.1 table 42 .

Tornar essas alterações persistentes após a reinicialização é mais complicado, especialmente com o Ubuntu 17.10, que usa o novo pacote netplan para gerenciar conexões de rede, em vez do tradicional arquivo /etc/network/interfaces . Por falta de uma solução melhor, adicionei uma série de comandos no arquivo de serviço systemd do OpenVPN. Isso criará a regra de ip e a rota antes que o OpenVPN seja iniciado: ExecStartPre=-/sbin/ip rule add fwmark 9 table 42 e ExecStartPre=-/sbin/ip route add default via 192.168.8.1 table 42 . Eu uso o sinal de menos - antes do caminho de comando para garantir que o servidor será iniciado mesmo se o comando falhar (no caso da regra ou rota já existir), consulte o página man systemd.service para obter mais informações.

Dica : Eu executo o servidor OpenVPN como um serviço systemd no meu computador, a melhor maneira de solucionar esse problema no meu caso foi aumentar o detalhamento do servidor OpenVPN no arquivo .conf para 6 e, em seguida, para usar journalctl -fu openvpn-server@<conf_file_name>.service para ver se a conexão pode ser estabelecida. Se a filtragem de caminho inverso não estiver desativada, você nem verá qualquer atividade quando os clientes tentarem se conectar. Depois de definir o rp_filter para 2 (etapa 1), pude ver alguma atividade, mas o handshake de TLS falharia. Depois que consegui redirecionar os pacotes do OpenVPN para o roteador (etapa 2-3), meus clientes puderam se conectar.

    
por 01.03.2018 / 03:01
0

Por que falha

Falha na tentativa 1 e Falha na tentativa 2 não funcionam, porque a cadeia do iptables é executada após a decisão de roteamento, veja o diagrama do iptables link .

Além disso, a tentativa falhada 2 usa uma abordagem incorreta para definir o usuário / grupo da instância do servidor vpn. Você precisa especificar o usuário ou grupo em /etc/openvpn/server.conf e não no arquivo da unidade systemd. Ou seja:

  1. Crie o usuário ou grupo adduser vpnserver
  2. Em seguida, adicione usuário ou grupo ao /etc/openvpn/server.conf %código%
  3. Verifique se o processo do servidor vpn é executado como esse usuário / grupo com user vpnserver

Solução

Você pode marcar pacotes de processos locais somente se os processos definirem uma opção de soquete . O OpenVPN suporta isso: link

Você pode marcar um pacote com a opção ps -A o pid,cmd,user,group|grep vpn em /etc/openvpn/server.conf e, em seguida, usar --mark value com ip rule add fwmark value table 42 .

A máquina C pode então se conectar ao servidor vpn B da máquina.

Alternativa

Como alternativa, você pode usar namespaces de netns para o servidor e cliente vpn e, em seguida, fazer uso das cadeias de iptables.

    
por 15.09.2017 / 12:45