Roteamento específico de aplicativo / interface

0

Eu tenho uma configuração de roteamento cuja intenção é rotear todo o tráfego através de um túnel ( utun3 ) em um cliente openvpn que então se conecta ao servidor openvpn ( 64.120.44.114 ) através da minha interface física ( en0 ). / p>

O que eu quero fazer é rotear certos aplicativos diretamente pela interface física ( en0 ) em vez de pelo túnel ( utun3 ). Atualmente, o par de roteamento 0/1 e 128.0/1 está forçando todo o tráfego da Internet pelo túnel.

O que eu imaginava é que, se eu enviasse tráfego para um endereço de Internet de um aplicativo que vincula seu endereço de saída na interface física (ou seja, 10.0.1.15 ), esse tráfego será encaminhado pelos% restantesdefault rota para a interface desse endereço ( en0 ). Infelizmente, o sistema operacional simplesmente falha em rotear esses pacotes:

$ ping 8.8.8.8          # or mtr 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: icmp_seq=0 ttl=55 time=40.835 ms

$ ping -b utun3 8.8.8.8 # or mtr -a 10.12.44.16 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: icmp_seq=0 ttl=55 time=42.036 ms

$ ping -b en0 8.8.8.8   # or mtr -a 10.0.1.15 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
ping: sendto: No route to host

Há algo que eu possa fazer para garantir que os pacotes enviados com um endereço de saída incompatível com a rota de substituição 0/1 , 128.0/1 usem a rota default compatível? Caso contrário, existe algum outro meio de configurar a tabela de roteamento que possa servir ao propósito de roteamento através de en0 para aplicativos específicos, mas roteamento através de utun3 "por padrão"? Se não houver esse método em relação ao roteamento, você poderá recomendar soluções de software para fazer roteamento específico de aplicativo ou ignorar a tabela de roteamento? Para o meu caso, o ideal é que o software seja executado no macOS.

Eu tenho as seguintes interfaces:

en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    ether 60:03:08:8b:96:88
    inet6 fe80::1c29:1e13:e8ba:fd3%en0 prefixlen 64 secured scopeid 0x5
    inet 10.0.1.15 netmask 0xffffff00 broadcast 10.0.1.255
    nd6 options=201<PERFORMNUD,DAD>
    media: autoselect
    status: active
utun3: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
    inet 10.12.44.16 --> 10.12.44.16 netmask 0xfffffc00

Eu tenho o seguinte na minha tabela de roteamento:

default            10.0.1.1           UGSc            0        0     en0
10.0.1.1           0:24:36:a0:86:a5   UHLWIir         4      106     en0
64.120.44.114/32   10.0.1.1           UGSc            1        0     en0

0/1                10.12.44.1         UGSc          101        2   utun3
128.0/1            10.12.44.1         UGSc           12        0   utun3
10.12.44/22        10.12.44.16        UGSc            1        0   utun3
10.12.44.16        10.12.44.16        UH              3      170   utun3
    
por lhunath 14.03.2018 / 17:54

1 resposta

0

O roteamento do Linux é muito versátil, e há muitas maneiras de fazer o que você quer. Mas você aumentará a complexidade da configuração (leia: será mais difícil solucionar problemas quando / se você tiver um problema)

A maneira mais fácil, na minha opinião, é usar uma regra para implementar o roteamento com base na origem dos pacotes. (Às vezes chamado de roteamento baseado em política, pelo cisco de qualquer maneira)

O Linux suporta várias tabelas de rotas e é fácil adicionar tabelas personalizadas (leia o manual iproute2)

Em seguida, ele suporta regras para direcionar a "pesquisa de rota" para diferentes tabelas com base na prioridade e nos critérios. O critério da regra pode ser o endereço de origem. Por padrão, existem 3 tabelas: local, principal e padrão. Você pode:

1-crie uma nova tabela, diga "direto"

    echo "100 direct" >> /etc/iproute2/rt_tables

2-adicione uma rota padrão para essa tabela via en0

    ip route add default dev en0 table direct

3 - adicione uma nova regra com, por exemplo, prioridade 1000 para usar a tabela direta para tráfego originado em 10.0.1.15

    ip rule add from 10.0.1.15 lookup direct

Agora, a questão é que o MacOS não é linux e acabei sabendo que o seu problema está no MacOS, no qual não sou muito versado. No entanto, parece factível. O MacOS atual vem com o PF, um firewall portado do OpenBSD aparentemente em sua versão 4.5. Este firewall é capaz de modificar o nível do kernel - o roteamento baseado em regras (além de fazer muitas outras coisas). Você especifica isso usando uma palavra-chave rota para nas regras. As regras geralmente são especificadas em âncoras que contêm partes de configuração. O PF vem desabilitado por padrão, então você precisará ativá-lo também. Você poderia:

1- Crie um novo arquivo de configuração de âncora /etc/pf.anchors/pbr.conf com:

     pass out on utun3 route-to (en0 10.0.1.1) from utun3 to any

que redirecionará o tráfego de saída através de utun3 para en0 se a origem for um endereço utun3.

2- Adicione esta âncora ao pf config editing /etc/pf.conf e coloque

    anchor "pbr.rules"
    load anchor "pbr.rules" from "/etc/pf.anchors/pbr.rules"

3- Habilite o PF de alguma forma, para fazer testes você pode usar pfctl -E e depois você pode usar pfctl -F all -f /etc/pf.conf para recarregue a configuração, se necessário.

Veja Execute o comando na inicialização / login (Mac OS X)

    
por 14.03.2018 / 21:36