Eu executo um back-end na infraestrutura DO, chamo-o de siteYvi, que se conecta a um site de terceirosProv.através de um túnel IPsec, com esta configuração do libreswan:
conn prov-client
...
right=$YVI_IP
rightsourceip=10.31.3.1
rightsubnet=10.31.3.0/28
left=$PROV_IP
leftsubnet=10.70.0.36/28
Prov.tem um servidor em execução 10.70.0.37
e posso interagir com ele deYvi.
Meu problema é que estou configurando um ambiente de desenvolvimento local (uma caixa Ubuntu em outra rede) e cada vez que faço uma alteração, tenho que implantarYviporque só a partir daí posso acessar a API emProv.. Eu gostaria de evitar isso conectandoLocalparaYvie encaminhar esse tráfego paraProv.para poder acessar a API emProv.deLocale facilitar o desenvolvimento.
eu conectoLocalparaYvicomo um guerreiro da estrada com a seguinte configuração:
conn remote-dev-client
...
left=$YVI_IP
leftsubnet=10.31.3.0/28
right=%any
rightaddresspool=10.31.4.1-10.31.4.254
A conexão foi estabelecida com sucesso e deLocalEu posso 10.31.3.1
alcançarYvi. O que eu quero é 10.70.0.37
chegarProv.deLocal. A rota para a 10.70.0.36/28
rede não é adicionada automaticamente, então tentei definir algumas ip xfrm
regras ip route
manualmente emLocal:
# Outgoing
ip xfrm policy add dst 10.70.0.37 src 10.31.4.1 dir out tmpl src $LOCAL_IP dst $YVI_IP proto esp spi $SPI reqid $REQID mode tunnel priority 100000
# Incoming
ip xfrm policy add dst 10.31.4.1 src 10.70.0.37 dir fwd tmpl src $YVI_IP dst $LOCAL_IP proto esp reqid $REQID mode tunnel priority 100000
ip xfrm policy add dst 10.31.4.1 src 10.70.0.37 dir in tmpl src $YVI_IP dst $LOCAL_IP proto esp reqid $REQID mode tunnel priority 100000
ip route add table 220 src 10.31.4.1 10.70.0.37 via $LOCAL_IP dev $LOCAL_IF proto static
agora eu ip xfrm monitor
corroYvie então deLocalpingar 10.70.0.37
; Eu posso ver os pacotes chegandoYvi(do monitor xfrm emYvi), mas apenas a saída, não a resposta (como é visto se eu executar ping em 10.31.3.1, por exemplo), sugerindo queYviestá recebendo o tráfego, mas não o encaminhando paraProv.? Eu realmente não sei como interpretar isso.
Acho que tenho que adicionar rotasYvipara encaminhar o tráfego para oProv.API corretamente, mas adicionar regras semelhantes às acima não funcionou. Gostaria de receber ajuda para entender o que estou perdendo e o que estou fazendo de errado.
Sugestões para uma abordagem diferente também são bem-vindas, embora a única maneira de se conectarProv., que não controlo, é através de um túnel IPsec deYvi, que eu controlo.
Responder1
Consegui resolver isso com regras NAT do iptables. As ip xfrm
políticas não eram necessárias. Esta é uma pequena explicação do que fiz, para alguém que, como eu, não é especialista:
DeYviEstou atribuindo uma 10.31.4.0/24
sub-rede aos road warriors, então uma rota para essa rede é instalada automaticamente pelo daemon de chave (libreswan no meu caso), então adicionei regras NAT emYvi( /etc/ufw/before.rules
, já que estou usando o UFW, mas você pode conseguir o mesmo iptables
diretamente):
*nat
-F
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
# PRE
-A PREROUTING -s 10.31.4.0/24 -d 10.31.3.2 -j DNAT --to-destination 10.70.0.37
# POST
-A POSTROUTING -s 10.31.4.0/24 -d 10.70.0.37 -j SNAT --to-source 10.31.3.1
COMMIT
Diz ao *nat
iptables para aplicar as regras à tabela NAT e COMMIT
realmente salva as regras. O -F
existe apenas por conveniência, já que o UFW adiciona as regras, ufw enable
mas não as exclui, ufw disable
então você acaba com duplicatas, daí o sinalizador flush -F
.
A PREROUTING
regra se aplica a pacotes recebidos da sub-rede do road warrior destinados a 10.31.3.2
, e o que ela faz é alterar o endereço de destino para ser 10.70.0.37
em vez de 10.31.3.2
, atribuindo efetivamente esse endereço IP aoProv.servidor, da perspectiva dos guerreiros da estrada.
A POSTROUTING
regra se aplica a pacotes que chegam da sub-rede do road warrior prestes a sair 10.70.0.37
(ou seja, pacotes que acabaram de atingir a regra de pré-roteamento) e altera seu endereço de destino de um endereço 10.31.4.0/0
para 10.31.3.1
. Isso é necessário porque eu não controlo as rotas, o servidor ou qualquer coisa emProv., então seProv.recebe uma solicitação da 10.30.4.0/24
sub-rede, não saberia como responder. Mas ele sabe 10.31.3.1
.
E é isso! Agora eu posso alcançarProv.deLocalatravés daYvino 10.31.3.2
.