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.