Atualmente tenho minha configuração de malha assim:
Com a configuração do wireguard semelhante a esta em cada nó:
[Interface]
Address = 10.1.0.1/32
PrivateKey =
ListenPort = 5888
[Peer] # example public node [1-3]
PublicKey =
AllowedIPs = 10.1.0.2/32
Endpoint = X.X.X.X:5888
PersistentKeepalive = 25
[Peer] # example node behind cgnat [4-6]
PublicKey =
AllowedIPs = 10.1.0.51/32
PersistentKeepalive = 25
Isso me permite executar ping em todas as linhas verdes do gráfico acima. Mas não consigo executar ping em nenhum dos vermelhos entre os nós do CGNAT. Como posso?
TENTATIVA 1 (sem Node3
)
exemplo CGNAT ( Node4
)
[Interface] # NODE 4
Address = 10.3.0.3/32
PrivateKey =
[Peer] # NODE 1, 5 & 6
PublicKey =
AllowedIPs = 10.3.0.1/32,10.3.0.51/32,10.3.0.52/32
Endpoint = X.X.X.X:5888
PersistentKeepalive = 25
[Peer] # NODE 2
PublicKey =
AllowedIPs = 10.3.0.2/32
Endpoint = X.X.X.Y:5888
PersistentKeepalive = 25
exemplo Ponto final público ( Node1
)
[Interface] # NODE 1
Address = 10.3.0.1/32
PrivateKey =
ListenPort = 5888
[Peer] # NODE 5
PublicKey =
AllowedIPs = 10.3.0.51/32
PersistentKeepalive = 25
[Peer] # NODE 6
PublicKey =
AllowedIPs = 10.3.0.52/32
PersistentKeepalive = 25
[Peer] # NODE 2
PublicKey =
AllowedIPs = 10.3.0.2/32
Endpoint = X.X.X.Y:5888
PersistentKeepalive = 25
[Peer] # NODE 4
PublicKey =
AllowedIPs = 10.3.0.3/32
PersistentKeepalive = 25
Eu também corri em Node1
:
$ sysctl -w net.ipv4.ip_forward=1
$ sysctl -w net.ipv4.conf.maxnet.forwarding=1
onde maxnet
está meu nome wg.
Responder1
Se os nós 4,5,6 estiverem cada um atrás de seu próprioCGNAT, então, como sempre, eles não conseguem fazer a comunicação adequada entre eles. Eles precisam contar com os nós 1,2,3 para retransmitir o tráfego. Portanto, esses nós CGNAT exigirãoIPs permitidospara alguns pares públicos em suas configurações permitirem que outros nós CGNATs passem pelos nós públicos, e os nós públicos devem ser definidos como roteadores.
Exemplo para o nó 4 assumido como tendo endereço IP 10.1.0.51/32 e usando o nó 2 como nó de roteamento:
[Interface]
Address = 10.1.0.51/32
PrivateKey =
[Peer] # example public node 1
PublicKey =
AllowedIPs = 10.1.0.1/32
Endpoint = X.X.X.X:5888
PersistentKeepalive = 25
[Peer] # example public node 2
PublicKey =
AllowedIPs = 10.1.0.2/32,10.1.0.52/32,10.1.0.53/32
Endpoint = Y.Y.Y.Y:5888
PersistentKeepalive = 25
[Peer] # example public node 3
PublicKey =
AllowedIPs = 10.1.0.3/32
Endpoint = Z.Z.Z.Z:5888
PersistentKeepalive = 25
Espera-se que os endereços IP de outros nós CGNAT sejam roteados através do nó 2 e devem ser adicionados ao nó 2 desse ponto.IPs permitidos. Isso também deve adicioná-los automaticamente à tabela de roteamento.
O nó 2 agora também deve ser um roteador, pelo menos em sua interface WireGuard, que será tanto de entrada quanto de saída. No Linux isso seria feito, por exemplo, com (assumindo uma interfacewg0):
sysctl -w net.ipv4.conf.wg0.forwarding=1
Suas regras de firewall também devem permitir o tráfego encaminhado emwg0.
Observe que não há necessidade de definir os outros pares CGNAT nos nós CGNAT e, se definidos, elesNão devetêm endereços IP de outros nós CGNAT emIPs permitidos:
- eles não serão acessíveis diretamente e,
- se o mesmo endereço for definido emIPs permitidosele será excluído de cada definição anterior e somente o último par definido o terá. Comroteamento de criptografiaEndereço(s) IP <=> peer.
Os nós 5 e 6 devem ter configuração compatível (utilizando também o nó 2 como roteador). Você também pode imaginar ter:
- funções divididas onde 4 e 5 são roteados pelo nó 2, 4 e 6 pelo nó 3 e 5 e 6 pelo nó 1,
- ou ter vários endereços IP em diferentes blocos IP para que cada bloco possa ser roteado através de um nó de roteamento diferente,
- ou usando roteamento cebola com tráfego WireGuard dentro do tráfego WireGuard para que os nós de roteamento não possam decodificar o tráfego não destinado a eles,
- ou usando múltiplas interfaces WireGuard independentes (que não estão sujeitas à interação de criptografia entre si, mas apenas à tabela de roteamento),
- ou alguma combinação de opções anteriores,
[...]
Em todos os casos, para qualquer alteração de topologia, mesmo que seja devido a uma falha e não a uma alteração intencional, é necessária uma forma de sincronizar as alterações de configuração em todos os pares afetados e atualmente não há nenhuma ferramenta dedicada para fazer isso.
Para concluir, aqui está um blog ondeBGP(essa seria a ferramenta que faltava) é usada junto com o WireGuard, com vários endereços e também uma interface por nó peer com apenas esse peer definido para evitar o roteamento de criptografia. Provavelmente há algo a ser aprendido com isso, mas o assunto é muito avançado para mim.