Encaminhando tráfego externo através de LAN

Encaminhando tráfego externo através de LAN

Estou tentando encaminhar o tráfego de rede por meio de uma VPN wireguard para uma VM em execução em outro host. Tudo isso preservando o endereço IP de origem original para obter proxy transparente. Ambos os servidores estão hospedados em datacenters diferentes. Esta é a minha configuração de rede:

Diagrama de rede

A rede é uma máquina "Proxy" que encaminha a rede usando DNAT:

iptables -t nat -A PREROUTING  -i eth0 -p tcp -m multiport --dport $ports -j DNAT --to 192.168.122.100
ip route add 192.168.122.100 dev wg1

Posso acessar o endereço IP da VM a partir da sessão ssh em uma máquina proxy consultando 192.168.122.100 diretamente. Se eu tentar acessar essas portas encaminhadas da rede externa consultando o endereço IP yyyy - o tráfego para na máquina Host, tabela nat/etapa PREROUTING.

TRACE do pacote que não foi entregue (zzzz seria meu endereço IP residencial). O rastreamento vem da máquina "Host":

raw:PREROUTING:policy:2 IN=wg1 OUT= MAC= SRC=z.z.z.z DST=192.168.122.100 LEN=60 TOS=0x00 PREC=0x00 TTL=55 ID=60652 DF PROTO=TCP SPT=34744 DPT=8080 SEQ=2330378731 ACK=0 WINDOW=29200 RES=0x00 CWR ECE SYN URGP=0 OPT 
mangle:PREROUTING:rule:1 IN=wg1 OUT= MAC= SRC=z.z.z.z DST=192.168.122.100 LEN=60 TOS=0x00 PREC=0x00 TTL=55 ID=60652 DF PROTO=TCP SPT=34744 DPT=8080 SEQ=2330378731 ACK=0 WINDOW=29200 RES=0x00 CWR ECE SYN URGP=0 OPT 
mangle:PREROUTING-CUSTOM-BACK:rule:1 IN=wg1 OUT= MAC= SRC=z.z.z.z DST=192.168.122.100 LEN=60 TOS=0x00 PREC=0x00 TTL=55 ID=60652 DF PROTO=TCP SPT=34744 DPT=8080 SEQ=2330378731 ACK=0 WINDOW=29200 RES=0x00 CWR ECE SYN URGP=0 OPT 
mangle:PREROUTING-CUSTOM-BACK:return:3 IN=wg1 OUT= MAC= SRC=z.z.z.z DST=192.168.122.100 LEN=60 TOS=0x00 PREC=0x00 TTL=55 ID=60652 DF PROTO=TCP SPT=34744 DPT=8080 SEQ=2330378731 ACK=0 WINDOW=29200 RES=0x00 CWR ECE SYN URGP=0 OPT 
mangle:PREROUTING:policy:2 IN=wg1 OUT= MAC= SRC=z.z.z.z DST=192.168.122.100 LEN=60 TOS=0x00 PREC=0x00 TTL=55 ID=60652 DF PROTO=TCP SPT=34744 DPT=8080 SEQ=2330378731 ACK=0 WINDOW=29200 RES=0x00 CWR ECE SYN URGP=0 OPT 
nat:PREROUTING:rule:1 IN=wg1 OUT= MAC= SRC=z.z.z.z DST=192.168.122.100 LEN=60 TOS=0x00 PREC=0x00 TTL=55 ID=60652 DF PROTO=TCP SPT=34744 DPT=8080 SEQ=2330378731 ACK=0 WINDOW=29200 RES=0x00 CWR ECE SYN URGP=0 OPT 
nat:PREROUTING-CUSTOM-FRONT:return:3 IN=wg1 OUT= MAC= SRC=z.z.z.z DST=192.168.122.100 LEN=60 TOS=0x00 PREC=0x00 TTL=55 ID=60652 DF PROTO=TCP SPT=34744 DPT=8080 SEQ=2330378731 ACK=0 WINDOW=29200 RES=0x00 CWR ECE SYN URGP=0 OPT 
nat:PREROUTING:policy:2 IN=wg1 OUT= MAC= SRC=z.z.z.z DST=192.168.122.100 LEN=60 TOS=0x00 PREC=0x00 TTL=55 ID=60652 DF PROTO=TCP SPT=34744 DPT=8080 SEQ=2330378731 ACK=0 WINDOW=29200 RES=0x00 CWR ECE SYN URGP=0 OPT 

