iptables redireciona o tráfego da interface VPN para a próxima interface

0

Você pode me ajudar com esse problema, por favor? Eu preciso redirecionar todo o tráfego da interface tun0 (túnel OpenVPN) para a interface eth1. eth1 é a rede interna por trás deste sistema que funciona como firewall especial ... Se eu usar essa regra (agora apenas para fins de teste - porta de destino 80):

iptables -t nat -A PREROUTING -i tun0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.199.115.146

o tráfego da VPN passa corretamente. Eu vejo isso na estatística do iptables (iptables -L -v), mas o tráfego reverso não passa. iptables mostra este erro:

99689.703349 x_tables: ip_tables: tcp match: only valid for protocol 6  

Preciso redirecionar todo o tráfego da máquina por trás do firewall apenas por meio da interface tun0. Eu também uso essa regra:

iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE   

Eu habilitei ip_forward . Se eu usar regra somente com -p tcp sem -m tcp , vejo na atividade estatística iptables na regra iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

interfaces

Servidor VPN (A):

eth0      Link encap:Ethernet  HWaddr 00:...
          inet addr:MY_PUBLIC_IP  Bcast:MY_PUBLIC_IP.255  Mask:255.255.255.0
          inet6 addr: .../64 Scope:Global
          inet6 addr: .../64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:41909528 errors:0 dropped:0 overruns:0 frame:0
          TX packets:373639 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:2150448064 (2.1 GB)  TX bytes:185713075 (185.7 MB)
          Interrupt:10

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:10.1.1.1  P-t-P:10.1.1.2  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:82014 errors:0 dropped:0 overruns:0 frame:0
          TX packets:164251 errors:0 dropped:24 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:5945388 (5.9 MB)  TX bytes:147587733 (147.5 MB)

na máquina de firewall:

eth0      Link encap:Ethernet  HWaddr 08:...
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:189399 errors:0 dropped:0 overruns:0 frame:0
          TX packets:103528 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:180399131 (180.3 MB)  TX bytes:14844868 (14.8 MB)


tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:10.1.1.2  P-t-P:10.1.1.1  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:153314 errors:0 dropped:0 overruns:0 frame:0
          TX packets:80986 errors:0 dropped:8 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:145341797 (145.3 MB)  TX bytes:5818996 (5.8 MB)

eth1      Link encap:Ethernet  HWaddr 08:...
          inet addr:10.199.115.1  Bcast:10.199.115.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6890 errors:0 dropped:0 overruns:0 frame:0
          TX packets:23022 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:710721 (710.7 KB)  TX bytes:43966879 (43.9 MB)

máquina B:

eth0      Link encap:Ethernet  HWaddr 08:...
          inet addr:10.199.115.146  Bcast:10.199.155.255  Mask:255.255.255.0
          inet6 addr: .../64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:24185 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8044 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:29645960 (28.2 MiB)  TX bytes:842414 (822.6 KiB)

Esquema:

VPN server (A) /eth0 - public IP, tun0 VPN/ <-> Firewall (F) /tun0 VPN, eth1 - internal network/ <-> Server (B) (eth0 - internal network)

A comunicação que é inicializada da máquina atrás do firewall funciona ok. Muito obrigado pela sua ajuda.

Tabelas de roteamento:

Servidor VPN A: - é servidor VPS

10.1.1.2 dev tun0  proto kernel  scope link  src 10.1.1.1
MY_PUBLIC_IP.0/24 dev eth0  proto kernel  scope link  src MY_PUBLIC_IP
10.199.115.0/24 via 10.1.1.2 dev tun0
default via MY_PUBLIC_IP.1 dev eth0  metric 100

/// um servidor físico

Firewall F: é a máquina virtual VirtualBox Ubuntu - eth0 é VirtualBox NAT, mas eu preciso usar tun0 e eth1 é rede local para B

0.0.0.0/1 via 10.1.1.1 dev tun0
default via 10.0.2.2 dev eth0  metric 100
10.0.2.0/24 dev eth0  proto kernel  scope link  src 10.0.2.15
10.1.1.1 dev tun0  proto kernel  scope link  src 10.1.1.2
10.199.115.0/24 dev eth1  proto kernel  scope link  src 10.199.115.1
MY_PUBLIC_IP via 10.0.2.2 dev eth0
128.0.0.0/1 via 10.1.1.1 dev tun0

Máquina B no lado eth1 (sem eth0) é uma máquina virtual Debian 7

default via 10.199.115.1 dev eth0 proto static
10.199.115.0/24 dev eth0 proto kernel scope link src 10.199.115.146

A rota dos pacotes deve ser o mais transparente possível, mesmo invisível ...

regras do iptables:

no servidor VPN (A):

apenas tabela NAT:

-P PREROUTING ACCEPT
-P POSTROUTING ACCEPT
-P OUTPUT ACCEPT
-A PREROUTING -i eth0 -p tcp -m tcp --dport 0:1192 -j DNAT --to-destination 10.1.1.2
-A PREROUTING -i eth0 -p tcp -m tcp --dport 1195:65535 -j DNAT --to-destination 10.1.1.2
-A PREROUTING -i eth0 -p udp -m udp --dport 0:1192 -j DNAT --to-destination 10.1.1.2
-A PREROUTING -i eth0 -p udp -m udp --dport 1195:65535 -j DNAT --to-destination 10.1.1.2
-A POSTROUTING -s 10.0.0.0/8 -o eth0 -j MASQUERADE

