Gateway não NAT através do OpenVPN

1

Eu tenho vários servidores (B, C, ...) que estão em um lugar e uma máquina (A), que está atrás de um roteador doméstico antigo comum. Eu quero que todos eles possam se conectar uns aos outros. Parece-me que o OpenVPN é um ótimo lugar para começar aqui, então eu configurei um túnel (tun0) entre A e B pela internet. É assim que a situação se parece:

 10.8.0.4                 10.8.0.1
----------  10.8.0.0/24   ---------- 
|        |                |        | 
|   A   tun0 ----------- tun0  B   | 10.128.140.204 
|        |                |        | 
----------                -- eth1 -- 
                              |
                              | 10.128.0.0/16
                              |
                          -- eth1 --
                          |        |
                          |    C   | 10.128.13.224
                          |        |
                          ----------

Especificamente, eu preciso de A para poder alcançar C sob o endereço 10.128.13.224 e C para poder alcançar A sob o endereço 10.8.0.4. Isso significa que o NAT não funciona - a maioria dos recursos fala sobre configurar o NAT no B para que o A possa ver o C - e é aí que ele parece ser complicado.

Então é isso que estou tentando fazer agora:

  • diga A para usar 10.8.0.1 como gateway para 10.128.0.0/16
  • diga a B para usar 10.128.140.204 como gateway para 10.8.0.0/24
  • faça B agir como esse gateway

Tabela de roteamento em A:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         [home router]   0.0.0.0         UG    0      0        0 enp0s3
10.8.0.0        *               255.255.255.0   U     0      0        0 tun0
10.128.0.0      localhost       255.255.0.0     UG    0      0        0 tun0
[home ip]       *               255.255.255.0   U     0      0        0 enp0s3

A# ip route get 10.128.13.224
10.128.13.224 via 10.8.0.1 dev tun0  src 10.8.0.4
    cache

Parece ótimo. Tabela de roteamento em C:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    0      0        0 eth0
10.8.0.0        10.128.140.204  255.255.255.0   UG    0      0        0 eth1
10.13.0.0       *               255.255.0.0     U     0      0        0 eth0
10.128.0.0      *               255.255.0.0     U     0      0        0 eth1
[public IP]     *               255.255.255.0   U     0      0        0 eth0

C# ip route get 10.8.0.4
10.8.0.4 via 10.128.140.204 dev eth1  src 10.128.13.224
    cache

Ótimo. Ativar o encaminhamento de IP em B:

B# cat /proc/sys/net/ipv4/ip_forward
1

Eu acho que o padrão ACEITAR tudo regras no iptables também funcionaria, mas para uma boa medida, eu limitado para a cadeia FORWARD um pouco:

B# iptables -S
-P INPUT ACCEPT
-P FORWARD DROP
-P OUTPUT ACCEPT
-A FORWARD -s 10.128.0.0/16 -d 10.8.0.0/24 -i eth1 -o tun0 -j ACCEPT
-A FORWARD -s 10.8.0.0/24 -d 10.128.0.0/16 -i tun0 -o eth1 -j ACCEPT

Bem, eles não sabem. A# ping 10.128.41.180 não faz nada e nem C# ping 10.8.0.4 .

IF eu adiciono o NAT da seguinte forma:

B# iptables -t nat -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-A POSTROUTING -s 10.8.0.0/24 -d 10.128.0.0/16 -o eth1 -j MASQUERADE

então um ping de A para C funciona.

A# ping 10.128.13.224
PING 10.128.13.224 (10.128.13.224) 56(84) bytes of data.
64 bytes from 10.128.13.224: icmp_seq=1 ttl=63 time=120 ms
...

Isso não é o que eu quero fazer, mas acho que isso significa que alguma coisa está funcionando. Outra coisa curiosa é que se eu configurar o MASQUERADE ao contrário, um ping de C para A não não funcionará, então eu acho que poderia haver uma pista aqui.

Agora estou começando a me perguntar se o que quero fazer ainda pode ser feito ou se tenho algum mal-entendido básico sobre como funciona a rede. Isso é possível? Eu estou negligenciando algo básico? Eu apreciaria quaisquer dicas ou recursos.

    
por Tillerino 20.11.2016 / 18:14

1 resposta

1

Acontece que o acima irá funcionar lindamente em um ambiente regular. No entanto, os servidores ( B , C , ...) estavam em uma rede que não permite enviar pacotes que têm um endereço de origem que não corresponde ao endereço IP do remetente:

Ao efetuar o ping de C de A , A envia um pacote IP dentro de um quadro Ethernet sobre tun0 para B, que é aproximadamente assim:

----------------------------------------------------
| source: A's tun0 MAC | destination: B's tun0 MAC |
| -------------------------------------------------|
| | source: 10.8.0.4 | destination: 10.128.13.224 ||
| | payload: PING                                 ||
| -------------------------------------------------|
----------------------------------------------------

B , em seguida, verifica seu roteamento e envia o seguinte sobre eth1 :

----------------------------------------------------
| source: B's eth1 MAC | destination: C's eth1 MAC |
| -------------------------------------------------|
| | source: 10.8.0.4 | destination: 10.128.13.224 ||
| | payload: PING                                 ||
| -------------------------------------------------|
----------------------------------------------------

A rede inspeciona isso e descobre que o endereço de origem 10.8.0.4 não corresponde ao endereço eth1 B 10.128.140.204 e não transmite o quadro. É por isso que um gateway simples não funciona nesta rede.

    
por 21.11.2016 / 13:09