Roteie apenas pacotes de uma interface específica sobre VPN

1

Então eu tenho 3 interfaces em um host:

  • A interface 1 está voltada para a rede externa
  • interface 2 é a interface tun0 vpn
  • interface 3 a interface de rede local

Meu objetivo é rotear todo o tráfego da interface 3 (a rede local) pela interface vpn e todo o tráfego do host pela interface padrão1

# ip route
default via 192.168.1.1 dev eth0
10.8.8.0/24 dev tun0 proto kernel scope link src 10.8.8.27
128.0.0.0/1 via 10.8.8.1 dev tun0
192.168.0.0/24 dev eth2 proto kernel scope link src 192.168.0.1
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.56

(Eu li outros posts aqui, mas nenhum deles foi realmente útil)

    
por bit151 26.03.2018 / 18:44

2 respostas

1

Primeiro: a rota "meio-padrão" 128.0.0.0/1 (sem a outra metade 0.0.0.0/1 ??) não deve existir se o roteador não usar o túnel:

# ip route del 128.0.0.0/1 via 10.8.8.1 dev tun0

Como é mais provável que seja definido a partir do software do túnel, lide com sua configuração.

Agora crie uma nova tabela (escolha aleatória: 100) com uma rota padrão no túnel e use-a apenas para o tráfego da eth2:

# ip route add default via 10.8.8.1 dev tun0 table 100
# ip rule add iif eth2 lookup 100

Testes:

O host está usando a rota padrão usual, qualquer que seja seu IP de origem (conforme a pergunta, o seletor do túnel é da interface, não do IP):

# ip -o route get 8.8.8.8
8.8.8.8 via 192.168.1.1 dev eth0 src 192.168.1.56 \    cache
# ip -o route get 8.8.8.8 from 192.168.0.1
8.8.8.8 from 192.168.0.1 via 192.168.1.1 dev eth0 \    cache 

O tráfego da eth2 será tratado de maneira diferente:

# ip -o route get 8.8.8.8 from 192.168.0.2 iif eth2
8.8.8.8 from 192.168.0.2 via 10.8.8.1 dev tun0 table 100 \    cache  iif eth2

Se você também quiser que o IP 192.168.0.1 local atravesse o túnel. É um pouco mais complexo porque o 192.168.0.1 precisa enviar pacotes IP para sua própria LAN, se necessário (e não para tun0 neste caso). Requer a cópia da rota da LAN também para a tabela 100, adicionando uma regra baseada no IP de origem (e, em seguida, removendo a regra anterior inútil baseada na interface):

# ip route add 192.168.0.0/24 dev eth2 table 100
# ip rule add from 192.168.0.0/24 lookup 100
( # ip rule del iif eth2 lookup 100 )

O que agora também dá:

# ip -o route get 8.8.8.8 from 192.168.0.1
8.8.8.8 from 192.168.0.1 via 10.8.8.1 dev tun0 table 100 \    cache

É isso para roteamento. Note que, sem NAT, a outra extremidade do túnel precisa de uma rota para 192.168.0.0/24 via 10.8.8.27 ou não funcionará. Esta deve ser a escolha preferida.

Se esta rota no remoto não estiver definida, e o NAT estiver bom o suficiente, configure-o com:

# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o tun0 -j MASQUERADE
    
por 26.03.2018 / 23:29
0

Você não declarou explicitamente qual interface é qual, então vou assumir:

  • A interface 1 é eth0 (voltada para WAN)
  • A interface 2 é tun0 (túnel VPN)
  • A interface 3 é eth2 (LAN)

Você vai querer começar com um nome e uma ID da tabela de roteamento e anexá-lo ao arquivo de alias da tabela de roteamento (geralmente /etc/iproute2/rt_tables ) no formulário

TABLE_ID   TABLE_NAME

em que TABLE_ID é um número inteiro positivo não reservado, por exemplo 10.

Como você quer que todos os pacotes de eth2 sejam roteados através da VPN, você precisará adicionar uma rota padrão nesta tabela através da interface de túnel

ip route add default dev tun0 table TABLE_NAME

Você precisará então adicionar uma regra para usar esta tabela para pacotes de eth2

ip rule add iif eth2 table TABLE_NAME
    
por 26.03.2018 / 23:30