tabela FILTER

is empty 

tabela MANGLE

is empty

no firewall (F):

atualmente após a última modificação

Tabela NAT:

none

tabela FILTER

contains many specific rules for mitigation etc...  

tabela MANGLE

is empty

na máquina B

without iptables rules
    
por Mato 21.08.2014 / 23:01

1 resposta

1

O servidor A não possui uma rota sugerindo conectar-se à rede 10.199.115.0/24 através da VPN, portanto, usa sua rota padrão (ou seja, tente acessar B pelo seu IP público).

Tente ver se a execução

ip route add 10.199.115.0/24 via 10.1.1.2

no servidor A permitirá a conexão de A a B (sem qualquer regra NAT no firewall F)

Se isso funcionar, você pode configurar o openvpn para criar automaticamente a rota para você quando iniciar a conexão de A

Uma explicação do que acontece na sua configuração.

Aqui está como o roteamento / NAT acontece nos três casos

Caso 1: B pings PUBLIC_IP

  • O pacote sai de B usando a rota default , porque é o único que corresponde a PUBLIC_IP . Ele é enviado para ser roteado no endereço IP 10.199.115.1 , com o destino final PUBLIC_IP e o endereço de origem 10.199.115.146 .
  • O pacote é roteado por F. Muitas rotas se aplicam: a mais específica é PUBLIC_IP/32 , que envia o pacote a ser roteado na máquina 10.0.2.2 on eth0 , que eu acho que é a máquina A (a conexão openvpn subjacente).
  • A máquina A recebe o pacote e responde ao endereço de origem 10.199.115.146 . Sem a regra que mostrei, isso seria interpretado como um endereço na Internet e, portanto, a resposta seria enviada pela Internet.
  • usando a rota que propus, o pacote retorna através de tun0 para a máquina F. A Máquina F roteia isso de volta para eth1 , onde a máquina B recebe o pacote de resposta. No entanto, sua origem é marcada como 10.1.1.1 , portanto, não é reconhecida como a resposta ao pacote original. Ping falhou.

Caso 2: B pings 10.1.1.1

  • O mesmo que antes, o pacote deixa B para ser roteado por F
  • Desta vez, o destino corresponde à regra 10.1.1.1/32, portanto, o pacote é enviado por tun0
  • À medida que o pacote sai por tun0 , a regra MASQUERADE entra em ação, alterando a origem do pacote como 10.1.1.2 . (isso não é necessário se estiver usando a regra de rota que propus, veja abaixo).
  • A máquina A recebe o pacote e responde de volta a 10.1.1.2 (máquina F). Sem MASQUERADE , isso seria enviado de volta para 10.199.115.146 . Com a entrada da minha tabela de roteamento proposta, isso não mudaria muito, porque o pacote seria enviado para 10.1.1.2 para roteamento, no entanto, se você não tiver o destino 10.199.115.146 será roteado pela Internet.
  • O pacote de resposta é recebido pela máquina F. Se o mascaramento foi executado, o pacote é reconhecido como resposta e seu endereço de destino é alterado de volta para 10.199.115.146 . O pacote é encaminhado através de eth1 para o seu destino final.
  • A máquina B reconhece isso como o pacote de resposta. Ping bem sucedido.

Caso 3: Um pings 10.199.115.146

  • Sem minha regra proposta, o pacote original é enviado para a Internet e perdido. Caso contrário, ele será enviado para 10.1.1.2 para roteamento, com endereço de origem = 10.1.1.1 .
  • A máquina F recebe o pacote e o encaminha através de eth1 .
  • O pacote é recebido por B e uma resposta é enviada para 10.1.1.1 .
  • A resposta é encaminhada através de tun0 . A regra MASQUERADE altera o endereço de origem para 10.1.1.2 .
  • A máquina A recebe uma resposta de 10.1.1.2 , que não é o destino original, e a descarta como não relacionada. Ping falhou

Como você pode ver, há duas maneiras de conectar máquinas da rede interna à VPN:

  • Roteamento público: as duas redes conhecem o endereço IP da outra e têm entradas específicas na tabela de rotas para encontrá-las (como a que mostrei para você).
  • SNAT / MASQUERADE: Apenas uma rede sabe como alcançar a outra, e o firewall altera o endereço IP de origem dos pacotes de saída dessa rede para o IP do firewall (que é conhecido pela outra rede).

Não use os dois. Se você usar SNAT / MASQUERADE, as tabelas de roteamento em hosts externos não serão aplicáveis, porque o pacote proveniente da rede privada nunca utilizará o endereço original como origem.

Você pode escolher se a máquina A deve estar acessível a partir de B usando PUBLIC_IP ou 10.1.1.1 . Talvez seja possível configurar o firewall de tal forma que ambos funcionem, mas provavelmente não vale a pena o esforço.

    
por 26.08.2014 / 23:28