nat:PREROUTING:policy:2executa ACCEPTa política padrão aqui.

Um rastreamento de pacote funcional (na máquina Host) quando tento acessar 192.168.122.100 diretamente:

raw:PREROUTING:policy:2 IN=wg1 OUT= MAC= SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=41 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
mangle:PREROUTING:rule:1 IN=wg1 OUT= MAC= SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=41 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT 
mangle:PREROUTING-CUSTOM-BACK:rule:1 IN=wg1 OUT= MAC= SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=41 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
mangle:PREROUTING-CUSTOM-BACK:return:3 IN=wg1 OUT= MAC= SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=41 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
mangle:PREROUTING:policy:2 IN=wg1 OUT= MAC= SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=41 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
nat:PREROUTING:rule:1 IN=wg1 OUT= MAC= SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=41 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
nat:PREROUTING-CUSTOM-FRONT:return:3 IN=wg1 OUT= MAC= SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=41 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
nat:PREROUTING:policy:2 IN=wg1 OUT= MAC= SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=41 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
mangle:FORWARD:policy:1 IN=wg1 OUT=virbr0 MAC= SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=40 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
filter:FORWARD:rule:1 IN=wg1 OUT=virbr0 MAC= SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=40 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
filter:FORWARD-CUSTOM-FRONT:rule:1 IN=wg1 OUT=virbr0 MAC= SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=40 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
mangle:POSTROUTING:policy:2 IN= OUT=virbr0 SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=40 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
nat:POSTROUTING:rule:1 IN= OUT=virbr0 SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=40 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
nat:POSTROUTING-CUSTOM-FRONT:return:1 IN= OUT=virbr0 SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=40 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT
nat:POSTROUTING:policy:7 IN= OUT=virbr0 SRC=10.1.0.101 DST=192.168.122.100 LEN=44 TOS=0x00 PREC=0x00 TTL=40 ID=36489 PROTO=TCP SPT=52189 DPT=8080 SEQ=1361865945 ACK=0 WINDOW=1024 RES=0x00 SYN URGP=0 OPT

Como você pode ver, nat:PREROUTING:policy:2ainda é executado e depois o pacote é roteado para uma VM. A única diferença é realmente o endereço IP de origem.


Minha pergunta é a seguinte: a pilha de rede Linux descarta pacotes que vêm do dispositivo de rede LAN, mas possuem endereço de origem não-lan? Existe alguma maneira de contornar isso e fazer com que os pacotes sejam roteados ainda mais?

Responder1

Acontece que a pilha de rede Linux realmente descartou esses pacotes e com um propósito muito bom. A pilha de rede faz algo chamado "Filtragem de caminho reverso". Os pacotes vindos do dispositivo de rede têm um IP de origem que não seria roteado pelo mesmo dispositivo e seria descartado. Em circunstâncias normais, esses pacotes não são válidos ou podem significar intenção maliciosa. No entanto, se você souber o que está fazendo, é possível desativar este comportamento:

echo 0 >/proc/sys/net/ipv4/conf/all/rp_filter   # blanket-disable for all interfaces
echo 1 >/proc/sys/net/ipv4/conf/eth0/rp_filter  # enable for external network device just to be safe

Agora os pacotes são encaminhados posteriormente e o proxy transparente pode ser alcançado.

informação relacionada